Boost :: Geometry如何获取多边形内点的坐标?

时间:2013-10-21 14:03:17

标签: c++ boost boost-geometry

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

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

在查看Boost docs on polygon后,我尝试了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;}
   }
}

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

2 个答案:

答案 0 :(得分:3)

多边形由环组成。你想要外圈(外圈)。可以使用exterior_ring(aPolygon);

访问

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

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是模板参数的名称(参见doc)。对于外环,成员函数是outer()。上面的代码使用自由函数“exterior_ring”来使用Polygon概念,它应该适用于Boost.Geometry中的任何多边形类型

答案 1 :(得分:0)

您只能检查&#34;角落&#34;彼此之间的距离,因为最大距离将在两个角落之间,#34;。

只用一点来考虑它&#34; A&#34;和一个部分。您将看到,无论您如何放置片段,与A最大距离的片段的点都将是两端之一。

顺便说一句,每一点?什么粒度?他们中有很多人!