5

Ich brauche Hilfe bei der Erstellung einer spezialisierten Linie Kollisionsalgorithmus, der "Schneiden Ecken" in bestimmten Winkeln ermöglicht.Tricky Line Algorithmus für ein Spiel (Sprache agnostic)

In den folgenden Bildern soll das blaue Quadrat den Spieler und das schwarze Quadrat eine Wand darstellen. Die weißen Quadrate, dann stellen Quadrate in einem „Sichtlinie“ des Spielers (gültig Quadrate) und die grauen Quadrate sind Quadrate außerhalb eines Spielers „line of sight“ (ungültige Plätze):

img1

Der zweite Bild ist, wo die Dinge noch interessanter zu bekommen, wie wir Schneidecken beginnen:

img2

Lassen Sie uns einen genaueren Blick auf diese Linie, die trotz vorbei über die Ecke der Wand erlaubt ist:

img3

Die Linie ist erlaubt, weil:

  • dx < = 0,5 (mit quadratischem wobei 1x1)
  • dx/dy über einem bestimmten Verhältnis (etwa 2 - I ist nicht sicher, in diesen Bildern dargestellt genauen Wertes des)

die Umkehrung Linie ist nicht erlaubt, weil das Verhältnis (von dy/dx in diesem Fall) zu niedrig ist.

img4

Oder vielleicht über den Eintrittswinkel vs Ausstieg aus dem Platz ....

Das Hauptproblem ich habe ist, reden, dass ich nicht herausfinden kann, ich sollte wie Verallgemeinerung einer Lösung für Vektoren, die sich in einem beliebigen Winkel zwischen zwei Punkten auf dem Gitter bewegen. Ich kann nicht entscheiden, ob ich Trigonometrie oder was verwenden soll. Meine bisher beste Lösung bestand darin, die Dezimalteile der Zeilenabfangungen mit jedem Quadrat als dx und dy zu verwenden und zu überprüfen, ob dies auf der Steigung der Linie und in welchem ​​Quadranten zulässig ist.

Kann jemand helfen?

Ich habe mir auch das Ausleihen oder Starten von anderen Linienalgorithmen angeschaut, aber ich habe nichts zu brauchbares gefunden. Die meisten von denen, die ich gesehen habe, wollen, dass eine Linie von (x1, y1) bis (x2, y2) die gleiche ist wie von (x2, y2) bis (x1, y1), was dieses Problem ziemlich anders macht.

+0

Ich nehme an, Sie können viele Wände haben, und sie sind nicht immer an die Position des Spielers angrenzend? Kannst du deinen aktuellen Algorithmus posten (zumindest Pseudocode)? – Groo

+5

Mein erster Gedanke ist, wie nahe die Linie in die Mitte des Platzes kommt. Aber in Ihrem zweiten Beispiel macht es für mich keinen Sinn, dass dieser Prozess nicht symmetrisch ist: Ich kann Sie sehen, aber Sie können mich nicht sehen? – Teepeemm

+0

Genau, Teepeem: Eine Linie von Punkt A nach B ist normalerweise nicht die gleiche wie von Punkt B nach A, wenn dx! = Dy! = 0. Ich werde sehen, ob ich ein Pseudocode-Beispiel bekommen kann. –

Antwort

1

Ich schlage vor, Kreise zu verwenden, sie sind in der Ecke ziemlich optimal.

Ich nehme an, dass Koordinaten in der Mitte jedes Pixels genommen werden.

Der Algorithmus für zu wissen, ob (xo, yo) aus der Sicht versteckt (xa, ya) bis (xb, yb) wäre dann:

  • Compute (xc, yc) der nächste Punkt zu (xo, yo) auf der Linie von (xa, ya) bis (xb, yb)
  • compute Abstand d von (xo, yo) bis (Xc, Yc)
  • wenn < Hälfte d ein pixel, dann wird dem view is hidden

Sie können die ersten beiden Stufen vereinfachen, indem Sie direkt die Abstand zwischen Punkt und Linie http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line und schließlich berechnen Quadrat Entfernung, wenn Sie sqrt vermeiden wollen

+0

Dies ermöglicht das Schneiden von Ecken, aber es berücksichtigt nicht die Tatsache, dass (xa, ya) zu (xb, yb) erlaubt sein darf, aber (xb, yb) zu (xa, ya) nicht erlaubt, dass Ecken nur geschnitten werden können, wenn sie unterhalb eines bestimmten Winkels eintreten. –