当前位置: 首页 > 知识库问答 >
问题:

c++ - boost geometry库中的within和covered_by函数返回了错误的结果,这是怎么回事?

仰英发
2023-08-02
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(SLDPoint, double, bg::cs::cartesian, _GetX, _GetY, _SetX, _SetY)BOOST_GEOMETRY_REGISTER_RING(vector<SLDPoint>)bool check_covered = bg::covered_by(LineNodes[i]->_GetLine()->_GetPoints(), LineNodes[j]->_GetLine()->_GetPoints());cout<<check_covered<<endl;

我为covered_by函数传入了两个SLDPoint的数组。
其中第一个数组中的点为:

Point:(0.00000,-0.00000)Point:(15000.00020,-0.00000)Point:(15000.00020,1450.00000)Point:(0.00000,1450.00000)

第二个数组中的点为:

Point:(4174.83730,1450.02250)Point:(4185.07960,1450.02250)Point:(4258.50230,1450.02250)Point:(4331.92240,1450.02250)Point:(4342.16730,1450.02250)Point:(4342.16730,1440.02500)Point:(4342.16730,1430.02500)Point:(4342.16730,1420.02500)Point:(4342.16730,1410.02500)Point:(4331.92240,1410.02500)Point:(4258.50230,1410.02500)Point:(4185.07960,1410.02500)Point:(4174.83730,1410.02500)Point:(4174.83730,1420.02500)Point:(4174.83730,1430.02500)Point:(4174.83730,1440.02500)

结果check_covered的值居然是true,也就是说第一个图形在第二个图形里面??

图中有更直观的展示。整个这个大的矩形就是我输入的第1个数组所形成的封闭图形。而在它的上方有个非常非常小的矩形就是我输入的第2个数组所形成的封闭图形。这结果是不是不太对?我确定我没有弄反,其余几百个图形都判断正确,唯独这两个有问题。covered_by换成within也获得一样的结果,而且应该也不是浮点数精度的问题,我把它乘以10000并转换成int型还是得到一样的结果。

共有1个答案

韩明德
2023-08-02

Boost Geometry库中的within和covered_by函数在处理点坐标时需要满足一定的前提条件才能得到正确的结果。一般来说,它们要求传入的几何图形必须是有效的,即符合特定的几何学规则,比如多边形必须是封闭的,且顶点按逆时针或顺时针顺序排列。

从你提供的点坐标数据来看,第一个数组和第二个数组都是有效的封闭多边形,所以几何学上看起来应该是正确的。但由于很多情况下涉及浮点数精度问题,有时会导致几何关系判断出现误差。

解决此类问题的方法通常有两种:

检查输入几何图形的合法性: 确保输入的点坐标组成的多边形是封闭的,且顶点按正确的顺序排列(逆时针或顺时针)。可以使用Boost Geometry提供的函数来检查几何图形的合法性,例如bg::is_valid()。

增加浮点数容差: 可以在调用within和covered_by函数前,增加一些浮点数容差,使得在浮点数计算时可以容忍一定的误差。可以使用Boost Geometry提供的函数bg::strategy::buffer::distance_symmetric<double>来设置容差。

例如,在你的代码中可以尝试如下修改:

cpp
Copy code

include <boost/geometry/strategies/strategies.hpp>

include <boost/geometry/strategies/buffer.hpp>

include <boost/geometry/algorithms/covered_by.hpp>

namespace bg = boost::geometry;

// Define the strategy with a small tolerance, e.g., 0.001
typedef bg::strategy::buffer::distance_symmetric<double> DistanceStrategy;
DistanceStrategy distance_strategy(0.001);

bool check_covered = bg::covered_by(LineNodes[i]->_GetLine()->_GetPoints(), LineNodes[j]->_GetLine()->_GetPoints(), distance_strategy);
cout << check_covered << endl;
以上代码中,我们使用了bg::strategy::buffer::distance_symmetric<double>策略,并将容差设置为0.001。你可以根据实际情况调整这个容差值,使其在处理浮点数计算时可以容忍一定的误差。

注意:增加容差可能会导致更多的情况被判断为覆盖或包含关系,因此需要根据具体场景和数据来决定容差值的大小。如果容差值设置过大,可能会导致错误的结果。建议进行适度的测试和验证,确保得到的结果是符合预期的。

 类似资料:
  • 问题内容: 我正在尝试从CSV文件中的一组数字中找到最大值和最小值。我的代码在某些行中始终为Max函数返回错误的数字。这是我的代码: 我的输出示例: 我不确定我做错了什么。一些建议,将不胜感激。 问题答案: 您的列表元素是字符串。您需要对其进行转换,以避免按字典顺序进行比较(按字母顺序,一次只比较一个字符,这是因为) 除非您实际上想要字符串,否则不要创建新列表,而只需传递给您的函数即可:

  • 这是怎么回事?我不明白count()是如何既等于withCallback又有一个主体的;不知何故,它是在withCallback返回的dataframe上调用的,但我不明白语法。

  • 我在构建递归函数时继续遇到一个问题,其中返回的值与我期望返回的值不同。我很确定这与函数的递归性质有关,但我不知道发生了什么。 在这个缩小的例子中,我有一个带有字符串的函数foo和一个默认值为0的int。给定字符串“测试”并且没有整数,我希望递归函数为每个调用增加numberToBack并将新值传递给下一个调用。这一定是部分正确的,因为如果我在到达基本情况时cout numberToBack,我将获

  • 出于某种原因,在下面的递归函数中, 永远不递增p,也就是说字符串s永远不是一个回文,尽管在我的程序中,s确实是一个回文,次数相当少。但是在下面一行中它仍然返回false 是因为功能吗?s采用的一些值为:aaa、aba、AAAA、abbb、bab 我已确保s中没有前后空格 P、 S:我已经检查过了,x==n 示例输入: 输出0。回文:aaaaaa、abaaba、aaaaaa

  • 问题内容: 为什么这种尝试创建咖喱函数列表的方法不起作用? 这里发生了什么? 实际上执行我期望上述功能执行的功能是: 问题答案: 在Python中,在循环和分支中创建的变量没有作用域。您创建的所有函数都引用了相同的变量,该变量在循环的最后一次迭代中设置为。 解决方案是创建一个返回函数的函数,从而确定迭代器变量的范围。这就是该方法行之有效的原因。例如: