线段与圆有三种位置关系,通过线段两个端点来看:
1:两个端点都在圆内, 一定不相交, 可以把两个点带入圆的方程判断 是否小于0
2:两个端点,一个在圆内,一个在圆外, 一定相交, 同样 点带入方程 判断
3:两个端点都在外面, 此时略微麻烦, 可以通过点到直线的距离来判断,但是当直线和圆心一条直线时,此时需要特别处理
光有距离判断是不行的. 要通过角度来判断.-->余弦方程 转换成向量表示
[代码实现]
可能比较难看懂, 因为坐标用的pair写的 frist是x,second是y
double x,y,r;
vector > V;
typedef pair PAIR;
PAIR yuan;
bool judge(PAIR P)// 判断是否在圆内
{
if( (P.first-x)*(P.first-x) + (P.second-y)*(P.second-y) -r*r <=0)
return 1;
return 0;
}
bool Judis(PAIR P1,PAIR P2,double R) //线段与圆的关系
{
if(judge(P1)&&judge(P2))//都在圆内 不相交
return false;
if(!judge(P1)&&judge(P2)||judge(P1)&&!judge(P2))//一个圆内一个圆外 相交
return true;
double A,B,C,dist1,dist2,angle1,angle2;//Ax+By+C=0;//(y1-y2)x +(x2-x1)y +x1y2-y1x2=0
if(P1.first==P2.first)
A=1,B=0,C= -P1.first;
else if(P1.second==P2.second)
A=0,B=1,C= -P1.second;
else
{
A = P1.second-P2.second;