CGAL Вороной Диаграмма для сегментов - PullRequest
0 голосов
/ 29 ноября 2018

Я использовал 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();

}

1 Ответ

0 голосов
/ 31 января 2019

Я наблюдаю красные линии, которые вы хотите сохранить.Являются ли они краями, которые находятся далеко от сайтов, которые не являются точками пересечения?Вы можете установить порог расстояния d , если расстояние между ребром до его ближайшего сайта меньше, чем d , а сайт не является соединением, затем удалите это ребро.

...