一般方法编程求直线与圆交点

用直线方程与圆方程联立求方程组解即可,使用时直接套用下面函数中公式即可,(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;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值