Fare koordinatlarını izometrik dizinlere nasıl dönüştürebilirim?


21

Karo 64x32 ile izometrik harita çizerim :

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);
  }

Bu kodu gösteren resim:

Bu kodu gösteren resim:

Sevgili uzmanlar, lütfen, bir hücrenin izometrik indekslerinde fare koordinatlarının dönüşüm formülüne yardım edin. Örnek: (105; 100) -> [1; 4].



Yan not: Artırmakta olduğunuz bir değişkenin önceki değerine gerçekten erişmek istemiyorsanız , while(val = arr[i++])inşaatlarda veya benzer yapımlarda olduğu gibi kullanmayın . Kullan ++ave ++byerine.
Martin Sojka,

Yanıtlar:


25

Sen gerek dönüşüm matrisi belirlemek sonra, ekran-uzay koordinatlarına kiremit uzay koordinatlarından ters matris hesaplamak karo-uzay olanlara ekran uzay koordinatları dönüşümleri onları uygulandığında bu, hangi için.

Bu arada: Ofsetiniz aslında herhangi bir aklı başında koordinat sisteminde (0.0, 1.0) olabilecek bir yeri işaret ediyor, ama bu büyük bir problem değil, akılda tutulması gereken bir şey. Bu, dönüştürülmüş koordinat sisteminizin başlangıç ​​noktasının kayması (Offset + 32, 0) olduğu anlamına gelir.


Özel durum

Temel olarak fayans-uzay (a, b) koordinatlarını ekran-uzay (x, y) koordinatlarına dönüştürmek için yaptığınız şey, aşağıdaki dönüşüm matrisini çalıştırmaktır:

görüntü tanımını buraya girin

Tanımlar: kiremit için a ve b (0, 0) [0.0, 1.0) aralığındadır (0.0, 0.0) üst köşe, (1.0, 1.0) alt köşe, (0.0, 1.0) sol köşe ve (1.0, 0.0) ekran alanında sağ köşesi.

Çeviriyi matrise dahil edebilmek için koordinat tanımlarını sabit bir üçüncü koordinatla (her zaman tam olarak 1'dir) genişletiriz.

Şimdi bu dönüşüm için ters matris oluşturabilirsiniz . Temel formül:

görüntü tanımını buraya girin

... C , A için kofaktörlerin matrisidir .

Senin durumunda, determinant | A | ofset ne olursa olsun, her zaman 1024'tür, yani ters matris:

görüntü tanımını buraya girin


Örnek hesaplama

Şimdi, örnek verileriniz için ...

Ofset için numaranızı formüle koyun ve şunu elde edin:

görüntü tanımını buraya girin

Matris ile çarpma (105, 100, 1) (ekran koordinatları):

görüntü tanımını buraya girin görüntü tanımını buraya girin

Üçüncü koordinat her zaman 1 olduğundan, hesaplamak zorunda değiliz. En yakın tam sayıya yuvarlayın ve beklendiği gibi, karo alanı koordinatlarınız (1, 4) alırsınız.


Genel dimetrik izdüşüm matrisleri

Böyle bir perspektifiniz varsa, her döşemenin genişliği 2 w (örnekte 64, yani w = 32) ve 2 saat yükseklikte (örnekte 32, h = 16) ve başlangıç ​​noktasının kayması sırasıyla yatay ve dikey eksen için f x ve f y olan ekran alanında (örnekte 192 ve 0), matrisler aşağıdaki gibi görünür.

Ekran alanına alan döşemek

görüntü tanımını buraya girin

Döşeme alanı için ekran boşluğu

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.