Jeg har en triangulert isometrisk rutenett, som dette:

I min kode, blir trekanter gruppert etter kolonner.
Som jeg holder musen, jeg ønsker å beregne hva trekant muse koordinatene er i. Er det en enkel algoritme for å gjøre det?
Jeg har en triangulert isometrisk rutenett, som dette:

I min kode, blir trekanter gruppert etter kolonner.
Som jeg holder musen, jeg ønsker å beregne hva trekant muse koordinatene er i. Er det en enkel algoritme for å gjøre det?
Hva du ønsker å gjøre er å snu dette til et rutenett så mye som mulig, fordi nett er langt lettere å jobbe med.
Det første du gjør er å finne ut hva kolonne den er i. Du sier du lagre det slik at det skal bli lettere ved å gjøre et enkelt heltall divisjon på x koordinat ved kolonnebredden motvirket av boksen start. Lett.
Etter at du ønsker å finne ut hva trekant det er i (selvsagt). Hvordan delvis snu dette til et rutenett er du late som om du har en bunke med rettvinklede trekanter i stedet for en bunke med isometriske trekanter.
Trekantene har en lengde langs y-aksen (den side av søylen). Dele det tallet på to og regne ut hvor mange skritt ned du er. Basert på antall skritt ned, og hvis kolonnen er partall eller oddetall vil fortelle deg hvis du ser på:
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
eller omvendt. På dette punktet trenger du bare å finne ut hvilken side av linjen er det på å finne ut hvilke rettvinklet trekant den er i, som også forteller deg hvilken isometrisk trekant den er i.
Du har et par alternativer for dette.
Du kan også bruke (1) for å generere (2) som et fast oppslag.
Den eneste andre ting å vurdere er hva som skjer hvis musepekeren er på en kant?
Dette ligner på hva Cletus sagt, men en annen måte å se på det jeg anta.
Jeg antar trekanten side er en.
Tenk deg at du har rutenettet som følger:
y'
/
/__/__/__/__/__/__/
/__/__/__/__/__/__/
/__/__/__/__/__/__/____ x'
(0,0)
Hvis man anser det gitter i et koordinatsystem hvor x- og y-aksene er i en vinkel på 60 grader, et punkt hvis koordinat i den vinklede system (x 'y') vil tilsvare den koordinat i ortogonalt system (med samme opprinnelse en generell retning av aksene) til (x, y).
I problemet ditt, får du (x, y), må vi finne (x 'y') og deretter finne ut trekanten.
Dersom i er enhetsvektoren langs x og j den ortogonale langs y, da vi har det
x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.
(I utgangspunktet er den enhetsvektor langs 'vinkles' y-aksen er i / 2 + sqrt (3) / 2 * j. Enhetsvektoren langs x-aksen er den samme som den normale x-aksen, det vil si i).
Og dermed
x' + y'/2 = x
y' * sqrt(3)/2 = y
Løse gir:
y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)
Anta for nå at x 'og y' er positive.
Nå hvis c = [x '], heltallsdelen av x'
og r = [y '], heltallsdelen av y'
deretter i den (vinkel) gitter ligger punktet i CTH kolonne og RTH rad. (Counting høyre og opp og begynne å telle på 0).
Dermed har vi snevret ned punkt til et parallellogram
____
/\ * /
/___\/
(c,r)
Nå for å finne ut hvilken trekant det er i kan du vurdere brøk deler av x 'og y'.
{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.
Nå,
hvis {x} + {y} > 1, så det punktet ligger i trekanten er merket med *. hvis {x} + {y} < 1, da poenget ligger i den andre trekanten. hvis {x} + {y} = 1, da det punkt befinner seg på den linje som er felles for de to trekanter.
Håper det hjelper også.