繁体   English   中英

使用boost :: geometry :: intersects时的运行时错误

[英]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()吗?)。

如果满足所有前提条件,则可能是适应您的自定义类型。 如果改编调用了未定义的行为(例如,错误地返回了对临时人员的引用),那么所有投注都将关闭。

试验台

您可以调整此测试台以获取一些诊断信息:

生活在Coliru

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM