基于VTK的Delaunay的三角剖分算法
生活随笔
收集整理的這篇文章主要介紹了
基于VTK的Delaunay的三角剖分算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現效果:
開發環境:VS2015 + VTK5.10
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkDelaunay2D.h>
#include <vtkMath.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#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
總結
以上是生活随笔為你收集整理的基于VTK的Delaunay的三角剖分算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenMP使用指南
- 下一篇: 如何在CSDN MarkDown中居中显