C++ 圆-轴对齐矩形交点

C++ 圆-轴对齐矩形交点,c++,geometry,C++,Geometry,我想创建一个函数,它接受一个矩形和一个圆,返回一个布尔值,判断它们是否相交。最有效、最简单的方法是什么?该函数如下所示: bool intersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius) { bool intersect; //code I need return intersect; } Please help me find the code I need. Thanks!

我想创建一个函数,它接受一个矩形和一个圆,返回一个布尔值,判断它们是否相交。最有效、最简单的方法是什么?该函数如下所示:

bool intersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius) 
{
    bool intersect;
    //code I need
    return intersect;
}

Please help me find the code I need. Thanks!
#include <math.h>
#define PI 3.14159265

bool intersect(rX1, rY1, rX2, rY2, rAngle, cX, cY, cR){
//can be `intersect(rX1,rY1,rH,rW,rAngle, cX,cY, cR)`, and calculate rX2,rY2
//can be `intersect(rX1,rY1,rX2,rY2,rH, cX,cY, cR)`, and calculate rAngle
    bool intersect;
    //assume (rX1,rY1) as origin AND rectangle`s-side attached to this point is on both axis,
    //THEN we need to recalculate coordinates according to this assumption

    rAngle=rAngle*PI/180; //angle in radian
    //NOTE: if in place of rAngle, rHeight or rWidth is given then you can calculate rAngle by trigonometry.

    //moving rX1,xY1 to (0,0)
    cX=cX-rX1; cY=cY-rY1;
    rX2-=rX1; rY2-=rY1; rX1=rY1=0;

    //rotating axis, rectangle, circle...
    float cosA=cos(rAngle), sinA=sin(rAngle);
    float tempX= cosA*rX2 + sinA*rY2;
    float tempY= sinA*rX2 + cosA*rY2;
    rX2=tempX; rY2=tempY;
    tempX=cosA*cX + sinA*cY;
    tempY=sinA*cX + cosA*cY;
    cX=tempX; cY=tempY;

    rX1-=cR;rY1-=cR; //enlarging(creating) virtual rectangle around original; After this...
    rX2+=cR;rY2+=cR; //...if circle centre is inside this rectangle it will intersect with original rectangle
    intersect=(cX<=rX2 && cX>=rX1 && cY<=rY2 && cY>=rY1);
    return intersect;
}

您的答案终于出来了,但我还想通知您/未来的观众,以下内容

当您通过
一点和高度宽度
表示一个矩形时,它不是轴系统上的特定矩形,这是一个矩形的一般形式,可以在任何地方绘制

所以,在您的例子中:矩形可以在任何方向上绘制(以使其远离圆形,例如:上、左、右、下等。侧到矩形,矩形)。这就是为什么这里会产生两种可能性,而你的可能性取决于你需要什么:

[A]
100%保证相交,无论您如何绘制矩形

[b]
至少有一种方法可以绘制矩形,使其与圆相交

案例A:

bool assuredIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    intersect=(radious>=distance);
    return intersect;
}
bool canIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    float diagonal=((rectX+rectHeight)^2+(rectY-rectWidth)^2)^0.5;
    intersect=((radious+diagonal)<distance);
    return intersect;
}
bool intersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;

    //calculating rX2,xY2
    rX2=rectX + rectWidth; rY2=rectY + rectHeight;

    rectX-=radius;rectY-=radius; //enlarging(creating) virtual rectangle around original; After this...
    rX2+=radius;rY2+=radius; //...if circle centre is inside this rectangle it will intersect with original rectangle ...
    intersect=(circleX<=rX2 && circleX>=rectX && circleY<=rY2 && circleY>=rectY);
    return intersect;
}
案例B:

bool assuredIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    intersect=(radious>=distance);
    return intersect;
}
bool canIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    float diagonal=((rectX+rectHeight)^2+(rectY-rectWidth)^2)^0.5;
    intersect=((radious+diagonal)<distance);
    return intersect;
}
bool intersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;

    //calculating rX2,xY2
    rX2=rectX + rectWidth; rY2=rectY + rectHeight;

    rectX-=radius;rectY-=radius; //enlarging(creating) virtual rectangle around original; After this...
    rX2+=radius;rY2+=radius; //...if circle centre is inside this rectangle it will intersect with original rectangle ...
    intersect=(circleX<=rX2 && circleX>=rectX && circleY<=rY2 && circleY>=rectY);
    return intersect;
}

<强> < <强> >,如果你不知道角度,那么你可以考虑前两种情况。


[回答]如果矩形与轴对齐,则函数将为:

bool assuredIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    intersect=(radious>=distance);
    return intersect;
}
bool canIntersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;
    float distance=((rectX-circleX)^2+(rectY-circleY)^2)^0.5;
    float diagonal=((rectX+rectHeight)^2+(rectY-rectWidth)^2)^0.5;
    intersect=((radious+diagonal)<distance);
    return intersect;
}
bool intersect(rectX, rectY, rectWidth, rectHeight, circleX, circleY, radius){
    bool intersect;

    //calculating rX2,xY2
    rX2=rectX + rectWidth; rY2=rectY + rectHeight;

    rectX-=radius;rectY-=radius; //enlarging(creating) virtual rectangle around original; After this...
    rX2+=radius;rY2+=radius; //...if circle centre is inside this rectangle it will intersect with original rectangle ...
    intersect=(circleX<=rX2 && circleX>=rectX && circleY<=rY2 && circleY>=rectY);
    return intersect;
}
bool intersect(rectX、rectY、rectWidth、recthheight、circleX、circleY、radius){
布尔交叉;
//计算rX2,xY2
rX2=矩形+矩形宽度;rY2=矩形+矩形高度;
rectX-=radius;rectY-=radius;//放大(创建)原始周围的虚拟矩形;在此之后。。。
rX2+=半径;rY2+=半径;//…如果圆心在该矩形内,它将与原始矩形相交。。。
intersect=(circleX=rectX&&circleY=rectY);
返回交点;
}

其中一个答案有一个C实现…该答案没有给出令人满意的解决方案,因为我不知道如何实现子功能我说其中一个答案有一个C实现。。。以上是我所说的,最后的答案是不完整的。此解决方案无法正确解释矩形角处的圆。它基本上只是检查矩形和圆的边框是否相交。有关完整的解决方案,请参阅。