[英]Run-time error when using boost::geometry::intersects
使用boost :: geometry :: intersects判断两个几何是否相交时,出现运行时错误,出现以下错误:
测试:/bigdisk/geo.algorithms/mason_packages/headers/boost/1.65.1/include/boost/geometry/policies/robustness/segment_ratio.hpp:54:静态bool boost :: geometry :: detail :: segment_ratio :: less :: apply(const Ratio&,const Ratio&)[with Ratio = boost :: geometry :: segment_ratio; Type = double]:断言`lhs.denominator()!= 0'失败。 第1行等于第2行:已中止
对我幼稚的眼睛来说,问题出在哪里并不明显。 如果有人有任何建议,我将不胜感激。
我已经将boost几何调整为适合自己的几何模型,并且在这种情况下boost的相交函数刚刚终止:
point<double, GCJ02LL> pt11{118.8031, 32.10011};
point<double, GCJ02LL> pt12{118.80297, 32.10016};
point<double, GCJ02LL> pt13{118.80284, 32.10021};
dataop::geometry::line_string<double, GCJ02LL> line1{pt11, pt12, pt13};
dataop::geometry::line_string<double, GCJ02LL> line2{pt11, pt12, pt13};
std::cout << "line1 intersects line2? : " << intersects(line1, line2) << std::endl;
您可以看到我的两个line_strings相同,但这不是问题,因为在其他情况下它运行良好。
更奇怪的是,在这种情况下,boost :: geometry :: equal也将中止,如下所示:
point<double, GCJ02LL> pt11{118.8031, 32.10011};
point<double, GCJ02LL> pt12{118.80297, 32.10016};
point<double, GCJ02LL> pt13{118.80284, 32.10021};
dataop::geometry::line_string<double, GCJ02LL> line1{pt11, pt12, pt13};
std::cout << "line1 equal line1? " << equal(line1, line1) << std::endl;
断言触发。 您的某些数据无效/不适合您要执行的操作。
具体而言,内部计算步骤遇到分母(q)为零的分数(p / q)。 那不会飞。
现在,造成这种情况的原因是无法满足的前提条件。
也许您的几何形状无效(您尝试过bg::is_valid()
吗?您是否看过bg::correct()
吗?)。
如果满足所有前提条件,则可能是适应您的自定义类型。 如果改编调用了未定义的行为(例如,错误地返回了对临时人员的引用),那么所有投注都将关闭。
您可以调整此测试台以获取一些诊断信息:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <iostream>
namespace bg = boost::geometry;
namespace bgm = bg::model;
int main() {
using P = bgm::d2::point_xy<double>;
P pt11{ 118.8031, 32.10011 };
P pt12{ 118.80297, 32.10016 };
P pt13{ 118.80284, 32.10021 };
bgm::linestring<P> line1{ pt11, pt12, pt13 };
bgm::linestring<P> line2{ pt11, pt12, pt13 };
std::string reason;
std::cout << std::boolalpha;
std::cout << "line1 valid? " << bg::is_valid(line1, reason) << " (" << reason << ")\n";
std::cout << "line2 valid? " << bg::is_valid(line2, reason) << " (" << reason << ")\n";
std::cout << "line1 intersects line2? : " << bg::intersects(line1, line2) << std::endl;
}
不用说,以上内容通过清除输出成功完成:
line1 valid? true (Geometry is valid)
line2 valid? true (Geometry is valid)
line1 intersects line2? : true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.