直线与圆的位置关系

直线和圆

现在有一条直线和一个圆。请写一个程序判断它们的位置关系。其中0代表直线和圆相离,1代表两者相切,2代表两者相交。

给定直线上的两个点(不重合)的坐标x1,y1,x2,y2,另外给定圆心坐标xc,yc和圆的半径r。请返回判断的结果(0或1或2)。

测试样例:
-1,-1,1,1,0,0,2
返回:2
时间限制:
1秒
内存限制:
32768KB

AC代码:
[c language=”++”]
class LineAndCircle {
public:

double cmpzero(double x)
{
double eps = 1e-9;
return fabs(x)<eps ? 0 : x;
}
//(x1,y1)和(x2,y2)是线段的两个点, (xc,yc)是圆心,r是半径
int judgeStat(double x1, double y1, int x2, int y2, int xc, int yc, int r) {
set<pair<double, double>> p;
double MIN_VALUE = 1e-8; //根据需要调整这个值
double X0 = xc, Y0 = yc;
double X1 = x1, Y1 = y1;
double X2 = x2, Y2 = y2;
double R = r;
double DX = X2 – X1, DY = Y2 – Y1;
double A = DX*DX + DY*DY;
double B = 2 * DX*(X1 – X0) + 2 * DY*(Y1 – Y0);
double C = (X1 – X0)*(X1 – X0) + (Y1 – Y0)*(Y1 – Y0) – R*R;
double DELTA = B*B – 4 * A*C;
int num = 0;
if (cmpzero(DELTA)>= 0)
{
double T1 = (-B – sqrt(DELTA)) / (2 * A);
double T2 = (-B + sqrt(DELTA)) / (2 * A);
p.insert({ X1 + T1*DX, Y1 + T1*DY });
p.insert({ X1 + T2*DX, Y1 + T2*DY });
}
return p.size();
}
};
[/c]

Leave a Reply

Your email address will not be published. Required fields are marked *