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实现。。。以上是我所说的,最后的答案是不完整的。此解决方案无法正确解释矩形角处的圆。它基本上只是检查矩形和圆的边框是否相交。有关完整的解决方案,请参阅。