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:
Drodzy profesjonaliści, proszę o pomoc w formule transformacji współrzędnych myszy w indeksach izometrycznych komórki. Przykład: (105; 100) -> [1; 4].
mathematics
algorithm
isometric
Alexan-Dwer
źródło
źródło
while(val = arr[i++])
podobnych konstrukcjach, nie używaj jej . Użyj++a
i++b
zamiast.Odpowiedzi:
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.
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:
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:
... 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:
Przykładowe obliczenia
Teraz dla przykładowych danych ...
Wprowadź swój numer do przesunięcia we wzorze, a otrzymasz:
Mnożenie (105, 100, 1) (współrzędne ekranu) przez macierz daje:
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
Miejsce na ekranie na miejsce na kafelkach
źródło