最有效的测量点到多边形环的最大/最小距离的方法
boost::geometry Most efficient way of measuring max/min distance of a point to a polygon ring
我一直在一个程序中使用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
首先对距离进行排序。正如你所看到的,这里的样本显示了所有采样距离的循环…所以我认为图书馆在这个时候没有更好的服务了。
更复杂的算法被计划,其中一些可能与这个问题有关:
- 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 Geometry Index有一个相关的谓词comparable_distance_far
,但它尚未暴露。
你现在至少可以通过使用comparable_distance来提高一点。
功能已经计划好了,看起来很有可能在邮件列表/Boost Trac中请求它们将有助于实现它们。
为了获得最佳性能,您应该使用带有boost::geometry::index的RTree。创建RTree是有代价的,但是计算一个点到任何(多)多边形环的距离会快得多。示例代码:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <iostream>
#include <vector>
int main()
{
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::polygon<point> polygon;
point p{ 0, 0 };
// create some polygon and fill it with data
polygon poly;
double a = 0;
double as = bg::math::two_pi<double>() / 100;
for (int i = 0; i < 100; ++i, a += as)
{
double c = cos(a);
double s = sin(a);
poly.outer().push_back(point{10 * c, 10 * s});
poly.inners().resize(1);
poly.inners()[0].push_back(point{5 * c, 5 * s});
}
// make sure it is valid
bg::correct(poly);
// create rtree containing objects of type bg::model::pointing_segment
typedef bg::segment_iterator<polygon const> segment_iterator;
typedef std::iterator_traits<segment_iterator>::value_type segment_type;
bgi::rtree<segment_type, bgi::rstar<4> > rtree(bg::segments_begin(poly),
bg::segments_end(poly));
// get 1 nearest segment
std::vector<segment_type> result;
rtree.query(bgi::nearest(p, 1), std::back_inserter(result));
BOOST_ASSERT(!result.empty());
std::cout << bg::wkt(result[0]) << ", " << bg::distance(p, result[0]) << std::endl;
return 0;
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 在C++中从距离矩阵创建索引向量的最快方法
- 计算包含高维向量的两个矩阵之间的最小欧氏距离的最快方法
- 使用 DirectXMath 获得 2 点之间距离的最佳方法是什么
- 计算距离:方法"must return a value" ?
- 在OpenCV的距离变换方法上使用CV_DIST_USER时如何设置距离变换公式?
- 最有效的测量点到多边形环的最大/最小距离的方法
- 有没有一种有效的方法来确定距离
- 确定景观中所有点与具有特定属性的点之间距离的最快方法