如何在CGAL中绘制SDG2对象对应的2D线段德劳内图
2D线段德劳内图(SDG2)可视化实现方案
方法1:用CGAL::Geomview_stream绘制对偶图
Segment_Delaunay_Graph_2的draw_dual函数完全支持CGAL::Geomview_stream作为输出目标,这是CGAL官方示例中常用的实时可视化方式,步骤如下:
- 编译时需链接CGAL的Geomview模块,CMakeLists.txt中需添加:
find_package(CGAL REQUIRED COMPONENTS Geomview) - 代码示例:
#include <CGAL/Segment_Delaunay_Graph_2.h> #include <CGAL/Segment_Delaunay_Graph_filtered_traits_2.h> #include <CGAL/Geomview_stream.h> typedef CGAL::Segment_Delaunay_Graph_filtered_traits_2<CGAL::Simple_cartesian<double>> Traits; typedef CGAL::Segment_Delaunay_Graph_2<Traits> SDG2; int main() { // 假设已创建并填充SDG2对象 sdg SDG2 sdg; // ... 填充线段数据 ... CGAL::Geomview_stream gv; gv.set_line_width(2); sdg.draw_dual(gv); // 将对偶图输出到Geomview窗口 gv << CGAL::flush; return 0; }
- 运行后会弹出Geomview窗口,显示线段德劳内图的对偶结构(即Voronoi图)
方法2:用CGAL Qt模块实现交互式可视化(更现代的选择)
若Geomview不符合需求,推荐使用CGAL的Qt模块,支持交互式缩放、平移等操作:
- 编译时需链接CGAL的Qt5/Qt6组件,CMakeLists.txt中添加:
find_package(CGAL REQUIRED COMPONENTS Qt5) - 核心思路是提取SDG2的几何元素,用Qt绘图API渲染:
#include <CGAL/Segment_Delaunay_Graph_2.h> #include <CGAL/Segment_Delaunay_Graph_filtered_traits_2.h> #include <CGAL/Qt/GraphicsViewNavigation.h> #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> typedef CGAL::Segment_Delaunay_Graph_filtered_traits_2<CGAL::Simple_cartesian<double>> Traits; typedef CGAL::Segment_Delaunay_Graph_2<Traits> SDG2; typedef Traits::Point_2 Point; typedef Traits::Segment_2 Segment; int main(int argc, char** argv) { QApplication app(argc, argv); SDG2 sdg; // ... 填充线段数据 ... QGraphicsScene scene; scene.setSceneRect(-50, -50, 100, 100); // 根据数据范围调整 // 绘制原始输入线段 for (auto seg : sdg.segments()) { Point p1 = seg.source(); Point p2 = seg.target(); scene.addLine(CGAL::to_double(p1.x()), CGAL::to_double(p1.y()), CGAL::to_double(p2.x()), CGAL::to_double(p2.y()), QPen(Qt::blue)); } // 绘制线段德劳内图的边 for (auto eit = sdg.finite_edges_begin(); eit != sdg.finite_edges_end(); ++eit) { auto v1 = eit->first->vertex((eit->second + 1) % 3); auto v2 = eit->first->vertex((eit->second + 2) % 3); Point p1 = v1->point(); Point p2 = v2->point(); scene.addLine(CGAL::to_double(p1.x()), CGAL::to_double(p1.y()), CGAL::to_double(p2.x()), CGAL::to_double(p2.y()), QPen(Qt::red, 2)); } QGraphicsView view(&scene); CGAL::Qt::GraphicsViewNavigation navigation; view.setNavigation(&navigation); view.show(); return app.exec(); }
方法3:导出为静态矢量文件(SVG/EPS等)
如果只需要静态可视化结果,可以将图形导出为矢量格式:
- 代码示例:
#include <CGAL/Segment_Delaunay_Graph_2.h> #include <CGAL/Segment_Delaunay_Graph_filtered_traits_2.h> #include <CGAL/SVG.h> #include <fstream> typedef CGAL::Segment_Delaunay_Graph_filtered_traits_2<CGAL::Simple_cartesian<double>> Traits; typedef CGAL::Segment_Delaunay_Graph_2<Traits> SDG2; int main() { SDG2 sdg; // ... 填充线段数据 ... std::ofstream out("sdg_dual.svg"); sdg.draw_dual(out, CGAL::SVG()); // 导出为SVG格式 out.close(); return 0; }
- 支持EPS、PDF等格式,需包含对应头文件(如
<CGAL/EPS.h>)
注意事项
- 确保CGAL版本支持对应模块,旧版本可能需要调整头文件路径
- 使用Geomview时,需提前安装Geomview软件(Linux发行版可通过包管理器安装,如
sudo apt install geomview)
内容的提问来源于stack exchange,提问作者Raphaël Baur
相关产品推荐
相关产品推荐

