Saya menggambar peta isometrik dengan ubin 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);
}
Gambar, menggambarkan kode ini:
Para profesional yang terhormat, tolong, bantu dengan rumus transformasi koordinat mouse dalam indeks isometrik sel. Contoh: (105; 100) -> [1; 4].
mathematics
algorithm
isometric
Alexan-Dwer
sumber
sumber
while(val = arr[i++])
atau konstruksi serupa, jangan gunakan itu . Gunakan++a
dan++b
sebagai gantinya.Jawaban:
Anda perlu menentukan matriks transformasi dari koordinat ruang-ubin ke koordinat ruang-layar, kemudian menghitung matriks terbalik untuk ini, yang bila diterapkan pada koordinat ruang-ruang mengubahnya menjadi ruang-ruang.
Kasus khusus
Apa yang pada dasarnya Anda lakukan untuk mengubah koordinat ubin-ruang (a, b) menjadi koordinat layar-ruang (x, y) adalah menjalankannya melalui matriks transformasi berikut:
Definisi: a dan b untuk ubin (0, 0) berada dalam kisaran [0.0, 1.0) dengan (0.0, 0.0) sebagai sudut atas, (1.0, 1.0) sudut bawah, (0.0, 1.0) sudut kiri dan (1.0, 0.0) sudut kanan di ruang layar.
Kami memperluas definisi koordinat dengan koordinat ketiga yang konstan (selalu tepat 1) untuk dapat memasukkan terjemahan ke dalam matriks.
Sekarang Anda dapat membuat matriks terbalik untuk transformasi ini. Rumus dasarnya adalah:
... dengan C menjadi matriks kofaktor untuk A .
Dalam kasus Anda, penentu | A | selalu 1024, tidak peduli offset, sehingga matriks invers adalah:
Contoh perhitungan
Sekarang, untuk data contoh Anda ...
Masukkan nomor Anda untuk offset dalam rumus, dan Anda mendapatkan:
Mengalikan (105, 100, 1) (koordinat layar) dengan matriks memberi Anda:
Karena koordinat ketiga selalu 1, kita tidak perlu menghitungnya. Membulatkan ke seluruh nomor terdekat, dan Anda mendapatkan (1, 4) sebagai koordinat ruang ubin Anda, seperti yang diharapkan.
Matriks proyeksi dimetrik umum
Jika Anda memiliki perspektif seperti ini dengan setiap ubin memiliki lebar 2 w (64 dalam contoh, jadi w = 32) dan tinggi 2 jam (32 dalam contoh, jadi h = 16), dan offset titik asal dalam ruang layar menjadi f x dan f y untuk masing-masing sumbu horizontal dan vertikal (192 dan 0 dalam contoh), matriks terlihat seperti berikut.
Ubin ruang ke ruang layar
Ruang layar ke ruang ubin
sumber