线段圆交点

时间:2011-05-23 00:22:06

标签: geometry

我正在尝试确定线段与圆相交的点。例如,给定P0和P3之间的任何点(并且假设您知道半径),确定P3的最简单方法是什么?

Circle

5 个答案:

答案 0 :(得分:17)

通常,

  • 找到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)

答案 1 :(得分:8)

从圆的中心和半径,您可以编写描述圆的方程。 从两点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))

答案 2 :(得分:5)

你有一个方程组。圆圈由: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的值。

答案 3 :(得分:5)

转到此代码..节省时间

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;

      if(bb4ac<0){
          return false;    // No collision
      }else{
          return true;      //Collision
      }
    }

答案 4 :(得分:1)

MATLAB代码

function [flag] = circleLineSegmentIntersection2(Ax,Ay,Bx,By,Cx,Cy,R)

  

%A和B是线段的两个端点,C是中心线   圆圈,%R是圆的半径。这是功能计算   最近的点从C到段%如果距离到   最近点&gt; R返回0否则1

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