Boost::几何交集没有按预期工作
Boost::Geometry intersection not working as expected
我有一个小的测试应用程序,用boost::geometry相交几个矩形。
typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::cartesian
> point;
typedef boost::geometry::model::polygon<point > polygon;
polygon Intersect(polygon p1, polygon p2) {
std::vector < polygon > result;
boost::geometry::intersection(p1, p2, result);
return result.front();
}
polygon IntersectionTest() {
polygon one, two, three, four;
boost::geometry::read_wkt("POLYGON((35 25, 35 35, 15 35, 15 25, 35 25))", one);
boost::geometry::read_wkt("POLYGON((45 30, 45 50, 25 50, 25 30, 45 30))", two);
boost::geometry::read_wkt("POLYGON((50 0, 50 40, 10 40, 10 0, 50 0))", three);
boost::geometry::read_wkt("POLYGON((40 20, 40 60, 0 60, 0 20, 40 20))", four);
return Intersect(Intersect(Intersect(one, two), three), four);
}
我一定做错了什么,因为我期望结果是类似(35 30, 35 40, 25 40, 25 30, 35 30)
的东西,但我得到了10个点长的多边形,包含50 0
这样的点,而平行矩形的交叉点应该总是4+1点的矩形,50 0
在边缘,所以它根本不应该在交叉点上。如果我将其放入SVG中,矩形看起来就像我所期望的那样。
怎么了?如果它是一个bug在boost::geometry
我怎么能确定它是?(我目前使用的是1.48。)如果这是一个bug,有没有办法规避这个问题?
多边形类有以下模板参数:
template
<
typename Point,
bool ClockWise = true,
bool Closed = true,
template<typename, typename> class PointList = std::vector,
template<typename, typename> class RingList = std::vector,
template<typename> class PointAlloc = std::allocator,
template<typename> class RingAlloc = std::allocator
>
class polygon {...}
如您所见,第二个模板参数默认为true。这意味着定义多边形的点被认为是/应该是顺时针顺序。
这其实是你的问题。
如果你看一下几何的WKT形式你把点按逆时针顺序写下来
所以你应该:
typedef boost::geometry::model::polygon<point,false> polygon;
或者按顺时针顺序写WKT字符串中的点。即:
boost::geometry::read_wkt("POLYGON((35 25, 15 25, 15 35, 35 35, 35 25))", one);
boost::geometry::read_wkt("POLYGON((45 30, 25 30, 25 50, 45 50, 45 30))", two);
这样,结果将如您所期望的那样。
作为个人评论,如果read_wkt能在阅读时执行正确的方向,那将是一件好事…
我同意ds27680的答案。
第三种选择是在read_wkt之后调用boost::geometry::correct(A geometry),如果用户不确定方向,建议这样做。
read_wkt确实没有强制正确的方向。原因是正确的函数需要面积计算,如果用户知道多边形的顺序是正确的(通常是已知),可以节省面积计算。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- Python中的for循环与C++有何不同
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 这个数组交集的实现是如何工作的
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- Boost::几何交集没有按预期工作
- 为什么boost::geometry::交集不能正确工作