Geometry 处理:直线与圆相交的距离

Geometry 处理:直线与圆相交的距离,geometry,processing,distance,intersection,equation,Geometry,Processing,Distance,Intersection,Equation,现在,我知道有人问过类似的问题。但是没有一个答案能帮助我找到我需要的结果 以下情况: 我们有一条带有原点(PO)的直线,给出为lx,ly。我们还有一个线的角度,因为它退出PO,其中0°表示水平向右,正角度表示顺时针。角度在[0;360[中。此外,我们还有直线的长度,因为它不是无限长的,如len 还有一个圆具有给定的中心点(CP),表示为cx,cy。半径表示为cr 我现在需要一个函数,它将这些数字作为参数,并返回直线和圆到PO的最近交点的距离,如果没有交点,则返回-1 我目前的做法如下: floa

现在,我知道有人问过类似的问题。但是没有一个答案能帮助我找到我需要的结果

以下情况:

我们有一条带有原点(PO)的直线,给出为
lx
ly
。我们还有一个线的
角度
,因为它退出PO,其中0°表示水平向右,正角度表示顺时针。
角度
[0;360[
中。此外,我们还有直线的长度,因为它不是无限长的,如
len

还有一个圆具有给定的中心点(CP),表示为
cx
cy
。半径表示为
cr

我现在需要一个函数,它将这些数字作为参数,并返回直线和圆到PO的最近交点的距离,如果没有交点,则返回-1

我目前的做法如下:

float getDistance(浮动lx、浮动ly、浮动角度、浮动len、浮动cx、浮动cy、浮动cr){
浮动nlx=lx-cx;
float=ly-cy;
浮点数m=tan(角度);
浮子b=(-lx)*m;
//a=m^2+1
//b=2*m*b
//c=b^2-cr^2
float[]x_12=平方公式(sq(m)+1,2*m*b,sq(b)-sq(cr));
//如果没有交叉口
if(Float.isNaN(x_12[0])&Float.isNaN(x_12[1]))
返回-1;
浮动距离;
if(Float.isNaN(x_12[0])){
距离=(x_12[1]-nlx)/cos(角度);
}否则{
距离=(x_12[0]-nlx)/cos(角度);
}

如果(距离=0&&results[0]=0&&results[1]仅使用nlx,我们可以建立线段的参数方程

dx=Cos(角度)
dy=Sin(角度)
x=nlx+t*dx
y=ly+t*dy
与周长相交的条件:

(nlx+t*dx)^2+(nly+t*dy)^2=cr^2
t^2*(dx^2+dy^2)+t*(2*nlx*dx+2*ly*dy)+nlx^2+ly^2-cr^2=0
所以我们有未知参数t的二次方程

a=1
b=2*(nlx*dx+LY*dy)
c=nlx^2+nlx^2-cr^2
解二次方程,找出t是否在0..len范围内