In einem Triangulated isometrischen Gitter, was Dreieck ist ein gegebener Punkt in?

stimmen
5

Ich habe eine triangulierte isometrische Gitter, wie folgt aus: Alt-Text

In meinem Code sind Dreiecke durch Spalten gruppiert.

Als ich die Maus bewegen, möchte ich berechnen, was Dreieck die Mauskoordinaten sind in. Gibt es einen einfachen Algorithmus, das zu tun?

Veröffentlicht am 15/02/2010 um 05:20
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
4

Was Sie wollen, ist dies so viel wie möglich in ein Raster tun drehen, weil Gitter viel einfacher zu handhaben sind.

Das erste, was Sie tun, ist herauszufinden, welche Spalte es ist in. Sie sagen, Sie speichern, dass so sollte es eine einfache Integer-Division, indem Sie auf die x-Koordinate durch die Spaltenbreite durch die Box Start Offset einfacher sein. Einfach.

Danach wollen Sie herausfinden, welches Dreieck es in (natürlich). Wie man teilweise das wiederum in ein Raster ist, dass Sie behaupten, dass Sie einen Stapel von rechtwinkligen Dreiecken statt einen Stapel von isometrischen Dreiecken haben.

Die Dreiecke haben eine Länge entlang der y-Achse (die Seite der Säule). Teilen Sie diese Zahl in zwei und herausfinden, wie viele Stufen hinunter Sie sind. Basierend auf der Anzahl von Schritten nach unten und wenn die Spalte gerade oder ungerade ist, wird Ihnen sagen, wenn Sie sich bei:

+--------+
|-_      |
|  -_    |
|    -_  |
|      -_|
+--------+

oder umgekehrt. An diesem Punkt müssen Sie nur die Seite der Linie zu bestimmen, ist es auf bestimmen, welche rechtwinkliges Dreieck es in ist, was sagt Ihnen auch, welche isometrische Dreieck es ist in.

Sie haben ein paar Möglichkeiten.

  1. Man könnte so etwas wie Bresenham-Algorithmus verwenden, um die Hypotenuse zu rastern und wenn Sie die Spalte getroffen sind Sie in der Arbeit, wenn Sie oberhalb oder unterhalb dieser Linie sind;
  2. Da Sie nur hier zwei mögliche Gitter haben (eine die Umkehrung der anderen ist, so ist es wirklich nur eine). Sie könnten eine Reihe von Zeilenwerten speichern, zu sagen, dass für die Spalte 3 die Hypotenuse bei 2 versetzt, während für 6 bei 4 ist und so weiter.

Man könnte sogar (1) verwenden, um (2) als schnelles Nachschlagen zu erzeugen.

Die einzige andere Sache zu prüfen ist, was passiert, wenn der Mauszeiger auf einer Kante ist?

Beantwortet am 15/02/2010 um 05:32
quelle vom benutzer

stimmen
3

Dies ist ähnlich zu dem, was cletus gesagt, aber eine andere Art und Weise, es zu betrachten nehme ich an.

Ich gehe davon aus dem Dreieck Seite 1 ist.

Angenommen, Sie haben das Netz wie folgt:

       y'
      /
     /__/__/__/__/__/__/
    /__/__/__/__/__/__/
   /__/__/__/__/__/__/____ x'
(0,0)

Wenn Sie das Gitter in einem Koordinatensystem betrachten, in dem die x und y-Achsen in einem Winkel von 60 Grad sind, ist ein Punkt, deren Koordinaten in dem abgewinkelten System (x ‚y‘) wird auf das Koordinaten entspricht in dem orthogonales System (mit gleichem Ursprung einer allgemeine Richtung der Achsen) bis (x, y).

In Ihrem Problem, Sie sind gegeben (x, y), müssen wir (x 'y') und dann herauszufinden, das Dreieck finden.

Wenn i der Einheitsvektor entlang der x und j die orthogonal entlang y ist, dann haben wir, dass

x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.

(Grundsätzlich ist der Einheitsvektor entlang der Achse ‚angewinkelt‘ y i / 2 + sqrt (3) / 2 * j. Der Einheitsvektor entlang der x-Achse ist das gleiche wie die normalen x-Achse, dh i).

So

x' + y'/2 = x
y' * sqrt(3)/2 = y

Solving gibt:

y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)

Nehmen wir für jetzt, dass x ‚und y‘ sind positiv.

Nun, wenn c = [x '], der ganzzahlige Teil von x'

und r = [y ‚] den ganzzahligen Teil von y‘

dann in den (Winkel-) Gittern, liegt der Punkt in der Spalte und die Cth rth Reihe. (Counting rechts und nach oben und beginnen bei 0 zu zählen).

So haben verengen wir Ihren Punkt zu einem Parallelogramm unten

       ____
      /\ * /   
     /___\/
   (c,r)

Nun, um herauszufinden, welches Dreieck ist es in Sie die Bruchteile von x betrachten können ‚und y‘.

{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.

Jetzt,

wenn {x} + {y} > 1, dann liegt der Punkt im Dreieck mit * gekennzeichnet. wenn {x} + {y} < 1, dann liegt der Punkt in dem anderen Dreieck. wenn {x} + {y} = 1, dann liegt der Punkt auf der Linie gemeinsam mit den beiden Dreiecken.

zu hoffen, das hilft.

Beantwortet am 15/02/2010 um 09:45
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more