在boost :: geometry中采用凸包的交叉点

时间:2014-04-18 15:38:36

标签: c++ boost convex-hull set-intersection boost-geometry

在使用浮点数进行多次尝试后,由于舍入问题导致了异常,我认为使用整数算法作为解决方法就可以了。但是,现在我遇到了完全相同的问题。

我正在尝试计算各种点集的凸包的交集:

#include <iostream>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/multi/geometries/multi_point.hpp>
#include <boost/geometry/geometries/polygon.hpp>

int main()
{
    typedef boost::geometry::model::d2::point_xy<int> Point;
    typedef boost::geometry::model::multi_point<Point> MultiPoint;
    typedef boost::geometry::model::ring<Point> Polygon;

    MultiPoint mp0, mp1;
    boost::geometry::read_wkt("MULTIPOINT((54 74),(54 75),(54 75),(62 75),(86 75),(94 75),(118 75),(124 75),(13 50),(13 51),(147 130),(281 51),(281 50))", mp0);
    boost::geometry::read_wkt("MULTIPOINT((52 74),(54 75),(135 90),(175 74),(54 74),(52 74))", mp1);

    Polygon hull0, hull1;
    boost::geometry::convex_hull(mp0, hull0);
    boost::geometry::convex_hull(mp1, hull1);

    std::vector<Polygon> results;
    boost::geometry::intersection(hull0, hull1, results);

    assert(results.size() == 1);

    // This results in the exception.
    assert(!boost::geometry::detail::overlay::has_self_intersections(results[0]));

    return EXIT_SUCCESS;
}

这与boost::geometry::overlay_invalid_input_exception失败。

凸包hull0hull1如下所示:

hull0 and hull1

我做错了吗?我真的很想不必自己实现计算凸包和交叉点,这似乎是很多不必要的容易出错的工作。

1 个答案:

答案 0 :(得分:1)

用例看起来不错。

我们有一些数值稳健性升级,但它们尚未发布(Boost 1.55)。如果您想测试它们或询问一些更详细的问题,我建议您在Boost.Geometry邮件列表上联系我们:http://lists.boost.org/mailman/listinfo.cgi/geometry