/ / come trovare l'auto intersezione in un poligono usando boost /? - boost, poligono, geometria computazionale, set-intersezione

come trovare l'auto intersezione in un poligono usando boost /? - boost, poligono, geometria computazionale, set-intersezione

ho bisogno di trovare auto intersezioni in un poligono. so che boost ha quell'abilità. ma non riesco a capire come usare il turn_info per ottenere le informazioni sulle intersezioni, ad esempio quali segmenti sono intersecati e così via qualcuno può aiutare? Grazie

risposte:

1 per risposta № 1

Non è possibile, correttamente, perché i concetti definiti da Boost Geometry non consentono le intersezioni automatiche.

Tuttavia, indirettamente, è possibile utilizzare le funzionalità di convalida (nuove da quando penso 1.59) per ottenere alcune informazioni sull'autointersecazione:

std::string reason;
poly p;
bg::read_wkt("POLYGON((0 0, 0 4, 2 4, 2 2, 6 2, 6 6, 2 6, 2 4, 0 4, 0 8, 8 8, 8 0, 0 0))", expected);
bool ok = bg::is_valid(p, reason);
std::cout << "Expected: " << bg::dsv(p) << (ok?" valid":" invalid: "" + reason + """) << "n";

stampe:

Previsto: (((0, 0), (0, 4), (2, 4), (2, 2), (6, 2), (6, 6), (2, 6), (2, 4), (0, 4), (0, 8), (8, 8), (8, 0), (0, 0))) non valido: "La geometria ha intersezioni auto non valide. È stato trovato un punto di autointersezione a ( 0, 4); metodo: t; operazioni: x / u; ID segmento {source, multi, ring, segment}: {0, -1, -1, 0} / {0, -1, -1, 7} "


1 per risposta № 2

Quindi questo è il codice per ottenere le auto intersezioni.

namespace bg = boost::geometry;
using namespace std;
typedef bg::model::d2::point_xy<double> point_2d;
typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;

Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25, 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 }, { 10, 0 }, { 10, 10 } }};


typedef bg::point_type<Polygon>::type point_type;
typedef boost::geometry::detail::overlay::turn_info<point_type, boost::geometry::segment_ratio<double> > TurnInfoType;

bg::detail::no_rescale_policy robust_policy;
bg::detail::self_get_turn_points::no_interrupt_policy interrupt_policy;
std::vector<TurnInfoType> turns;

boost::geometry::self_turns<boost::geometry::detail::overlay::assign_null_policy>(poly.outer(), robust_policy, turns, interrupt_policy);

per ottenere le informazioni basta usare qualcosa come:

turns[i].operations[0].seg_id.segment_index