Mam triangulated izometrycznym siatkę, na przykład:

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ć?
Mam triangulated izometrycznym siatkę, na przykład:

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ć?
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.
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?
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ż.