c – boost :: geometry测量点到多边形环的最大/最小距离的最有效方法

我一直在程序中使用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库中是否有这样的东西?

最佳答案 我建议你可以使用内置策略来找到多边形和点之间的最小距离:

Live On Coliru

#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上请求它们将有助于将它们带到那里.

点赞