圆的表示
struct Circle{
Point c; //圆心
double r; //半径
Circle(){}
Circle(Point _c,double _r):c(_c),r(_r){}
Circle(double x,double y,double _r){c=Point(x,y);r = _r;}
};
点、直线、线段与圆的关系
1. 点和圆的关系
点和圆有三种位置关系:
1.点在圆内
2.点在圆上
3.点在圆外
我们只要根据点到圆心的距离即可判断这三种位置关系。
int Point_circle_relation(Point p, Circle C)
{
double dst = Distance(p,C.c);
if(sgn(dst – C.r) < 0) return 0; //0 点在圆内
if(sgn(dst – C.r) ==0) return 1; //1 圆上
return 2; //2 圆外
}
2. 直线和圆的关系
关系:直线与圆相交、直线与圆相切以及直线在圆外
要确定具体关系,同样只要根据圆心到直线的距离判断即可。
int Line_circle_relation(Line v,Circle C){
double dst = Dis_point_line(C.c,v);
if(sgn(dst-C.r) < 0) return 0; //0 直线和圆相交
if(sgn(dst-C.r) ==0) return 1; //1 直线和圆相切
return 2; //2 直线在圆外
}
3. 线段和圆的关系
线段和圆有三种位置关系:
线段在圆内
线段和圆相切
线段在圆外
要确定具体关系,根据圆心到线段的距离来判断.
int Seg_circle_relation(Segment v,Circle C)
{
double dst = Dis_point_seg(C.c,v);
if(sgn(dst-C.r) < 0) return 0; //0线段在圆内
if(sgn(dst-C.r) ==0) return 1; //1线段和圆相切
return 2; //2线段在圆外
}
4. 直线和圆的交点
求直线和圆的交点,我们可以按下图所示
- 先求圆心c在直线上的投影q,再求得距离d。
- 然后根据 r 和 d 求出长度 k,
- 最后求出两个交点pa =q+n* k,pb= q - n*k,其中n是直线的单位向量。
//pa, pb是交点。返回值是交点个数
int Line_cross_circle(Line v,Circle C,Point &pa,Point &pb)
{
if(Line_circle_relation(v, C)==2) return 0;//无交点
Point q = Point_line_proj(C.c,v); //圆心在直线上的投影点
double d = Dis_point_line(C.c,v); //圆心到直线的距离
double k = sqrt(C.r*C.r-d*d);
if(sgn(k) == 0) //1个交点,直线和圆相切
{
pa = q;
pb = q;
return 1;
}
Point n=(v.p2-v.p1)/ Len(v.p2-v.p1); //单位向量
pa = q + n*k;
pb = q - n*k;
return 2; //2个交点
}