Geometry 线段圆交点
我试图确定线段与圆相交的点。例如,给定P0和P3之间的任何点(并且假设您知道半径),确定P3的最简单方法是什么 一般来说Geometry 线段圆交点,geometry,Geometry,我试图确定线段与圆相交的点。例如,给定P0和P3之间的任何点(并且假设您知道半径),确定P3的最简单方法是什么 一般来说 找出P0和P1之间的角度 在距离r处从P0以该角度画一条线,这将得到P3 在伪代码中 theta = atan2(P1.y-P0.y, P1.x-P0.x) P3.x = P0.x + r * cos(theta) P3.y = P0.y + r * sin(theta) 你有一个方程组。圆的定义为:x^2+y^2=r^2。该行由y=y0+[(y1-y0)/(x1-x0
- 找出P0和P1之间的角度
- 在距离r处从P0以该角度画一条线,这将得到P3
theta = atan2(P1.y-P0.y, P1.x-P0.x)
P3.x = P0.x + r * cos(theta)
P3.y = P0.y + r * sin(theta)
你有一个方程组。圆的定义为:
x^2+y^2=r^2
。该行由y=y0+[(y1-y0)/(x1-x0)]·(x-x0)
定义。将第二个替换为第一个,得到x^2+(y0+[(y1-y0)/(x1-x0)]·(x-x0))^2=r^2
。解决这个问题,您将得到x的0-2值。将它们插回任意一个方程,从圆心和半径得到y的值。你可以写出描述圆的方程。
从两点P0和P1可以写出描述直线的方程式
所以你有两个方程,两个未知数,你可以通过代换来求解
设(x0,y0)=点P0的坐标
和(x1,y1)=点P1的坐标
r=圆的半径
圆的方程式为:
(x-x0)^2 + (y-y0)^2 = r^2
该线的方程式为:
(y-y0) = M(x-x0) // where M = (y1-y0)/(x1-x0)
将第二个方程式插入第一个方程式,得出:
(x-x0)^2*(1 + M^2) = r^2
x - x0 = r/sqrt(1+M^2)
类似地,你可以发现
y - y0 = r/sqrt(1+1/M^2)
点(x,y)是直线和圆之间的交点,(x,y)是你的答案
P3 = (x0 + r/sqrt(1+M^2), y0 + r/sqrt(1+1/M^2))
使用此代码..它可以节省时间
private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr ) {
float dx = x2 - x1;
float dy = y2 - y1;
float a = dx * dx + dy * dy;
float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
float c = cx * cx + cy * cy;
c += x1 * x1 + y1 * y1;
c -= 2 * (cx * x1 + cy * y1);
c -= cr * cr;
float bb4ac = b * b - 4 * a * c;
// return false No collision
// return true Collision
return bb4ac >= 0;
}
MATLAB代码 函数[flag]=圆线段相交2(Ax、Ay、Bx、By、Cx、Cy、R) %A和B是线段的两个端点,C是线段的中心 圆,%R是圆的半径。此函数用于计算 从C到段%的最近点,如果到 最近点>R返回0其他1
Dx=Bx Ax;
Dy=按y;
LAB=(Dx^2+Dy^2);
t=((Cx-Ax)*Dx+(Cy-Ay)*Dy)/LAB;
如果t>1
t=1;
埃尔塞夫(t R)
flag=0;
其他的
flag=1;
结束
结束当你得到两个解时,你将如何分辨哪一个是P3,哪一个是圆另一侧的对应点?找出每个点和P1之间的距离。你可以通过(x3-x1)^2+(y3-y1)^2计算距离的平方,最小的一个更接近P1。这正是我想要的-尝试在两个圆之间绘制直线,直线指向中心,但端点位于圆的外侧,而不是实际的中心。这种方法很好,但对我来说,重新构造它以使用rsqrt和法线,而不是atan2+cos+sin和angles,才是性能的关键。希望它能帮助别人!:)当p0是圆的中心时,这是正确的,如上图所示,但问题似乎不是这是直线,如果与线段不同。这只是返回一个布尔值,表示是否存在交点,它本身不返回交点为什么不将函数的底部5行替换为
return bb4ac>=0
?
Dx = Bx-Ax;
Dy = By-Ay;
LAB = (Dx^2 + Dy^2);
t = ((Cx - Ax) * Dx + (Cy - Ay) * Dy) / LAB;
if t > 1
t=1;
elseif t<0
t=0;
end;
nearestX = Ax + t * Dx;
nearestY = Ay + t * Dy;
dist = sqrt( (nearestX-Cx)^2 + (nearestY-Cy)^2 );
if (dist > R )
flag=0;
else
flag=1;
end