我一直在程序中使用boost :: geometry库,主要用于处理多边形对象.
我现在正在尝试优化我的代码,以便使用更大的多边形更好地扩展.我的一个函数检查给定的多边形和给定的点(通常在多边形内),点和多边形外环之间的最小和最大距离.
我通过循环多边形边来做到这一点:
polygon pol;
point myPoint;
double min = 9999999, max = 0;
for(auto it1 = boost::begin(bg::exterior_ring(pol)); it1 != boost::end(bg::exterior_ring(pol)); ++it1){
double distance = bg::distance(*it1, myPoint);
if(max < distance)
max = distance;
if(min > distance)
min = distance;
}
我希望有比这更快的算法,在边的多边形数量上是线性的. boost :: geometry库中是否有这样的东西?
最佳答案 我建议你可以使用内置策略来找到多边形和点之间的最小距离:
#include <boost/geometry.hpp>
#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/algorithms/distance.hpp>
namespace bg = boost::geometry;
using point = bg::model::d2::point_xy<double>;
using polygon = bg::model::polygon<point>;
int main() {
polygon pol;
boost::geometry::read_wkt(
"POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3)"
"(4.0 2.0, 4.2 1.4, 4.8 1.9, 4.4 2.2, 4.0 2.0))", pol);
point myPoint(7, 7);
double min = 9999999, max = 0;
std::cout << "Minimal distance: " << bg::distance(pol, myPoint);
}
打印
Minimal distance: 4.71699
进一步提示:
您应该考虑使用comparable_distance
. As you can see the sample there建议在所有采样距离上循环来对距离进行排序……所以我认为此时图书馆没有更好的产品.
计划更复杂的算法,其中一些可能与此问题有关:
> http://boost-geometry.203548.n3.nabble.com/distance-between-geometries-td4025549.html
>邮件列表主题http://lists.boost.org/geometry/2013/08/2446.php
>另一个在这里http://lists.boost.org/geometry/2013/09/2494.php
另请注意,Boost几何索引具有相关谓词Matched_distance_far,但尚未公开.
摘要
你现在可以在这里使用comparative_distance来改善至少一点.
已经计划了功能,看起来很有可能在邮件列表/ Boost Trac上请求它们将有助于将它们带到那里.