Bagaimana cara mengubah koordinat mouse ke indeks isometrik?

21

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:

Gambar, menggambarkan kode ini:

Para profesional yang terhormat, tolong, bantu dengan rumus transformasi koordinat mouse dalam indeks isometrik sel. Contoh: (105; 100) -> [1; 4].

Alexan-Dwer
sumber
kemungkinan duplikat render dan pengambilan Isometrik?
bummzack
Catatan: Jika Anda tidak benar - benar ingin mengakses nilai variabel sebelumnya yang Anda tambahkan, seperti dalam while(val = arr[i++])atau konstruksi serupa, jangan gunakan itu . Gunakan ++adan ++bsebagai gantinya.
Martin Sojka

Jawaban:

25

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.

Ngomong-ngomong: Offset Anda sebenarnya menunjuk ke suatu tempat yang akan (0,0, 1,0) dalam sistem koordinat waras, tetapi itu bukan masalah besar, hanya sesuatu yang perlu diingat. Ini berarti bahwa offset asal dari sistem koordinat yang Anda transformasikan adalah di (Offset + 32, 0).


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:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

... dengan C menjadi matriks kofaktor untuk A .

Dalam kasus Anda, penentu | A | selalu 1024, tidak peduli offset, sehingga matriks invers adalah:

masukkan deskripsi gambar di sini


Contoh perhitungan

Sekarang, untuk data contoh Anda ...

Masukkan nomor Anda untuk offset dalam rumus, dan Anda mendapatkan:

masukkan deskripsi gambar di sini

Mengalikan (105, 100, 1) (koordinat layar) dengan matriks memberi Anda:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Ruang layar ke ruang ubin

masukkan deskripsi gambar di sini

Martin Sojka
sumber