2012-12-31 3 views
1

Comment puis-je vérifier si un cercle complètement contient un rectangle (en Java)?Vérifiez si le cercle contient rectangle

public class Circle { 
    //x and y define the top left corner of the square bounding this circle 
    public int x, y, radius; 
} 

public class Rectangle { 
    //x and y define the top left corner 
    public int x, y, width, height; 
} 

public boolean circleContainsRectangle(Circle circle, Rectangle rect) { 
    ... 
} 
+0

@Codeguy Comment le code que vous avez WRI si loin pour le résoudre ??? – vikiiii

Répondre

3

est Ci-dessous réponse pour cartesian axe où se trouve (0, 0) dans le coin inférieur gauche.

EDIT Puisque votre x, y est en haut à gauche du carré. les transformer pour être dans le centre:

x = x+r 
y = y-r 

équation du cercle est x^2 + y^2 = r^2, maintenant point donné {x, y} se situera à l'intérieur ou sur le cercle quand ssi x^ + y^2 <= r^2. Maintenant, nous pouvons faire en toute sécurité l'hypothèse que le rectangle se trouvera dans le cercle si les quatre coins se trouvent à l'intérieur ou sur le cercle. En utilisant pseudo-code hypothèse ci-dessus pour trouver si rectangle est contenu dans le cercle:

boolean contains(Circle c) { 
    Point p_rect_1 = {x, y}; 
    Point p_rect_2 = {x + width, y }; 
    Point p_rect_3 = {x + width, y + height }; 
    Point p_rect_4 = {x, y + height }; 
    Point[] points = new Point[] { p_rect_1, p_rect_2, p_rect_3, p_rect_4 }; 

    foreach(Point p : points) { 
     // ** is raise to power 
     if ((c.x - p.x)**2 + (c.y - p.y)**2 > c.r**2) { 
      return false; 
     } 
    } 
    return true; 
} 

EDIT Plus d'approche optimisée pour le calcul (suggéré par Jim dans les commentaires ci-dessous) serait en calculant le coin le plus éloigné du rectangle de le centre du cercle:

dx = max(centerX - rectLeft, rectRight - centerX); 
dy = max(centerY - rectTop, rectBottom - centerY); 
return radius*radius >= dx*dx + dy*dy 
+0

+1 pour les maths que l'esprit fou imploser: P – MadProgrammer

+0

Ceci est faux, puisque (cx, cy) est le coin supérieur gauche du rectangle de délimitation du cercle, et non pas son centre (un pour définir de façon assez pauvre un cercle, mais c'est le problème du PO). De plus, vous n'avez pas besoin d'une boucle ... vérifiez simplement si le coin le plus éloigné du centre est dans le cercle. –

+0

@JimBalter Vous avez raison, nous pouvons vérifier le point le plus éloigné mais je crois que cela nécessiterait également de calculer les distances, donc la complexité de la solution pourrait bien rester la même. Aussi, ma réponse était sous l'hypothèse que c.x et x.y sont le centre du cercle. – Shivam

3

Probablement la meilleure façon est de vérifier si les quatre coins du rectangle sont inférieurs à radius unités du centre du cercle. Si c'est le cas, tous les points du rectangle sont à l'intérieur du cercle. Les quatre points que vous devez vérifier sont (x, y), (x + largeur, y), (x, y + hauteur) et (x + largeur, y + hauteur).

Note: Il est étrange que le cercle est défini à partir du coin supérieur droit, tandis que le rectangle est défini en haut à gauche. Assurez-vous de prendre cela en compte lors du calcul du centre du cercle.

+1

Vérifiez coin le plus du centre plutôt que de vérifier les quatre coins: max (carrés (centerX - rectLeft), carré (centerX - rectRight)) + max (m² (centerY - rectTop), carré (centerY - rectBottom)) < = sq (rayon) –

0

Swift 4:

func checkCircleContainsRect(circle: Circle, rect: CGRect) -> Bool 
    { 
     let dx = max(abs(circle.position.x - rect.minX), abs(rect.maxX - circle.position.x)) 
     let dy = max(abs(circle.position.y - rect.maxY), abs(rect.minY - circle.position.y)) 
     return (circle.radius * circle.radius) >= (dx * dx) + (dy * dy) 
    } 
Questions connexes