Wie konvertiere ich Mauskoordinaten in isometrische Indizes?

21

Ich zeichne eine isometrische Karte mit der Kachel 64x32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

Bild, das diesen Code illustriert:

Bild, das diesen Code illustriert:

Sehr geehrte Fachleute, bitte helfen Sie mit einer Formel zur Transformation von Mauskoordinaten in isometrische Indizes einer Zelle. Beispiel: (105; 100) -> [1; 4].

Alexan-Dwer
quelle
Randnotiz: Wenn Sie nicht auf den vorherigen Wert einer Variablen zugreifen möchten , die Sie inkrementieren, wie in while(val = arr[i++])oder ähnlichen Konstruktionen, verwenden Sie ihn nicht . Verwenden Sie stattdessen ++aund ++b.
Martin Sojka

Antworten:

25

Sie müssen die Transformationsmatrix von Kachelraumkoordinaten zu Bildschirmraumkoordinaten bestimmen und dann die inverse Matrix dafür berechnen , die sie bei Anwendung auf Bildschirmraumkoordinaten in Kachelraumkoordinaten umwandelt.

Übrigens: Ihr Versatz zeigt tatsächlich auf eine Stelle, die sich in einem vernünftigen Koordinatensystem (0,0, 1,0) befinden würde, aber das ist kein großes Problem, nur etwas, das Sie beachten sollten. Dies bedeutet, dass der Versatz des Ursprungs Ihres transformierten Koordinatensystems bei (Versatz + 32, 0) liegt.


Sonderfall

Um die Kachelraumkoordinaten (a, b) in Bildschirmraumkoordinaten (x, y) umzuwandeln, müssen Sie im Grunde die folgende Transformationsmatrix durchlaufen:

Bildbeschreibung hier eingeben

Definitionen: a und b für die Kachel (0, 0) liegen im Bereich [0.0, 1.0), wobei (0.0, 0.0) die obere Ecke, (1.0, 1.0) die untere Ecke, (0.0, 1.0) die linke Ecke ist und (1.0, 0.0) die rechte Ecke im Bildschirmbereich.

Wir erweitern die Koordinatendefinitionen um eine konstante dritte Koordinate (es ist immer genau 1), um die Translation in die Matrix integrieren zu können.

Jetzt können Sie die inverse Matrix für diese Transformation erstellen . Die Grundformel lautet:

Bildbeschreibung hier eingeben

... wobei C die Matrix der Cofaktoren für A ist .

In Ihrem Fall ist die Determinante | A | ist immer 1024, unabhängig vom Offset. Die inverse Matrix lautet also:

Bildbeschreibung hier eingeben


Beispielrechnung

Nun zu Ihren Beispieldaten ...

Geben Sie Ihre Zahl für den Versatz in die Formel ein und Sie erhalten:

Bildbeschreibung hier eingeben

Durch Multiplizieren (105, 100, 1) (der Bildschirmkoordinaten) mit der Matrix erhalten Sie:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Da die dritte Koordinate immer 1 ist, müssen wir sie nicht berechnen. Wenn Sie auf die nächste ganze Zahl abrunden, erhalten Sie wie erwartet (1, 4) als Kachelkoordinaten.


Allgemeine dimetrische Projektionsmatrizen

Wenn Sie eine Perspektive wie diese haben, bei der jede Kachel 2 W in der Breite (64 im Beispiel, also w = 32) und 2 H in der Höhe (32 im Beispiel, also h = 16) und der Versatz des Ursprungspunkts ist Wenn der Bildschirmraum f x und f y für die horizontale bzw. vertikale Achse ist (192 und 0 im Beispiel), sehen die Matrizen wie folgt aus.

Kacheln Sie den Platz auf dem Bildschirm

Bildbeschreibung hier eingeben

Platz auf dem Bildschirm, um Platz zu kacheln

Bildbeschreibung hier eingeben

Martin Sojka
quelle