线段与圆的关系,该怎么解决
线段与圆的关系
算不明白了~ 求助是会帮忙计算一下。
函数功能: 验证圆是否有效.
参 数: 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)));
}
------解决方案--------------------
if (lineCen > = radii)
return true;
else
return false;
线段横穿圆,或则在圆内,必然 lineCen < radii
算不明白了~ 求助是会帮忙计算一下。
函数功能: 验证圆是否有效.
参 数: 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)));
}
------解决方案--------------------
if (lineCen > = radii)
return true;
else
return false;
线段横穿圆,或则在圆内,必然 lineCen < radii