c++ - 如何获取某些点的Voronoi图在QT中显示?

标签 c++ qt computational-geometry cgal voronoi

我在 QT 中的 QGraphicsScene 上绘制了一些点,并将它们封装到一个点类中。我想计算这些点的 Voronoi 图并将其显示到场景上。做这个的最好方式是什么?

我正在考虑使用 CGAL,但我找不到一个好的方法来做到这一点..

最佳答案

您需要显示的是仅限于矩形(您的显示窗口)的 Voronoi 图。这是一个简单的方法。

相关文档页面herethere .

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <iterator>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef K::Iso_rectangle_2 Iso_rectangle_2;
typedef K::Segment_2 Segment_2;
typedef K::Ray_2 Ray_2;
typedef K::Line_2 Line_2;
typedef CGAL::Delaunay_triangulation_2<K>  Delaunay_triangulation_2;

//A class to recover Voronoi diagram from stream.
//Rays, lines and segments are cropped to a rectangle
//so that only segments are stored
struct Cropped_voronoi_from_delaunay{
  std::list<Segment_2> m_cropped_vd;
  Iso_rectangle_2 m_bbox;

  Cropped_voronoi_from_delaunay(const Iso_rectangle_2& bbox):m_bbox(bbox){}

  template <class RSL>
  void crop_and_extract_segment(const RSL& rsl){
    CGAL::Object obj = CGAL::intersection(rsl,m_bbox);
    const Segment_2* s=CGAL::object_cast<Segment_2>(&obj);
    if (s) m_cropped_vd.push_back(*s);
  }

  void operator<<(const Ray_2& ray)    { crop_and_extract_segment(ray); }
  void operator<<(const Line_2& line)  { crop_and_extract_segment(line); }
  void operator<<(const Segment_2& seg){ crop_and_extract_segment(seg); }
};

int main(){
  //consider some points
  std::vector<Point_2> points;
  points.push_back(Point_2(0,0));
  points.push_back(Point_2(1,1));
  points.push_back(Point_2(0,1));

  Delaunay_triangulation_2 dt2;
  //insert points into the triangulation
  dt2.insert(points.begin(),points.end());
  //construct a rectangle
  Iso_rectangle_2 bbox(-1,-1,2,2);
  Cropped_voronoi_from_delaunay vor(bbox);
  //extract the cropped Voronoi diagram
  dt2.draw_dual(vor);
  //print the cropped Voronoi diagram as segments
  std::copy(vor.m_cropped_vd.begin(),vor.m_cropped_vd.end(),
    std::ostream_iterator<Segment_2>(std::cout,"\n"));
}

关于c++ - 如何获取某些点的Voronoi图在QT中显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8491177/

相关文章:

c++ - 如何监控 Qt Signal 事件队列深度

algorithm - 混淆Voronoi图算法(Fortune的sweepline)

algorithm - 以 x,y 位置的形式获取三角形内的位置列表

c++ - C++中不同程序元素的大小

c++ - 为什么使用具有某些类型特征的模板类型会导致模板推导失败

c++ - 线程使用 100% 的核心

c++ - Windows 7 上缺少相机服务

computational-geometry - 给定一个 Voronoi 图,找到它的位置

c++ - 读取文件抛出异常

android - 如何解决 android 和 ios 跨平台开发的#define 问题?