You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:17