首页 > 基于VTK的Delaunay的三角剖分算法

基于VTK的Delaunay的三角剖分算法

实现效果:

开发环境:VS2015 + VTK5.10

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL) 
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "vtkCellArray.h"
#include "vtkInteractorStyleTrackballCamera.h"using namespace std;int main()
{ unsigned int gridSize = 20;vtkSmartPointer<vtkPoints> points =vtkSmartPointer<vtkPoints>::New();for (unsigned int x = 0; x < gridSize; x++){ for (unsigned int y = 0; y < gridSize; y++){ points->InsertNextPoint(x, y, vtkMath::Random(0.0, 3.0));}}vtkSmartPointer<vtkPolyData> polydata =vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);vtkSmartPointer<vtkDelaunay2D> delaunay =vtkSmartPointer<vtkDelaunay2D>::New();delaunay->SetInput(polydata);delaunay->Update();vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter =vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInput(polydata);glyphFilter->Update();vtkSmartPointer<vtkPolyDataMapper> pointsMapper =vtkSmartPointer<vtkPolyDataMapper>::New();pointsMapper->SetInput(glyphFilter->GetOutput());vtkSmartPointer<vtkActor> pointsActor =vtkSmartPointer<vtkActor>::New();pointsActor->SetMapper(pointsMapper);pointsActor->GetProperty()->SetPointSize(5);pointsActor->GetProperty()->SetColor(1, 0, 0);vtkSmartPointer<vtkPolyDataMapper> triangulatedMapper =vtkSmartPointer<vtkPolyDataMapper>::New();triangulatedMapper->SetInputConnection(delaunay->GetOutputPort());vtkSmartPointer<vtkActor> triangulatedActor =vtkSmartPointer<vtkActor>::New();triangulatedActor->SetMapper(triangulatedMapper);triangulatedActor->GetProperty()->SetColor(0, 0, 0);triangulatedActor->GetProperty()->EdgeVisibilityOn();triangulatedActor->GetProperty()->SetEdgeColor(1, 1, 1);int j = 0;vtkIdType npts, *pts;vtkCellArray* oCellArr = vtkCellArray::New();//输出每个三角形的索引,vtk是从左下角开始计数的//while (delaunay->GetOutput()->GetPolys()->GetNextCell(npts, pts)) { //	cout << "triangle [" << pts[0] << " " << pts[1] << " " << pts[2] <<//		"]" << endl;//}vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(pointsActor);renderer->AddActor(triangulatedActor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->SetSize(640, 640);renderWindow->Render();renderWindow->SetWindowName("PolyData Delaunay2D");vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();renderWindowInteractor->SetInteractorStyle(style);renderWindowInteractor->Initialize();renderWindowInteractor->Start();return 0;
}

如果想获得每个三角面片的顶点索引

vtkIdType npts, *pt_id;
bool 是否还有顶点 = delaunay->GetOutput()->GetPolys()->GetNextCell(npts, pt_id);
//npts是一个cell有多少的顶点,这里是三角形,所以是3;pt_id是位于同一个cell的几个顶点索引,大小为npts

如果是想获得每个三角面片的顶点位置:

vtkPoints *pt = delaunay_->GetOutput()->GetPoints();
double *p0 = pt->GetPoint(pt_id[0]);
double *p1 = pt->GetPoint(pt_id[1]);
double *p2 = pt->GetPoint(pt_id[2]);
//p0 是坐标数组,有p0[0],p0[1],p0[2]表示xyz的位置

如果想获得所有顶点数目

const int num = pt->GetNumberOfPoints();

如果想获得所有面片数目:

const int cells = delaunay_->GetOutput()->GetPolys()->GetNumberOfCells();

如果想删除顶点或面片

参考文献

C++/Python:

Ref. 1.

Ref. 2

Ref. 3

VTK:

Ref. 4

Ref. 5

Ref. 6

更多相关:

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...

  • 菜鸟一枚,正在学习C++ Gui Qt4,整理很零碎,欢迎批评指正   1.窗口标题: QWidget *window = new QWidget; window->setWindowTitle("Enter Your Age"); **************************************** 关于标题...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,较小的插入新链表指针之后,同时较小链表指针向后移动一位 实现如下: ListNode* mergeTwo...

  • 1.直接调用微软socket对象处理 static void Main(string[] args){try{IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });//在3721端口新建一个TcpListener对象TcpListener listener = new...

  •   现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。   ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务...

  • 前台到后台java时data日期类型的转化 在实体类中用@DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 @XmlElement(name="BeginDate") @DateTimeFormat(pattern="yyyy-MM-dd") private Date begin...