Jak przekonwertować współrzędne myszy na indeksy izometryczne?

21

Rysuję mapę izometryczną z kafelkiem 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);
  }

Zdjęcie ilustrujące ten kod:

Zdjęcie ilustrujące ten kod:

Drodzy profesjonaliści, proszę o pomoc w formule transformacji współrzędnych myszy w indeksach izometrycznych komórki. Przykład: (105; 100) -> [1; 4].

Alexan-Dwer
źródło
możliwy duplikat renderowania i pobierania izometrycznego?
bummzack
Uwaga dodatkowa: Jeśli tak naprawdę nie chcesz uzyskać dostępu do poprzedniej wartości zmiennej, którą zwiększasz, jak w while(val = arr[i++])podobnych konstrukcjach, nie używaj jej . Użyj ++ai ++bzamiast.
Martin Sojka,

Odpowiedzi:

25

Musisz określić macierz transformacji ze współrzędnych przestrzeni kafelkowej na współrzędne przestrzeni ekranowej, a następnie obliczyć macierz odwrotną , która zastosowana do współrzędnych przestrzeni ekranowej przekształca je we współrzędne przestrzeni kafelkowej.

Nawiasem mówiąc: Twoje przesunięcie faktycznie wskazuje miejsce, które byłoby (0,0, 1,0) w dowolnym zdrowym układzie współrzędnych, ale to nie jest duży problem, tylko coś, o czym należy pamiętać. Oznacza to, że przesunięcie początku przekształconego układu współrzędnych ma wartość (Przesunięcie + 32, 0).


Przypadek szczególny

Aby przekształcić współrzędne przestrzeni kafelkowej (a, b) na współrzędne przestrzeni ekranowej (x, y), wystarczy uruchomić ją przez następującą macierz transformacji:

wprowadź opis zdjęcia tutaj

Definicje: i b dla płytek (0, 0), mieszczą się w przedziale [0,0; 1,0), z (0.0, 0.0) stanowiącym górny róg (1.0, 1.0), w dolnym rogu (0.0, 1.0), w lewym rogu i (1.0, 0.0) prawy róg w przestrzeni ekranu.

Rozszerzamy definicje współrzędnych o stałą trzecią współrzędną (zawsze dokładnie 1), aby móc włączyć tłumaczenie do macierzy.

Teraz możesz utworzyć macierz odwrotną dla tej transformacji. Podstawowa formuła to:

wprowadź opis zdjęcia tutaj

... Z C będąc macierz kofaktorów na A .

W twoim przypadku wyznacznik | A | jest zawsze 1024, bez względu na przesunięcie, więc macierz odwrotna to:

wprowadź opis zdjęcia tutaj


Przykładowe obliczenia

Teraz dla przykładowych danych ...

Wprowadź swój numer do przesunięcia we wzorze, a otrzymasz:

wprowadź opis zdjęcia tutaj

Mnożenie (105, 100, 1) (współrzędne ekranu) przez macierz daje:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Ponieważ trzecia współrzędna to zawsze 1, nie musimy jej obliczać. Zaokrąglij w dół do najbliższej liczby całkowitej, a otrzymasz (1, 4) jako współrzędne przestrzeni kafelków, zgodnie z oczekiwaniami.


Ogólne matryce projekcji dimetrycznej

Jeśli perspektywiczny tak ze sobą płytek wynosi 2 W szerokość (64, na przykład tak, W = 32) 2 h w wysokości (32, na przykład tak, H = 16), a przesunięcie punktu początkowego na powierzchni ekranu jest f x f y do poziomej i pionowej osi (odpowiednio 192 i 0 w tym przykładzie), macierze wygląda następująco.

Umieść kafelki na ekranie

wprowadź opis zdjęcia tutaj

Miejsce na ekranie na miejsce na kafelkach

wprowadź opis zdjęcia tutaj

Martin Sojka
źródło