1

我正在编写一个函数,使用 boost::geometry 库给出先前定义的多边形的直径。

该直径定义为其两个点之间的最大距离。因此,我正在编写一个双循环,计算每对点的每个距离,但我不知道如何访问多边形内的点坐标,甚至是点对象,然后使用两个点之间的距离函数通过图书馆(顺便说一句,哪个应该更快?)。

在查看了多边形上的 Boost 文档后,我尝试了 my_polygon.PointList 没有成功......

最后我的解决方案是使用 Barend 提案的修改版本:

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly));
    ++it1)
{
    for(auto it2 = it1+1; 
        it2 != boost::end(boost::geometry::exterior_ring(poly));
        ++it2)
   {
       double distance = boost::geometry::distance(*it1, *it2);
       if(my_diameter < distance){my_diameter = distance;}
   }
}

我只是抑制了计算两次相同距离的冗余;

4

2 回答 2

3

多边形由环组成。你想有外环(外环)。可以使用 external_ring(aPolygon);

所以你可以使用类似这样的代码来迭代多边形的点(为简单起见,我使用自动,否则声明一个迭代器):

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly));
    ++it1)
{
    for(auto it2 = boost::begin(boost::geometry::exterior_ring(poly)); 
        it2 != boost::end(boost::geometry::exterior_ring(poly));
        ++it2)
   {
       // You might skip cases where it1==it2, distance is zero anyway
       double distance = boost::geometry::distance(*it1, *it2);
       // Compare with a max distance, if larger, assign, etc.
   }
}

(循环通常也会在内部环上循环,但如果多边形定义明确,则不需要直径)。

顺便说一句,关于您的问题:PointList 是模板参数的名称(请参阅文档)。成员函数是outer(),用于外环。上面的代码使用自由函数“exterior_ring”来使用多边形概念,它应该适用于 Boost.Geometry 中的任何多边形类型

于 2013-10-21T17:54:58.740 回答
0

您只能检查彼此之间的“角”距离,因为最大距离将在两个“角”之间。

只用一个点“A”和一个段来考虑它。您会看到,无论您如何放置线段,线段与 A 距离最大的点都将是两端之一。

顺便说一句,每个点?在什么粒度?有无数个!

于 2013-10-21T14:39:22.150 回答