如何在boost :: geometry中找到2个多边形的触摸长度?

时间:2013-11-04 16:42:10

标签: c++ boost boost-geometry

我在boost :: geometry中有许多多边形,并希望从一个与第一个多边形具有最长公共边界的多边形中找到特定的邻居。多边形完全相互接触,因此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;

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

2 个答案:

答案 0 :(得分:1)

我不是数学家,我不知道boost :: geometry库,所以我应该给这个一个镜头。 : - )

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

首先,我要比较两个线段的单位向量,如果它们相等或完全相反,则这些线是平行的。

如果线是平行的,我将采用由A的一个点和B的一个点定义的线段(在任何一种情况下无关紧要),并计算其单位向量。如果该单位向量等于(或完全相反)上面的单位向量,则线段在同一无限线上。

如果是这种情况,我们可以很容易地发现线段的哪个(如果有的话)端点位于另一个端点内。即:如果A.point1在B.point1的左边,而B.point2在A.point1的左边,那么A.point1位于线段B上。(有助于绘制它。)

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

如果A完全位于B内,那些段的共享边界当然是A的长度。

否则找到A中的一个点与B中的一个点之间的最大长度,并从A和B的长度之和中减去该长度。

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

(注意我说过“等于”很多,我们当然会处理浮点算术,所以相等是一个稍微灵活的术语。)

答案 1 :(得分:0)

我相信在多边形触摸但不重叠的情况下,操作geometry::intersection将在out中生成一个空容器,但仍会返回true。这基本上是触摸的定义:没有内部交叉。

由于Boost.Geometry适用于室内设计,因此无法获得更多信息。

您真正想要的是将您的多边形视为库CGAL定义为Nef polygons的多边形。 CGAL提供了一个API,允许您将Nef Polygon作为两个Nef多边形的交集。如果操作数正在触摸,则结果将是多折线。

但是不要屏住呼吸,Nef操作速度较慢,API比Boost.Geometry更复杂;通过自己实现该功能,您可能会获得更好的结果。