2013-11-04 100 views
0

我在boost :: geometry中有多个多边形,并且想从一个与第一个多边形具有最长公共边界的多边形中找到特定的邻居。多边形正好互相接触,从而boost::geometry::disjoint返回false,但下面的代码总是返回周长0:如何在boost :: geometry中找到2个多边形的触摸长度?

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; 

我如何才能找到共同的“边界”,这两个多边形的接触长度是多少?

回答

1

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

你需要在多边形1每条线段所以在每个比较,我们有两个线段,A和B

首先比较每一线段在多边形2,我比较单元两条线段的向量,如果它们相等,或者完全相反,则这些线是平行的。

如果这些线是平行的,我会采用由A点中的一个点和B中的一个点定义的线段(无论哪种情况都无关紧要),并计算其单位向量。如果该单位矢量与上述单位矢量相等(或与之完全相反),则线段在同一无限长线上。

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

请注意,1条线段可能完全位于另一条线内 - 因此,如果A完全位于B内,则B将不具有位于A内的终点。在A完全位于B内的情况下,共享这些段的边界当然是A的长度

否则找到所述的一个点和在B中的点之间的最大长度,并且减去来自A的长度之和和B.

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

(请注意,我说:“等于”了不少,我们当然会处理浮点运算,从而平等是一个稍微灵活的术语。)

+0

由于似乎没有预定义的解决方案,我不得不建立自己的。谢谢你的帮助。好的灵感。 –

+0

@REDSOFTADAIR我很确定我已经用数学方法确定了这一点,是不是值得接受? :-) –

+0

我给了你一个投票。我仍然想知道是否有人直接在boost :: geometry中解决了这个问题。这是我的问题。 –

0

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

由于Boost.Geometry适用于室内设计,因此您无法从中获得更多收益。

你真正想要的是将你的多边形视为库CGAL定义为Nef polygons。 CGAL提供了一个API,它允许你获得Nef多边形作为两个Nef多边形的交集。在操作数触及的情况下,结果将是多折线。

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

相关问题