2010-02-15 7 views
5

Ho una griglia isometrica Triangulated, in questo modo: alt textIn una griglia isometrica triangolata, a quale triangolo corrisponde un punto?

Nel mio codice, triangoli sono raggruppati da colonne.

Come si passa il mouse, voglio calcolare in quale triangolo si trovano le coordinate del mouse. Esiste un semplice algoritmo per farlo?

+0

dipende, ci deve essere una frazione di un triangolo in alto, poiché non si allinea con la parte superiore dello schermo. Come lo gestisci? –

risposta

4

Quello che vuoi fare è trasformarlo in una griglia il più possibile perché le griglie sono molto più facili da usare.

La prima cosa da fare è capire cosa colonna è nella. Tu dici di memorizzare che quindi dovrebbe essere più facile facendo una semplice divisione intera sulla coordinata x per la larghezza della colonna compensato dal l'inizio di dialogo. Facile.

Dopo ciò si vuole calcolare il triangolo in cui si trova (ovviamente). Come lo trasformi parzialmente in una griglia, fingi di avere una pila di triangoli ad angolo retto invece di una pila di triangoli isometrici.

I triangoli hanno una lunghezza lungo l'asse y (il lato della colonna). Dividi questo numero in due e calcola quanti passi sei giù. In base al numero di passi verso il basso e se la colonna è pari o dispari vi dirà se stai guardando:

+--------+ 
|-_  | 
| -_ | 
| -_ | 
|  -_| 
+--------+ 

o viceversa. A questo punto, devi solo determinare su quale lato della linea è attivo il triangolo rettangolo in cui si trova. Inoltre, indica il triangolo isometrico in cui si trova.

Hai un paio di opzioni per questo.

  1. Potresti usare qualcosa come l'algoritmo di riga di Bresenham per rasterizzare l'ipotenusa e quando colpisci la colonna sei in allenamento se sei sopra o sotto quella linea;
  2. Perché qui ci sono solo due possibili griglie (una è l'opposto dell'altra, quindi è solo una). È possibile memorizzare una serie di valori di riga, dicendo che per la colonna 3, l'ipotenusa è all'offset 2, mentre per 6 è a 4 e così via.

Si potrebbe anche utilizzare (1) per generare (2) come una rapida ricerca.

L'unica altra cosa da considerare è che cosa succede se il cursore del mouse si trova su un bordo?

3

Questo è simile a ciò che diceva il cleto, ma suppongo che sia un modo diverso di guardarlo.

sto assumendo il lato del triangolo è 1.

Supponiamo di avere la griglia come di seguito:

 y' 
    /
    /__/__/__/__/__/__/ 
    /__/__/__/__/__/__/ 
    /__/__/__/__/__/__/____ x' 
(0,0) 

Se si considera la griglia in un sistema di coordinate in cui gli assi x & y sono ad un angolo di 60 gradi, un punto la cui coordinata nel sistema angolato (x ', y') corrisponderà alla coordinata nel sistema ortogonale (con la stessa origine una direzione generale degli assi) a (x, y) .

Nel tuo problema, ti viene dato (x, y), dobbiamo trovare (x ', y') e quindi calcolare il triangolo.

Se i è il vettore unitario lungo x e j ortogonale lungo y, allora abbiamo che

x'* i + y'(i/2 + sqrt(3) * j /2) = xi + yj. 

(Fondamentalmente il versore lungo l'asse y 'angled' è i/2 + sqrt (3)/2 * j. Il vettore unitario lungo l'asse x è uguale all'asse x normale, cioè i).

Così

x' + y'/2 = x 
y' * sqrt(3)/2 = y 

Solving dà:

y' = 2*y/sqrt(3) 
x' = x - y/sqrt(3) 

Supponiamo per ora che x 'e y' sono positivi.

Ora se c = [x '], la parte intera di x'

er = [y '], la parte intera di y'

poi nella griglia (angolare), il il punto si trova nella colonna cth e nella riga rth. (Conteggio a destra e in alto e inizia il conteggio a 0).

Così abbiamo ridotto l'punto a un parallelogramma

 ____ 
     /\ */ 
    /___\/ 
    (c,r) 

Ora, al fine di scoprire quale triangolo è in voi può prendere in considerazione le parti frazionarie di x 'e y'.

{x} = x' - [x'] = x' - c. 
{y} = y' - [y'] = y' - r. 

Ora,

se {x} + {y} > 1, allora il punto risiede nel triangolo con *. se {x} + {y} < 1, il punto si trova nell'altro triangolo. se {x} + {y} = 1, il punto si trova sulla linea comune ai due triangoli.

Spero che sia di aiuto.