Precyzyjne wykrycie punktu w wielokącie

0

Dobry wam. Na wykrycie punktu w wielokącie użyłem trzech sposobów (z czego dwa są moje):

  1. Parzystość i nieparzystość krawędzi po przez przecięcie pewną długością odcinka.

  2. Obwód wielokąta porównany z sumą dystansów od px, py do każdego wierzchołka wielokątu

  3. Suma dystansów od pierwszego wierzchołka do reszty wierzchołków oraz porównanie jej do wartości sumy dystansów od px, py do każdego wierzchołka wielokątu.

  4. Zrobiłem to za pomocą przesuwania pozycji (pętlowanie) od punktu px,py o 0.2f lub 0.5f (w dowolnym kierunku). Na koniec liczę ilość przebitych krawędzi. Istnieje jednak ryzyko, że 1/5 sprawdzeń wyjdzie błędnie np. punkt rzeczywiście znajduje się w środku, a program powie ci, że jest za nim. I tutaj nie wiem jak to lepiej rozwiązać. Proszę o pomoc...

2 i 3 sposób jest dość dobry, lecz przy krawędziach nie jest precyzyjny (o 1 lub 2 metra błednie wykrywa).

  1. Po obliczeniu obwodu wielokąta, obliczam sumę dystansów od punktu px,py do każdego wierzchołka i jeżeli obwód jest większy od tej sumy to oznacza, że punkt znajduje się w wielokącie - minusem jest to, że nie jest precyzyjny.

  2. Trzeciego już nie będę opisywał

Najbardziej zależy mi na tym, jak najprecyzyjniej obliczyć z pierwszej metody zamiast tego skanowania pozycji o jakąś tam wartość bo jak wiadomo czasem można ominąć krawędź co wiąże się z błędną liczbą przecięć. Jeżeli znacie jeszcze jakieś lepsze metody to wyjaśnijcie je tutaj. Dzięki :)

0

Sposób pierwszy jest bardzo precyzyjny, jedynie co może być nieprecyzyjne to twoja realizacja tego algorytmu.

0

Precyzyjny to ja wiem, że jest... Chciałbym właśnie lepszym sposobem tą metodę rozwiązać zamiast skanowania pozycji, dlatego tu się odezwałem.

0

Chodzi o to, że z dowolnego punktu przesuwam jego pozycje o jakąś małą wartość 0.2f w dowolnym kierunku. Za pomocą pętli np 50 iteracji czyli równa się gdzieś 10 metrów przeskanowania. Jest to w ogóle nie przyszłościowe, nieopłacalne i też nieoptymalne, jeżeli miałbym to na bieżąco używać na dużo większych wielokątach. Chciałbym was się poradzić jak to lepiej zrobić.

Zrobiłem też wcześniej pewną funkcję, która sprawdza czy punkt znajduje się na pewnym odcinku (o danej szerokości tego odcinka) i rzeczywiście działa, ale co mi z tego jeżeli w przyszłości chciałbym sprawdzić czy punkt znajduje się w wielokącie, jeżeli może on wykryć tylko znajdowanie się punktu TYLKO na odcinku.

Proszę o rady.

0

No to masz źle to zrealizowane. Wybierasz dowolną półprostą z punktu i sprawdzasz ile krawędzi ta półprosta przetnie.
Wyliczaj to analitycznie, żadnych gradientów.

0

A mógłbyś mi jakoś przybliżyć, bardziej wyjaśnić jak to zrobić?

0

Narysuj na kartce półprostą poziomą, narysuj też odcinek.
Współrzędne końców odcinka znasz, wystarczy wyliczyć współrzędne przecięcia się dwóch prostych (jedna - kontynuacja półprostej, druga - kontynuacja odcinka).
Jeżeli współrzędne przecięcia leżą na odcinku oraz po właściwej stronie (półprosta) to przecina, jak nie to nie.

0

Jeżeli współrzędne przecięcia leżą na odcinku oraz po właściwej stronie (półprosta) to przecina, jak nie to nie.

Trochę nieprecyzyjne, punkt przecięcia ma leżeć we wnętrzu odcinka, tzn. nie ma być końcem odcinka. Jeżeli pechowo wybierzemy półprostą i trafimy w wierzchołek wielokąta, to trzeba zmienić półprostą.

0

Nie wystarczy, (który koniec odcinka jest pierwszy?).user image
Jak pominiemy jeden koniec, to dla A i B będzie taka sama odpowiedź.

0

Tak jak wcześniej wspomniałem, zrobiłem funkcję, w której określam dwie współrzędne jakiegoś tam odcinka i mogę obliczyć czy dany punkt X,Y znajduje się na nim.

http://www.fotosik.pl/pokaz_obrazek/c63674ddced3918a.html

No dobra, ale żeby przeciąć prostą mój odcinek, to muszę znać współrzędne punktu na prostej znajdującej się na odcinku, bez tego nie ruszy moja funkcja.

http://www.fotosik.pl/pokaz_obrazek/6db8daace9d85693.html <- Musiałbym jakoś określić współrzędną tego czerwonego punktu, lecz nie wiem jak to zrobić. W tym cały sęk.

0

Nie widzę sposobu obliczenia tego.

0

prosta przez A,B:
y=x*(By-Ay)/(Bx-Ax) - Ax*(By-Ay)/(Bx-Ax) + Ay
(Ax,Ay)-(Bx,By) & (Cx,Cy)-(Dx,Dy)

skrzyżowanie (prostej przez A,B) z (prostą przez C,D):
x=((Bx-Ax)(DxCy-DyCx)-(Dx-Cx)(BxAy-ByAx))/((By-Ay)(Dx-Cx)-(Dy-Cy)(Bx-Ax))
y=((Dy-Cy)(BxAy-ByAx)-(By-Ay)(DxCy-DyCx))/((Dy-Cy)(Bx-Ax)-(By-Ay)(Dx-Cx))

1 użytkowników online, w tym zalogowanych: 0, gości: 1