Взятие пересечений выпуклых оболочек в наддуве :: геометрия

После нескольких попыток использования чисел с плавающей запятой, которые приводили к диким исключениям из-за проблем с округлением, я решил использовать целочисленную арифметику в качестве обходного пути. Однако сейчас я сталкиваюсь с точно такой же проблемой.

Я пытаюсь вычислить пересечение выпуклых оболочек различных наборов точек:

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

Выпуклые корпуса hull0 а также hull1 выглядеть так:

hull0 и hull1

Есть ли что-то, что я делаю не так? Мне бы очень хотелось, чтобы мне не приходилось самим выполнять вычисления выпуклой оболочки и пересечений, что кажется ненужной работой, склонной к ошибкам.

1

Решение

Вариант использования выглядит хорошо.

У нас есть некоторые улучшения числовой устойчивости, но они еще не выпущены (Boost 1.55). Если вы хотите проверить их или задать более подробные вопросы, я предлагаю связаться с нами в списке рассылки Boost.Geometry: http://lists.boost.org/mailman/listinfo.cgi/geometry.

1

Другие решения