算不明白了~ 求助是会帮忙计算一下。函数功能: 验证圆是否有效.
参       数: 1. 线段起点坐标; 2. 线段终点坐标; 3.圆心坐标; 4圆半径
返 回 值: 当圆与线段相交或者线段被圆包含返回False(无效圆),否则线段与圆相离和相切返回Ture(有效圆);
bool IsCircularityValid(PointF& line_b,PointF& line_e,PointF& center,float& radii)
{
        // 取得线段的起点坐标,终点坐标和圆心坐标组成的三角形三边边长
        float lineDis = GetPointDistance(line_b, line_e);    // 线段起点到线段终点的长度.
        float lineA    = GetPointDistance(line_b, center);   // 线段起点到圆心的长度.
        float lineB    = GetPointDistance(line_e, center);   // 线段终点到圆心的长度.         // 取得圆心垂直与线段的距离
        float p = (lineA+lineB+lineDis)/2;
        float lineCen = sqrt(p*(p-lineA)*(p-lineB)*(p-lineDis))*2/lineDis; // 取得垂直距离 if (lineCen>=radii)            
return true;   
else 
{
if (lineA > radii && lineB > radii)
                    return ture;              // 这里应该少了一成判断当线段横穿圆时没有排除。
else 
 return false;
}
}函数功能:取得2D平面内任意两点之间的距离
参       数:1.点坐标A ; 2 点坐标B;
返 回 值:返回两点之间的距离.
float GetPointDistance(const PointF& v2Pts_0, const PointF& v2Pts_1)
{
     return sqrt(abs((v2Pts_0.X-v2Pts_1.X)*(v2Pts_0.X-v2Pts_1.X) + 
              (v2Pts_0.Y-v2Pts_1.Y)*(v2Pts_0.Y-v2Pts_1.Y)));
}

解决方案 »

  1.   

    推荐一本图形方面的书,绝对有用:
    《计算机图形学几何工具算法详解》
    [美] Philip J.Schneider  David H.Eberly 著
    周长发 译
    电子工业出版社
      

  2.   

    这个简单
    圆心到直线的具体d,圆的半径r,直线的两端点到圆心为l1,l2,直线长为l
    if(d>r)
    {
    return true;
    }
    else if(d<r&&l1<r&&l2<r)
    {
    return true;
    }
    else if(d<r&&l1>r&&l2<r || d<r&&l1<r&&l2>r)
    {
    return false;
    }
    else if(l1*l1-r*r>l*l || l2*l2-r*r>l*l )
    {
    return true;
    }
    else
    {
    return false;
    }
      

  3.   

    if (lineCen >= radii)            
          return true;   
    else 
          return false;线段横穿圆,或则在圆内,必然 lineCen < radii