![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
is_valid (with failure value)Boost , Chapter 1. Geometry , is_valid
|
Тип |
Концепция |
Имя |
Описание |
---|---|---|---|
Geometry const & | Любой тип, выполняющий концепцию геометрии |
geometry | Модель указанного понятия |
validity_failure_type & |
failure | Значение перечисления, указывающее, является ли геометрия действительной или нет, и если оно недействительно, указывающее причину |
Возвращается истинно, если геометрия действительна (в смысле ОГК); кроме того, считаются действительными следующие геометрии: многогеометрии без элементов, линейные геометрии, содержащие шипы, ареальные геометрии с дублирующими (последовательными) точками
Либо
#include <boost/geometry.hpp>
Либо
#include <boost/geometry/algorithms/is_valid.hpp>
Функция is_valid не определяется OGC.
Геометрия |
статус |
---|---|
Точка | |
Сегмент | |
Box | |
Линия | |
Кольцо | |
Полигон | |
Многоточечный | |
Мультилинестринг | |
Мультиполигон | |
Variant |
Постоянное время для точек, сегментов, коробок и многоточечных
Линейный для линейных шнуров и многолинейных шнуров
Линеаритмический для колец
В настоящее время худший случай квадратичен для многоугольников и многополигонов.
Проверяет, действительна ли геометрия, и, если не действительна, проверяет, может ли она быть установлена bg::correct; если да, bg::correct вызывается геометрией.
#include <iostream> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> int main() { typedef boost::geometry::model::d2::point_xy<double> point_type; typedef boost::geometry::model::polygon<point_type> polygon_type; polygon_type poly; boost::geometry::read_wkt("POLYGON((0 0,0 10,10 10,10 0),(0 0,9 2,9 1,0 0),(0 0,2 9,1 9,0 0))", poly); std::cout << "original geometry: " << boost::geometry::dsv(poly) << std::endl; boost::geometry::validity_failure_type failure; bool valid = boost::geometry::is_valid(poly, failure); // if the invalidity is only due to lack of closing points and/or wrongly oriented rings, then bg::correct can fix it bool could_be_fixed = (failure == boost::geometry::failure_not_closed || boost::geometry::failure_wrong_orientation); std::cout << "is valid? " << (valid ? "yes" : "no") << std::endl; if (! valid) { std::cout << "can boost::geometry::correct remedy invalidity? " << (could_be_fixed ? "possibly yes" : "no") << std::endl; if (could_be_fixed) { boost::geometry::correct(poly); std::cout << "after correction: " << (boost::geometry::is_valid(poly) ? "valid" : "still invalid") << std::endl; std::cout << "corrected geometry: " << boost::geometry::dsv(poly) << std::endl; } } return 0; }
Результат:
original geometry: (((0, 0), (0, 10), (10, 10), (10, 0)), ((0, 0), (9, 2), (9, 1), (0, 0)), ((0, 0), (2, 9), (1, 9), (0, 0))) is valid? no can boost::geometry::correct remedy invalidity? possibly yes after correction: valid corrected geometry: (((0, 0), (0, 10), (10, 10), (10, 0), (0, 0)), ((0, 0), (9, 1), (9, 2), (0, 0)), ((0, 0), (2, 9), (1, 9), (0, 0)))![]()
Статья is_valid (with failure value) раздела Chapter 1. Geometry is_valid может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |