I en triangulert isometrisk rutenett, hva trekant er et gitt punkt i?

stemmer
5

Jeg har en triangulert isometrisk rutenett, som dette: alt

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?

Publisert på 15/02/2010 klokken 04:20
kilden bruker
På andre språk...                            


2 svar

stemmer
4

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.

  1. Du kan bruke noe sånt Bresenham linje algoritme for å rastrere hypotenusen og når du treffer kolonnen du er i arbeid ut om du er over eller under den linjen;
  2. Fordi du bare har to mulige nett her (en blir det motsatte av den andre, så det er egentlig bare en). Du kan lagre en rekke radverdier, sier at for kolonne 3, er hypotenusen i offset 2, mens det for seks det er på fire og så videre.

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?

Svarte 15/02/2010 kl. 04:32
kilden bruker

stemmer
3

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å.

Svarte 15/02/2010 kl. 08:45
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more