Я использовал CGAL Segment_Delaunay_graph для создания диаграммы voronoi для набора линейных сегментов.Я хотел бы извлечь края Segment_Delaunay_graph, которые соответствуют клеткам voronoi.Для этой цели существуют методы draw_dual () и draw_skeleton (), но оба включают некоторые дополнительные ребра, которые я не хочу сохранять (а draw_skeleton удаляет некоторые ребра, которые я хочу сохранить).
ВотИзображение, показывающее проблему:
Пример диаграммы Вороного
Черные линии являются входными данными.Как правило, они представляют собой группы из нескольких сегментов, соединенных сквозным образом, чтобы образовать более длинные линии, хотя каждый сегмент вводится в Segment_Delaunay_graph по отдельности, например так:
s 1677850.1951146198 466276.4198628192 1784307.2726912862 466276.4198628192
s 1784307.2726912862 466276.4198628192 1784307.2726912862 567677.3831007502
s 1784307.2726912862 567677.3831007502 1677850.1951146198 567677.3831007502
Красные и синие линии выводятся функцией draw_dual (),Я хочу сохранить красные линии, которые представляют границы вороной ячейки вокруг подключенных входных линий, но я не хочу сохранять синие линии. Можно ли отфильтровать нежелательные края на основе информации, хранящейся в Segment_Delaunay_graph?Если да, то как?
Пример кода:
#include <iostream>
#include <fstream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Segment_Delaunay_graph_filtered_traits_2.h>
#include <CGAL/Segment_Delaunay_graph_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Segment_Delaunay_graph_filtered_traits_2<K> Gt;
typedef CGAL::Segment_Delaunay_graph_2<Gt> SDG2;
using namespace std;
int main()
{
//read line segments from input file
string inFile = "example-a.in";
ifstream ifs(inFile);
SDG2 sdg;
SDG2::Site_2 site;
std::vector<SDG2::Site_2> sites;
while (ifs >> site) {
sites.push_back(site);
}
ifs.close();
//add line segments to diagram
sdg.insert(sites.begin(), sites.end(), CGAL::Tag_true());
//save voronoi edges to a file
string outFile = "example-a.out";
ofstream ofs(outFile);
sdg.draw_dual(ofs);
ofs.close();
}