2009-10-11 32 views
12

Düzenleme:Bulma (C#) İki dikdörtgenin örtüşen alan

Kimseye ilgi (Fredrik sayesinde) olması durumunda sorunun çözümü için kullanılan

Basit kodu:

int windowOverlap(Rectangle rect1, Rectangle rect2) 
    { 
     if (rect1.IntersectsWith(rect2)) 
     { 
      Rectangle overlap = Rectangle.Intersect(rect1, rect2); 
      if (overlap.IsEmpty) 
       return overlap.Width * overlap.Height; 
     } 

     return 0; 
    } 

Orijinal Soru:

İki dikdörtgenin örtüşüp örtüşmediğini ve çakışma alanını hesaplayıp hesaplamadığını hızlı ve kirli bir şekilde öğrenmek istiyorum. Meraklısına aşkına ben hem dikdörtgenler 1) Tüm hatlar herhangi iki dikdörtgen için ya dikey ya da yatay veya 2) genel durum olması durumunda ilgileniyorum, ama gerçekten gerek tek cevap vaka 1.

olduğunu A.Intersects için

double areaOfOverlap(Rect A, Rect B) 
{ 
    if (A.Intersects(B)) 
    { 
     // calculate area 
     // return area 
    } 

    return 0; 
} 

() Ben ayıran eksen testi kullanılarak düşünme, ama dikdörtgenler yalnızca yatay ve dikey çizgiler varsa daha basit (hızlı) vardır: Ben çizgisinde düşünüyorum kontrol yolu?

Ve kesiştiği alanı hesaplamak için dikdörtgenler sadece yatay ve dikey çizgiler varsa bunu yapmak için hızlı bir yol var mı?

Son olarak, bu soruyla ilgili değil, ancak bilgisayar grafikleri için matematiği inceleyebildiğim iyi bir kitap/web sayfasındaki herhangi bir tavsiyeyi takdir ediyorum. Bir süredir kolejden çıktım ve herşeyi unutuyorum gibi hissediyorum :)! Bu sorunu yaşayan başkası var mı?

(NOT:. Ben daha karmaşık görünüyor ve doğrudan soruya cevap vermez this farklı bu soruyu bulundu) iş yapmak Rectangle.Intersect yöntemi Belki

+0

yatay dikdörtgen dikey dikdörtgen olan tarafı bağlıdır Eğer

düzenlemek Mike

this page on Wikipedia?

baktınız mı –

+4

** (overlap.Ismpmp) ** ** olmalıdır. ** (! overlap.IsEmpty) ** – ReinierDG

cevap

11

Sorunuzu yanlış anlaşılabilir, ama değil mi? Kesişen alanı döndürür ve daha sonra alanı kolayca hesaplayabilirsiniz.

+0

evet, bu kayda değerdir :). Teşekkürler! – Evan

1

Temel Çarpışma Algılama gibi geliyor. Fredrik ben bunu yapan aynı zamanda onun tepkisi, onun cevabı benim upvote (var olun::

+0

Teşekkürler, ben siteyi kontrol edeceğim! – Evan