W triangulated izometrycznej siatki, co trójkąt jest dany punkt?

głosy
5

Mam triangulated izometrycznym siatkę, na przykład: tekst

W moim kodu, trójkąty są pogrupowane według kolumn.

Jak najechaniu myszką, chcę, aby obliczyć co trójkąt współrzędne myszy są w. Czy istnieje prosty algorytm to zrobić?

Utwórz 15/02/2010 o 05:20
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
4

Co chcesz zrobić, to przekształcić siatki jak najwięcej bo kratki są znacznie łatwiej pracować.

Pierwszą rzeczą, jaką można zrobić, to zorientować, co to w kolumnie. Mówisz, że przechowywanie tak powinno być łatwiej, wykonując proste całkowitą podział na współrzędna x przez szerokość kolumny skompensowany początku skrzynki. Łatwo.

Po że chcesz pracować, co trójkąt to w (oczywiście). Jak się częściowo przekształcić siatki jest udawać, że masz stos odpowiednich trójkątów kąt zamiast stosu izometrycznych trójkątów.

Trójkąty mają długość wzdłuż osi Y (po stronie kolumny). Podzielić tę liczbę w dwóch i wyszło, ile kroków w dół jesteś. Na podstawie liczby kroków w dół, a jeżeli kolumna jest parzyste, czy nieparzyste powie, jeśli szukasz na stronie:

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

lub na odwrót. W tym momencie trzeba tylko określić, po której stronie linii to na określenie, które prawo to w trójkąt, który również mówi, który izometryczny trójkąt to w.

Masz kilka opcji do tego.

  1. Można użyć coś jak algorytm bresenhama rasteryzację przeciwprostokątną i po trafieniu kolumnę jesteś w pracy, czy jesteś powyżej lub poniżej tej linii;
  2. Bo masz tylko o dwóch możliwych siatek (jedna jest odwrotnością drugiej tak naprawdę tylko jeden). Można zapisać tablicę wartości rzędu, mówiąc, że na kolumnie 3, przeciwprostokątna jest przesunięcie 2, natomiast dla 6 to na 4 i tak dalej.

Można nawet użyć (1) w celu wytworzenia (2) jako szybki odnośnika.

Jedyną inną rzeczą do rozważenia jest to, co się dzieje, gdy kursor znajduje się na krawędzi?

Odpowiedział 15/02/2010 o 05:32
źródło użytkownik

głosy
3

Jest to podobne do tego, co powiedział Cletus, ale inny sposób spojrzeć na to jak sądzę.

Jestem zakładając bok trójkąta jest 1.

Załóżmy, że masz siatkę, jak poniżej:

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

Jeśli wziąć pod uwagę siatki w układzie współrzędnych, w którym X i Y osie są usytuowane pod kątem 60 stopni, do punktu, którego współrzędne w układzie kątowym (x „y”) będzie odpowiadać współrzędna System ortogonalne (o tym samym pochodzeniu ogólny kierunek osi) dla (x, y).

W swoim problemie, dostaniesz (x, y), musimy znaleźć (x „y”), a następnie dowiedzieć się trójkąt.

Jeżeli ja jest wektorem jednostkowym wzdłuż xi j prostopadłym wzdłuż osi Y, to mamy, że

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

(Zasadniczo wektor jednostkowy wzdłuż „kątowy” wzdłuż osi y i / 2 + sqrt (3) / 2 * j. Wektor jednostkowy wzdłuż osi X jest taki sam jak zwykły osi x, to znaczy I).

A zatem

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

Rozwiązywanie daje:

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

Załóżmy teraz, że x „i y” są pozytywne.

Teraz, gdy C = [X '], całkowita część x'

i r = [R '], część całkowita z y'

Następnie w (kąt) siatki, temperatura mieści się w kolumnie Cth rzędu r-i. (Licząc w prawo i do góry i rozpocząć odliczanie od 0).

Tak więc mamy zawężony punkt do równoległoboku

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

Teraz, aby dowiedzieć się, który jest w trójkąt można rozważyć części ułamkowych x „i y”.

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

Teraz,

jeśli {x} + {y} > 1, to punkt leży w trójkącie oznaczone *. jeśli {x} + {y} < 1, to punkt leży w drugim trójkącie. jeśli {x} + {y} = 1, to punkt leży na linii wspólnej dla obu trójkątów.

Nadzieję, że pomaga też.

Odpowiedział 15/02/2010 o 09:45
źródło użytkownik

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