用直线方程与圆方程联立求方程组解即可,使用时直接套用下面函数中公式即可,(x1,y1)(x2,y2)即为所求!
//下面这个函数得到交点,如果有2个就返回第一个求出的。
CPoint GetPoint(int cx,int cy,int r,int stx,int sty,int edx,int edy ){
//(x - cx )^2 + (y - cy)^2 = r^2
//y = kx +b
// 求得直线方程
double k = ((double)(edy - sty) ) / (edx - stx);
double b = edy - k*edx;
// 列方程
/*
(1 + k^2)*x^2 - x*(2*cx -2*k*(b -cy) ) + cx*cx + ( b - cy)*(b - cy) - r*r = 0
*/
double x1,y1,x2,y2;
double c = cx*cx + (b - cy)*(b- cy) -r*r;
double a = (1 + k*k);
double b1 = (2*cx - 2*k*(b - cy));
// 得到下面的简化方程
// a*x^2 - b1*x + c = 0;
double tmp = sqrt(b1*b1 - 4*a*c);
x1 = ( b1 + tmp )/(2*a);
y1 = k*x1 + b;
x2 = ( b2 - tmp)/(2*a);
y2 = k*x2 + b;
// 判断求出的点是否在圆上
double res = (x1 -cx)*(x1 -cx) + (y1 - cy)*(y1 -cy);
CPoint p;
if( (int)res == r*r) // 我这里 r = 50,res = 2500.632, 还是比较准确的
{
MessageBox("get it");
p.x = x1;
p.y = y1;
}
else
{
p.x = x2;
p.y = y2;
}
return p;
}