我已经使用CGAL Segment_Dlaunay_graph为线段集合创建了voronoi图。我想提取与voronoi细胞相对应的Segment_Delanay_graph的边。为此,有两种方法draw_dual((和draw_skeleton((,但它们都包括一些我不想保留的附加边(并且draw_skereton删除了一些我确实想保留的边(。
这是一张显示问题的图片:
示例voronoi图
黑线是输入。它们通常是由几个段组成的组,端到端连接以形成更长的线,尽管每个段都被单独输入到segment_Dlaunchay_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_Delanay_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();
}
我观察到您想要保留的红线。它们是远离非交界点的边缘吗?您可以设置距离阈值d,如果边与其最近站点之间的距离小于d并且站点不是连接点,则删除此边。