2017-12-04 156 views
5

2d düzleminde iki statik, eksen hizalanmış şekil arasında bir çakışma oluştuğunu algılamak için bir yöntem (C++) gerçekleştiriyorum. Şekiller kareler ya da dairelerdir ve bu nedenle üst üste gelmek için göz önüne almam gereken üç durum vardır: kare kare, daire-daire ve daire-kare.Bir kare ve bir daire arasındaki örtüşmenin doğru tespiti için algoritma?

Kare kare ve daire dairesi yeterince basit, ancak kare-daire çakışmasını hesaplamak için doğru algoritmanın ne olduğu hakkında çevrimiçi herhangi bir katı bilgi bulmakta zorlanıyorum.

Kareyi bir daire içine (ya da tersi) kaba bir yöntem olarak gömebileceğimin farkındayım, ancak bunu daha net bir şekilde yapmanın en temiz yolu olarak değerlendirilmekle ilgileniyorum.

İnternette araştırmak, bu soruya 'doğru' bir cevap olduğunu gösterir, ancak tam olarak bu cevabın ne olduğu açık değildir. Kare merkezi ve yarım boyutu tarafından temsil edildiğini

bool doesSquareCircleOverlap(float squareCenterX, float squareCenterY, float squareHalfSize, float circleCenterX, float circleCenterY, float circleRadius) { 
    float x = fabs(circleCenterX - squareCenterX) - squareHalfSize; 
    float y = fabs(circleCenterY - squareCenterY) - squareHalfSize; 

    if (x>0) { 
     if (y>0) { 
      return x*x + y*y<circleRadius*circleRadius; 
     } else { 
      return x<circleRadius; 
     } 
    } else { 
     return y<circleRadius; 
    } 
} 

Not:

+1

https://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection –

+1

Daha genel olarak, dairenin merkezine dikdörtgen (kare) en yakın noktasını bulmak. Şekil AA ise, bu önemsizdir. Değilse, bir nokta ürünü bunu verecektir. Bu mesafe dairenin yarıçapından daha azsa, bir çarpışma olur. Sirküler tamamen kare içinde olmadıkça, her bir noktayı dahil edilmek üzere kontrol etmeniz gerekir (merkezden yarıçapa kadar her tepe noktasının uzaklığı). –

+0

En temiz yöntem, şeklin hangi bilginin saklandığına bağlıdır. Çemberiniz 3 noktalı koordinatla modellenir mi, yoksa merkeze ve yarıçapa sahip olursunuz. Ve senin dikdörtgenin için, 3 puan mı, yoksa başka bir şey mi? Eğer bana sağlarsan lise matematiğine dönmekten mutlu olurum! – Oliv

cevap

2

Burada basit ve hızlı algoritma var.

Temelde, ne yapar şudur: fabs()

  • ile simetrik vakaları kaldırır

    • en yakın noktayı belirlemek için, dairenin merkezidir alan kökenli
    • çek içine köşesini koyar daireden kare. Bu kapanış noktası circleRadius'dan daha yakınsa, o zaman bir çakışma vardır.