Bir dikdörtgen bir içbükey çokgen kesiştiğini bulmaya çalışıyorum. Bu algoritma bunu başarmak mu?

oy
7

Bir dikdörtgen bir içbükey çokgen kesiştiğini bulmaya çalışıyorum. Bu algoritma bulundu:

double determinant(Vector2D vec1, Vector2D vec2){
    return vec1.x*vec2.y-vec1.y*vec2.x;
}

//one edge is a-b, the other is c-d
Vector2D edgeIntersection(Vector2D a, Vector2D b, Vector2D c, Vector2D d){
    double det=determinant(b-a,c-d);
    double t=determinant(c-a,c-d)/det;
    double u=determinant(b-a,c-a)/det;
    if ((t<0)||(u<0)||(t>1)||(u>1))return NO_INTERSECTION;
    return a*(1-t)+t*b;
}

Ben * (benim çokgenin tüm kenarları) (Sağ, Sol alt tarafa Top, sağ alt kısma üst, sağ alt Top) bu 4 kez gerçekleştirirseniz dikdörtgen bir kısmını veya tamamını içbükey varsa bu etkin ve doğru bana anlatırdı içeride poligon? ne eksik olur Değilse?

Teşekkürler

Oluştur 11/08/2010 saat 23:05
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
2

Ben şu işe gerektiğini düşünüyorum:

(1) for each e1 in rectangle_edges, e2 in polygon_edges
    (1.1) if edgeIntersection(e1,e2) != NO_INTERSECTION
        (1.1.1) return true
(2) if (max_polygon_x < max_rectangle_x) and (min_polygon_x > min_rectangle_x) and (max_polygon_y < max_rectangle_y) and (min_polygon_y > min_rectangle_y)
    (2.1) return true
(2) return false

Düzenleme : poligon dikdörtgenin içine olup olmadığına dair onay eklendi.

Cevap 11/08/2010 saat 23:12
kaynak kullanıcı

oy
13

AB ve CD - kod iki parçadan kesişme noktasını bulmaya çalışır.

Eğer bu işlemleri yorumlamak nasıl dayanarak bunu yapıyor açıklamak için birçok farklı yolu vardır.

en A noktası koordinatları olduğunu varsayalım (xa, ya), B - (xb, yb) vb. Diyelimki

dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc

İki doğrusal denklem aşağıdaki sistem

| dxAB dxCD |   | t |   | xc-xa |
|           | * |   | = |       |
| dyAB dyCD |   | u |   | yc-ya |

için çözülmesi halinde tve usize orantılı hattı AB (değerine kesişme noktasının konumunu verecek t) ve hat CD (değerine u). Bu değerler aralığında olacaktır [0, 1]noktası (segmenti içeren satırda) segmentinde dışında olan nokta, karşılık gelen segmenti ve bu aralığın dışında olduğunda geçerlidir.

Biz iyi bilinen kullanabilirsiniz lineer denklem bu sistemi çözmek için Cramer kuralı . Bunun için biz belirleyici gerekecektir

| dxAB dxCD |
|           |
| dyAB dyCD |

hangi tam olarak determinant(b - a, c - d)kodunuzdan. (Aslında, ne burada sahip olduğunu determinant(b - a, d - c), ancak bu açıklama amacıyla gerçekten önemli değildir. Herhangi bir nedenden dolayı yayınlanmıştır kod aşağıda PS nota bakın C ve D takas).

Ve ayrıca bir belirleyici gerekecektir

| xc-xa dxCD |
|            |
| yc-ya dyCD |

hangi tam olarak determinant(c-a,c-d)kodunuzdan ve belirleyici arasında

| dxAB xc-xa |
|            |
| dyAB yc-ya |

hangi tam olarak determinant(b-a,c-a).

Cramer kuralı uyarınca bu belirleyicilerin bölündüğünde bize değerlerini verecek tve udeftere kodu yapılır tam olarak ne olduğu,.

Kod, daha sonra değerlerini test etmeye başlıyor tve usegmentler aslında kesişen eğer her ikisi olsun yani kontrol etmek tve uaittir [0, 1]değişir. İsterlerse, bu değerlendirerek gerçek kesişim noktasını hesaplar a*t+b*(1-t)(eşit biçimde, bu değerlendirilebilir c*u+d*(1-u)). (Yine aşağıda PS nota bakınız).

PS orijinal kod noktaları D ve C olarak kod yaptığı bir anlamda "takas" olan c - dyapmam, d - cbenim açıklama. Ama bu seferki dikkatli işaretlerle sürece, algoritmanın genel bir fikir için hiç fark etmez.

C ve D noktasının bu takas de nedeni, a*(1-t)+t*bkesişme noktasını değerlendirirken kullanılan ekspresyon. Normalde benim açıklama olduğu gibi böyle bir şey görmeyi beklediğiniz one'd a*t+b*(1-t)orada. (Gerçi bu konuda şüphelerim var. Görmeyi beklediğiniz a*t+b*(1-t)bile sürümünde orada. Bir hata olabilir.)

PPS kodu kontrol etmek unuttuysanız yazar det == 0segmentleri paralel olduğunda durumda gerçekleşecek olan (ya da çok yakın 0).

Cevap 11/08/2010 saat 23:30
kaynak kullanıcı

oy
0

Bildiğim kadarıyla bir bakışta sonra söyleyebilirim, o 2 çizgi parçaları kesiştiği olmadığını belirlemeye çalışır ve onlar yoksa, kesişme noktasının koordinatları şeylerdir.

Hayır, senin dikdörtgen ve çokgen kesiştiği eğer hala iki poligon dikdörtgen veya tersi tamamen içinde olan davayı özleyeceğini, çünkü belirlemek için yeterli değil.

Cevap 11/08/2010 saat 23:56
kaynak kullanıcı

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