Ho una griglia isometrica triangolare, in questo modo:

Nel mio codice, triangoli sono raggruppati per colonne.
Mentre passa il mouse, voglio calcolare quanto triangolo le coordinate del mouse sono in. C'è un semplice algoritmo per farlo?
Ho una griglia isometrica triangolare, in questo modo:

Nel mio codice, triangoli sono raggruppati per colonne.
Mentre passa il mouse, voglio calcolare quanto triangolo le coordinate del mouse sono in. C'è un semplice algoritmo per farlo?
Che cosa si vuole fare è trasformare questo in una griglia il più possibile, perché le griglie sono molto più facili da lavorare.
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 di che si vuole capire cosa triangolo si trova (ovviamente). Come parzialmente trasformare questo in una griglia è che far finta che si dispone di una pila di triangoli ad angolo retto invece di una pila di triangoli isometriche.
I triangoli hanno una lunghezza lungo l'asse y (il lato della colonna). Dividere quel numero in due e lavorare fuori quanti passi verso il basso ci si trovi. 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 è sufficiente per determinare quale lato della linea è su per determinare quale triangolo rettangolo è in, che si dice anche che triangolo isometrica è in.
Hai un paio di opzioni per questo.
Si potrebbe anche usare (1) per generare (2) come una ricerca veloce.
L'unica altra cosa da considerare è che cosa succede se il cursore del mouse si trova su un bordo?
Questo è simile a quello che ha detto Cletus, ma un modo diverso di vedere le cose suppongo.
Sto presupponendo 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 x & assi xey sono ad un angolo di 60 gradi, un punto cui coordinate nel sistema angolata (x 'y') corrisponderà alla coordinata in sistema ortogonale (con la stessa origine una direzione generale di assi) a (x, y).
Nel vostro problema, si è data (x, y), abbiamo bisogno di trovare (x 'y') e poi capire il triangolo.
Se i è il vettore unitario lungo x e j ortogonale lungo y, allora si ha 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 alla normale asse x, cioè i).
così
x' + y'/2 = x
y' * sqrt(3)/2 = y
Solving dà:
y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)
Si supponga per ora che x 'e y' sono positivi.
Ora, se c = [x '], la parte intera di x'
e R = [y '], la parte intera di y'
poi nella griglia (angolare), il punto si trova nella colonna e la riga cth esima. (Conteggio a destra e su e iniziare a contare da 0).
Così abbiamo ridotto l'punto da 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.
Adesso,
se {x} + {y} > 1, allora il punto risiede nel triangolo contrassegnati con *. se {x} + {y} < 1, allora il punto si trova nell'altra triangolo. se {x} + {y} = 1, allora il punto si trova sulla linea comune ai due triangoli.
Speranza che aiuta troppo.