Geometry 线段圆交点

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和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)]·(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