段的CGAL Voronoi图

时间:2018-11-29 18:31:19

标签: cgal

我已使用CGAL Segment_Delaunay_graph为线段集合创建voronoi图。我想提取对应于voronoi细胞的Segment_Delaunay_graph的边缘。有为此目的的方法draw_dual()和draw_skeleton(),但是它们都包含一些我不想保留的边(而draw_skeleton删除了一些我想保留的边)。

以下是显示问题的图像:

example voronoi diagram

黑线是输入。它们通常是端对端连接以形成更长的线的几个段的组,尽管每个段分别输入到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()输出。我想保留代表连接的输入线周围的voronoi细胞边界的红线,但我不想保留蓝线。 是否可以根据存储在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 :(得分:0)

我观察到您要保留的红线。它们是不是远离交界处的边缘吗?您可以设置距离阈值 d ,如果边缘到其最近位置的距离小于 d 并且该位置不是交界点,则删除该边缘。 / p>