c++ - 我如何在 boost::geometry 中找到 2 个多边形的接触长度?

标签 c++ boost boost-geometry

我在 boost::geometry 中有许多多边形,我想从一个与第一个多边形具有最长公共(public)边界的多边形中找到特定的邻居。多边形恰好相互接触,因此 boost::geometry::disjoint 返回 false,但以下代码始终返回周长 0:

typedef boost::geometry::model::d2::point_xy<double>      boost_pnt;
typedef boost::geometry::model::polygon<boost_pnt>        boost_poly;

boost_poly otherPol = ...;
boost_poly thisPol  = ...;

if(! boost::geometry::intersection(thisPol, otherPol, out))
    return -1;

float perimeter = 0;
BOOST_FOREACH(boost_poly const& p, out)
{
    perimeter += boost::geometry::perimeter(p);
}
return perimeter;

如何找到共同的“边界”,即两个多边形的接触长度?

最佳答案

我不是数学家,也不了解 boost::geometry 库,所以我应该试一试。 :-)

您需要将多边形 1 中的每条线段与多边形 2 中的每条线段进行比较。因此在每次比较中我们都有两条线段,A 和 B

首先,我比较两条线段的单位 vector ,如果它们相等,或者恰好相反,则这两条线是平行的。

如果直线是平行的,我将采用由 A 的一个点和 B 的一个点定义的线段(无论哪种情况都无关紧要),并计算其单位 vector 。如果该单位 vector 等于(或恰好相反)上面的单位 vector ,则线段在同一条无限线上。

如果是这种情况,我们可以很容易地找到一条线段的哪些(如果有)端点位于另一条线段的内部。即:如果A.point1在B.point1的左上方,B.point2在A.point1的左上方,则A.point1位于线段B上。(有助于绘制。)

请注意,其中一条线段可能完全位于另一条线段内 - 因此,如果 A 完全位于 B 内,则 B 的端点都不会位于 A 内。

在 A 完全位于 B 内的情况下,这些段的共享边界当然是 A 的长度。

否则求A中的一点和B中的一点之间的最大长度,并从A和B的长度之和中减去它。

boost::geomettry 中任何有帮助的特性,你都应该使用! :-)

(请注意,我多次提到“等于”,我们当然会处理浮点运算,因此“等于”是一个稍微灵活的术语。)

关于c++ - 我如何在 boost::geometry 中找到 2 个多边形的接触长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772581/

相关文章:

c++ - 这种使用模板的类层次结构的函数重载方式安全吗?

c++ - 错误 : Expected Identifier

c++ - boost 灵气 : Omit element in Kleene Star parser

c++ - boost 路口

c++ - 使用boost库查找交点

c++ - 在 boost 变体中使用相同的数据类型

c++ - 如何重载operator<<以与boost::program_options默认值输出一起使用?

c++ - 初始化 const boost multi_array

c++ - boost 几何交集给出奇怪的结果

c++ - 一个可能失败的函数应该返回什么?