2010-02-15 12 views
5

Mam triangulated izometrycznym siatkę, na przykład: alt textW trójkątowanej siatce izometrycznej, jaki trójkąt jest danym punktem?

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

Po najechaniu myszą, chcę obliczyć, w jakim trójkącie znajdują się współrzędne myszy. Czy istnieje prosty algorytm do tego?

+0

zależy od tego, że u góry musi znajdować się ułamek trójkąta, ponieważ nie będzie on wyrównany z górną częścią ekranu. Jak sobie z tym radzisz? –

Odpowiedz

4

To, co chcesz zrobić, to zmienić je w siatkę tak bardzo, jak to możliwe, ponieważ siatki są znacznie łatwiejsze w obsłudze.

Pierwszą rzeczą, jaką robisz, jest sprawdzenie, w jakiej kolumnie się znajduje. Mówisz, że przechowujesz to, więc powinno być łatwiej, wykonując prosty podział na liczbę całkowitą na współrzędnej x przez przesunięcie szerokości kolumny przez początek pola. Łatwo.

Po tym chcesz sprawdzić, w jakim to trójkącie (oczywiście). Jak częściowo przekształcić to w siatkę, udajesz, że masz stos trójkątów prostokątnych zamiast stosu trójkątów izometrycznych.

Trójkąty mają długość wzdłuż osi y (bok kolumny). Podziel tę liczbę na dwie i oblicz ile kroków jesteś w dół. Na podstawie liczby kroków w dół i jeśli kolumna jest parzysta lub nieparzysta, wyświetli się informacja:

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

lub odwrotnie. W tym momencie musisz tylko określić, po której stronie linii jest on, aby określić, który trójkąt prostokątny jest w środku, który również informuje, który jest trójkątem izometrycznym.

Masz kilka opcji do tego.

  1. Możesz użyć czegoś takiego jak algorytm liniowy Bresenhama do zrasteryzowania przeciwprostokątnej, a kiedy trafisz w kolumnę jesteś w pracy, jeśli jesteś powyżej lub poniżej tej linii;
  2. Ponieważ masz tutaj tylko dwie możliwe siatki (jedna jest odwrotnością drugiej, więc tak naprawdę jest tylko jedna). Możesz przechowywać tablicę wartości wierszy, mówiąc, że dla kolumny 3, przeciwprostokątna jest przesunięta 2, podczas gdy dla 6 jest na 4 i tak dalej.

Można nawet użyć (1) do wygenerowania (2) jako szybkiego wyszukiwania.

Jedyną rzeczą, którą należy wziąć pod uwagę, jest sytuacja, gdy kursor myszy znajduje się na krawędzi?

3

Jest to podobne do tego, co powiedział cletus, ale przypuszczam, że jest inaczej.

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

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

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

Jeśli wziąć pod uwagę siatkę w układzie współrzędnych, w którym oś y x & są ustawione pod kątem 60 stopni, punkt, którego współrzędna w układzie kątowym (x ', y') będzie odpowiadała współrzędnej w układzie ortogonalnym (z tym samym początkiem, ogólny kierunek osi) do (x, y) .

W twoim problemie, dostaniesz (x, y), musimy znaleźć (x ', y'), a następnie wykombinować trójkąt.

Jeżeli i jest wektor jednostkowy wzdłuż osi x i j prostopadły wzdłuż osi Y, to mamy że

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

(zasadzie 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 normalna oś x, tj. I).

Zatem

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

Rozwiązywanie otrzymujemy:

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

Załóżmy teraz, że x 'i y' są dodatnie.

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

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

następnie w (kąt) sieci elektrycznej, punkt leży w kolumnie cth i wierszu rth. (Licząc w prawo i w górę i zacznij liczyć na 0).

Zatem 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łamkowe 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 dwóch trójkątów.

Nadzieję, że też pomaga.