2016-04-14 64 views
0

Geçenlerde, çarpı poligonu ve daireyi işlemek için kullanılan stackoverflow üzerindeki kodu buldum ve işe yarıyor. Sorun şu ki, tam olarak anlamadım, bu yüzden birileri bana basit bir açıklama sunabilirse çok iyi olurdum.libGDX çokgen - daire çarpışması

// Check if Polygon intersects Circle 
private boolean isCollision(Polygon p, Circle c) { 
    float[] vertices = p.getTransformedVertices(); 
    Vector2 center = new Vector2(c.x, c.y); 
    float squareRadius = c.radius * c.radius; 
    for (int i = 0; i < vertices.length; i += 2) { 
     if (i == 0) { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[vertices.length - 2], 
        vertices[vertices.length - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[i - 2], vertices[i - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return false; 
} 

Bulamadığım kısım for döngüsüdür. (Ilk iki vektör bağımsız değişken tarafından belirtildiği gibi)

+0

Dairenin çokgenin içinde olup olmadığını kontrol ettiğinizden emin olun. http://stackoverflow.com/a/29938608/2900738 –

cevap

1

intersectSegmentCircle etkili bir şekilde hat segmenti alır ve hat daire keser (son vektör tarafından belirlenen ve bağımsız değişkenler yüzer gibi), ve bir daire doğru döndürür.

For döngüsü, poligonun köşeleri boyunca ilerler (iki noktadan itibaren artış, float[] vertices'daki iki değerle temsil edildiğinden). Sırasıyla her köşe için, bu köşeyi poligonda bir öncekine birleştirerek oluşturulan hat kesimini dikkate alır (yani, poligonun her bir kenarını sırayla ele alır).

intersectSegmentCircle bu segment için bir daire kavşağı bulursa, yöntem true değerini döndürür. Sonunda herhangi bir kesişme bulunamazsa, false değerini döndürür.

For/else öğesinde if/else sadece ilk verteks için - bu durumda 'önceki' verteks aslında float[] vertices içinde sonuncu olacaktır, çünkü bir çokgen döngüler döndürülür ve son köşeyi ilk olarak birleştirir .

+0

Zaman ayırdığınız için teşekkür ederim :) – Emir