我正在使用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;}
}
}
我只是抑制了计算两倍相同距离的冗余;
答案 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最大距离的片段的点都将是两端之一。
顺便说一句,每一点?什么粒度?他们中有很多人!