判断线段是否与圆相交模板

判断线段和圆是否相交

判断圆和线段相交,分两种情况:

 


1. 如图A所示,当圆心与线段的距离大于圆的半径时,线段与圆肯定不相交

2. 如图B,C所示,两个端点都不在圆内,那么看圆心到线段所在直线的垂足是否小于半径且垂足是否在线段上;我们可以利用余弦定理,避免判断垂足是否在线段上,只要圆心到两端点的得角度都为锐角,那么他们必然相交。

推导过程:

  • 线段所在直线方程的一般公式为:ax+by+c=0;线段两端点A(x1,y1)B(x2,y2),圆心O(x0,y0).

此处补充直线方程的五种形式:

一般式为ax+by+c=0,它的优点就是它可以表示平面上的任意一条直线,仅此而已.

斜截式y=kx+b,就不能表示垂直x轴的直线x=a.
点斜式y-y0=k(x-x0),也不能表示垂直x轴的直线x=a
两点式(y-y1)/(y2-y1)=(x-x1)/(x2-x1).不能表示两点x1=x2或y1=y2时的直线(即垂直或水平直线)
截距式x/a+y/b=1不能表示截距为0时的直线,比如正比例直线.

  • 所以根据两点式,可以求得a=y2-y1,b=x1-x2,c=x1y2-x2y1;
  • 在根据点到直线的距离公式:


再补充一下余弦定理:





这样的话,根据余弦定理的向量求法,CosA=(x0-x1)(x2-x1)+(y0-y1)(y2-y1)  (省略了分母部分,因为分母是正数)

直线的两个点都在圆外的模板:
bool judge(node a, node b)//判断线段是否与圆相交
{
    LL al, bl, cl, num1, num2;//化成ax+by+c=0,找到a,b,c的值
    if(a.x == b.x)
    {
        al=1, bl=0, cl=-a.x;
    }
    else if(a.y == b.y)
    {
        al=0, bl=1, cl=-a.y;
    }
    else
    {
        al = b.y - a.y;
        bl = a.x - b.x;
        cl = b.x*a.y - a.x*b.y;
    }
    //点到直线的距离,判断直线是否可以与圆相交
    num1 = al*c.x + bl*c.y + cl;
    num1 *= num1;
    num2 = r*r*(al*al+bl*bl);
    if(num2 < num1)
    {
        return 0;
    }
    //向量的计算
    LL angle1 = (c.x-a.x)*(b.x-a.x) + (c.y-a.y)*(b.y-a.y);//线段与圆是否相交的条件
    LL angle2 = (c.x-b.x)*(a.x-b.x) + (c.y-b.y)*(a.y-b.y);
    if(angle1>0 && angle2>0)
    {
        return 1;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值