2011-01-06 16 views
7

Sto scrivendo un gioco di tessere isometriche. Ogni tessera è larga due volte quanto è alta (w: h = 2: 1). Tutte le tessere di una mappa hanno le stesse dimensioni e la loro larghezza e altezza sono note (TileWidth e TileHeight).Come calcolare l'altezza e la larghezza di un rettangolo/rettangolo isometrico

Ci può essere un numero qualsiasi di colonne (> 0) e righe (> 0).

Non riesco a trovare una formula per calcolare la larghezza e l'altezza della mappa completamente disegnata. Questa deve essere la distanza dalla cima al fondo e dall'estrema sinistra all'estrema destra. Poiché il numero di colonne e righe può variare (e quindi la mappa non è sempre un diamante perfetto) si sta rivelando molto difficile!

risposta

5

Bella domanda! C'è una risposta non troppo ovvia, ma è facile da calcolare:

Chiamiamo l'asse di riga "r" e l'asse di colonna "c", e consideriamo la prima immagine, dove l'estensione lungo l'asse r è 5 e l'estensione lungo l'asse c è 3.

L'incremento dell'unità lungo l'asse r, relativo al piano di disegno, è all'angolo +30 = (cos 30 °, sin 30 °) = (sqrt (3)/2 , 0,5) e l'incremento dell'unità lungo l'asse c è a -30 = (cos 30 °, -sin 30 °) = (sqrt (3)/2, -0,5).

È necessario considerare le due diagonali del rettangolo isometrico. Nella prima immagine, quelle diagonali sono D1 = [+ 5 * U lungo l'asse r e + 3 * U lungo l'asse c] e D2 = [+ 5 * U lungo l'asse r e -3 * U lungo l'asse c ], dove U è la lunghezza della piastrella nel piano isometrico. Quando viene trasformato nel piano di disegno, diventa D1 = ((5 + 3) * sqrt (3)/2 * U, (5-3)/2 * U) = (4 * sqrt (3) * U, 1 * U) e D2 = ((5-3) * sqrt (3)/2 * U, (5 + 3)/2 * U) = (sqrt (3) * U, 4 * U). La larghezza e l'altezza dello schermo, quindi, sono il massimo delle due estensioni = 4 * sqrt (3) * U, 4 * U.

Questo può essere generalizzato: se non ci sono N righe e colonne Nc e la lunghezza della tessera è U, l'estensione delle diagonali del rettangolo nel piano del disegno sono D1 = ((Nr + Nc) * sqrt (3)/2 * U, (Nr-Nc)/2 * U) e D2 = ((Nr-Nc) * sqrt (3)/2 * U, (Nr + Nc)/2 * U) e la larghezza dello schermo e l'altezza, quindi, sono:

W = U*(Nr+Nc)*sqrt(3)/2 
H = U*(Nr+Nc)/2 
0

Perché non usare le equazioni di rotazione come segue:

Supponiamo le tessere non vengono ruotate, in modo che i quattro angoli avranno le seguenti coordinate:

(0, 0, 0) 
(w, 0, 0) 
(0, h, 0) 
(w, h, 0) 

dove

w = Number of Columns * Tile Width 
h = Number of Rows * Tile Height 

Ora suppongo hai la matrice di proiezione, quindi dopo averlo applicato, ottieni le coordinate dello schermo 2D dei 4 punti 3D, e ciò che devi fare è questo:

  1. Ottieni la coordinata x minima di tutti i punti (dopo la proiezione).
  2. Ottieni la coordinata x massima di tutti i punti (dopo la proiezione).
  3. Ottieni la coordinata y minima di tutti i punti (dopo la proiezione).
  4. Ottieni la coordinata y massima di tutti i punti (dopo la proiezione).

Sottrai 1 da 2 e ottieni la larghezza e 3 da 4 per ottenere l'altezza.

Questo aiuto?

+1

proiezione isometrica non è una rotazione. –

+0

Ops, mi dispiace, ma questo non cambia la soluzione davvero. Piuttosto che usare la matrice di rotazione, può utilizzare la matrice di proiezione, quindi eseguire lo stesso calcolo. – Rafid

+0

Blimey. Questo è difficile. Penso che il mio angolo theta sia di 45 gradi ma non capisco le formule di matrice scritte nell'articolo di Wikipedia. Mi sento abbastanza stupido (il mio background non è matematica o informatica!). – Garry

0

Penso che si potrebbe fare questo con Pythagoras' theorem:

halfWidth = tileWidth/2; 
halfHeight = tileHeight/2; 
h = Math.sqrt((halfWidth * halfWidth) * (halfHeight * halfHeight)); 
rowLength = rowSize * h; 
colLength = colSize * h; 

miei la matematica non è grande, ma h dovrebbe essere la lunghezza di un lato di una piastrella in modo da poter poi moltiplicare per il numero di tessere.

+0

Questo funziona per calcolare la larghezza e l'altezza del rettangolo (e quindi l'ipotenusa del triangolo che biseca la mappa) ma non la larghezza della mappa. – Garry

2

Gli angoli della proiezione isometrica sono 60 e 30 gradi. La larghezza e l'altezza effettiva di una piastrella saranno:

Wiso = TileWidth * Cos(30) + TileHeight * Cos(60)
Hiso = TileWidth * Sin(30) + TileHeight * Sin(60)

Ora è possibile aggiungere moltiplicare questi numeri per il numero di tessere per riga e di colonna per ottenere dimensioni della griglia.

EDIT: guardando le immagini, sembra che la proiezione non è isometrica (almeno non quello che ho imparato a scuola), e gli angoli sono 60deg per entrambe le parti, in modo da sostituire il Cos(60) con Cos(30) e la Sin(60) con Sin(30)

Un altro modo di vedere le cose:

Wgrid = TileWidth * Cos(30) * Ncols + TileHeight * Cos(30) * Nrows
Hgrid = TileWidth * Sin(30) * Ncols + TileHeight * Sin(30) * Nrows

+0

Grazie. Non sono rigorosamente isometrici - sono dimetrici (due volte più larghi dell'altezza). – Garry

0

Se si avvia in fondo e camminare lungo la sinistra, si sposta su metà dell'altezza tegola per ogni colonna, quindi la metà dell'altezza per ogni riga. Allo stesso modo se si inizia a sinistra e si cammina lungo il bordo inferiore, si sposta la metà della larghezza della piastrella per ogni colonna, quindi la metà della larghezza per ogni riga.

Così la larghezza del riquadro asse allineato per la mappa è (rows+columns)*TileWidth/2 e l'altezza è (rows+columns)*TileHeight/2