В настоящее время я использую C ++ GEOS API для перебора vector
typedef Points
(переменные члена x и y).
Я превращаю этот вектор в выпуклый корпус, создавая geos::geom::Geometry
объект, буферизация в 0, чтобы предотвратить самопересечение, а затем создание выпуклой оболочки.
Всякий раз, когда я отправляю объект, который уже является выпуклым, я получаю следующее утверждение: Assertion 'precisionModel' failed
,
Это ошибка GEOS? Нужно ли быть осторожным, чтобы не буферизовать выпуклый многоугольник?
geo_algos_test2: /tmp/libgeos/src/operation/buffer/BufferBuilder.cpp:373: geos :: geom :: Geometry * geos :: operation :: buffer :: BufferBuilder :: buffer (const geos :: geom :: Geometry * , double): утверждение `precisionModel ‘не удалось. *
Вот мой код:
// Remove self intersections or collinear points
geos::geom::GeometryFactory factory;
geos::geom::CoordinateSequence* temp =
factory.getCoordinateSequenceFactory()->create((std::size_t)0, 0);
// Convert vector of cruise points to GEOS
for (auto point : poly) {
temp->add(geos::geom::Coordinate(point.x, point.y));
}
// Add beggining point to create linear ring
temp->add(geos::geom::Coordinate(poly.begin()->x, poly.begin()->y));
// Create Linear Ring For Constructor
geos::geom::LinearRing* box = factory.createLinearRing(temp);
// Factory returns a pointer, dereference this
geos::geom::Geometry* GEOSPoly = factory.createPolygon(box, NULL);
// Remove Self Intersections and create Hull
return GEOSPoly->buffer(0); //line that causes assertion
Утверждение указывает, что ваш factory
и / или box
геометрия не имеет какого-либо экземпляра PrecisionModel
прилагается.
В текущем API GEOS C ++ конструктор по умолчанию недоступен, и вы создаете фабрику следующим образом:
auto factory = geos::geom::GeometryFactory::create()
Сейчас, factory
использует модель точности с плавающей точкой по умолчанию и factory->getPrecisionModel()
должен быть неnullptr
,
Любой экземпляр геометрии, созданный с geos::geom::GeometryFactory::create*
Семейство функций получает фабричную модель точности, а именно: box->getPrecisionModel()
возвращает указатель на тот же экземпляр PrecisionModel
учебный класс.
Других решений пока нет …