Poligon içinde nokta aka isabet sınaması
En zarif, en iyi 2D "içinde" veya Çokgen.nokta çokgen nedir içerir(p:Puan) algoritma?
Edit: vs tamsayılar yüzer için farklı cevaplar olabilir. Öncelikli amacı hız.
CEVAP
Aşağıdaki kod parçası en iyi çözüm (here alınan) bence
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
int i, j, c = 0;
for (i = 0, j = nvert-1; i < nvert; j = i ) {
if ( ((verty[i]>testy) != (verty[j]>testy)) &&
(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) vertx[i]) )
c = !c;
}
return c;
}
Argümanlar
- nvert: Çokgen köşe sayısı. Olsun sonunda ilk köşe tekrarlama makale, yukarıda bahsedilen anlatılmıştır.
- vertx, verty: Diziler x - ve y-koordinatları poligon " denir. içeren
- testx, asabi: X - ve y-koordinat test noktası.
Hem kısa hem de etkili ve dışbükey ve içbükey çokgenler için çalışır. Daha önce de belirtildiği gibi sınırlayıcı dikdörtgenin ilk kontrol ve çokgen delik ayrı ayrı tedavi edilmelidir.
Bunun arkasındaki fikir oldukça basittir. Yazar aşağıdaki gibi açıklar
Yarı-sonsuz bir ray yatay olarak çalıştırın (x, y sabit artan) test noktadan ve kaç geçer Kont. Her kavşakta, ray arasında iç ve dış geçer. Bu Jordan eğri teoremi denir.
Değişken c 0, 0, 1 ve 1 yatay ray herhangi bir kenar Haçlar her zaman geçiriliyor. Yani temelde kenarları geçti sayısı çift veya tek olup olmadığını takip etmek. 0 ve 1 demek bile garip gelir.
İOS: eğer bir nokta bir dörtgen içinde...
Nasıl nokta gösterebilir miyim (&;...&...
Çift nokta arasındaki farklılıklar&;.....
Nasıl bir Üçgen içinde bir nokta belir...
Bir nokta ise test için denklem içinde...