算不明白了~ 求助是会帮忙计算一下。函数功能: 验证圆是否有效.
参 数: 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. 线段起点坐标; 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)));
}
《计算机图形学几何工具算法详解》
[美] Philip J.Schneider David H.Eberly 著
周长发 译
电子工业出版社
圆心到直线的具体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;
}
return true;
else
return false;线段横穿圆,或则在圆内,必然 lineCen < radii