我已使用CGAL Segment_Delaunay_graph为线段集合创建voronoi图。我想提取对应于voronoi细胞的Segment_Delaunay_graph的边缘。有为此目的的方法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()输出。我想保留代表连接的输入线周围的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();
}
答案 0 :(得分:0)
我观察到您要保留的红线。它们是不是远离交界处的边缘吗?您可以设置距离阈值 d ,如果边缘到其最近位置的距离小于 d 并且该位置不是交界点,则删除该边缘。 / p>