#include <vtkSmartPointer.h> #include <vtkFeatureEdges.h> #include <vtkPolyData.h> #include <vtkDiskSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkOBJReader.h> #include <vtkOBJWriter.h> #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolygon.h> #include <vtkTriangle.h> #include <vtkCellArray.h> #include <vtkPolyData.h> #include <vtkUnsignedCharArray.h> #include <vtkPointData.h> #include <vtkCellData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkSmartPointer.h> #include <vtkPlaneSource.h> #include <vtkPolyData.h> #include <vtkFloatArray.h> #include <vtkCellData.h> #include <vtkLookupTable.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkStripper.h> #include <vtkCleanPolyData.h> #include <vtkDoubleArray.h> #include <vtkMergePoints.h> #include <iostream> #include <fstream> #include <ostream> #include <iomanip> using namespace std; #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); typedef vtkSmartPointer<vtkPoints> Vertices; int main() { //加载数据 std::string target_filename = "D:\\tooth_tata_lvsilin\\IOS_single_o\\IOS11_rb.obj"; vtkSmartPointer<vtkOBJReader> target_reader = vtkSmartPointer<vtkOBJReader>::New(); target_reader->SetFileName(target_filename.c_str()); target_reader->Update(); vtkSmartPointer<vtkPolyData> grid0 = target_reader->GetOutput(); // 提取边界边 vtkSmartPointer<vtkFeatureEdges> boundaryEdges = vtkSmartPointer<vtkFeatureEdges>::New(); boundaryEdges->SetInputData(grid0); boundaryEdges->BoundaryEdgesOn(); boundaryEdges->FeatureEdgesOff(); boundaryEdges->ManifoldEdgesOff(); boundaryEdges->NonManifoldEdgesOff(); boundaryEdges->Update(); 去除边 //vtkSmartPointer<vtkStripper> stripper = vtkSmartPointer<vtkStripper>::New(); //stripper->SetInputConnection(boundaryEdges->GetOutputPort()); //stripper->JoinContiguousSegmentsOn(); //stripper->Update(); 去除重合点 //vtkSmartPointer<vtkCleanPolyData> cleanPolyData = vtkSmartPointer<vtkCleanPolyData>::New(); //cleanPolyData->SetInputConnection(stripper->GetOutputPort()); //cleanPolyData->ConvertPolysToLinesOff(); //cleanPolyData->ConvertStripsToPolysOff(); //cleanPolyData->Update(); vtkSmartPointer<vtkPolyData> grid = boundaryEdges->GetOutput(); 获取边界点的坐标 //vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New(); //vtkPoints *pt = boundaryEdges->GetOutput()->GetPoints(); //for (int i = 0; i < pt->GetNumberOfPoints(); i) { // double *p = pt->GetPoint(i); // pts->InsertNextPoint(p); // //std::cout << p[0] << " "<< p[1]<<" "<< p[2]<<std::endl;///边界点坐标 //} /*vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); polyData->SetPoints(pts);*/ //polyData->SetVerts(vertices); //定义一个标量 vtkSmartPointer<vtkDoubleArray> colors = vtkSmartPointer<vtkDoubleArray>::New(); for (int i = 0; i < grid->GetNumberOfPoints(); i ) { colors->SetNumberOfValues(grid->GetNumberOfPoints()); colors->SetValue(i, 255); grid->GetPointData()->SetScalars(colors); } //定义标量,添加点数据的标量值,标量值为1 vtkSmartPointer<vtkDoubleArray> colors0 = vtkSmartPointer<vtkDoubleArray>::New(); for (int i = 0; i < grid0->GetNumberOfPoints(); i ) { colors0->SetNumberOfValues(grid0->GetNumberOfPoints()); colors0->SetValue(i, 1); //首先获取多边形数据的点数据指针,然后设置该点数据的标量属性值 grid0->GetPointData()->SetScalars(colors0); } for (int i = 0; i < grid->GetNumberOfPoints(); i ) { double weight = vtkDoubleArray::SafeDownCast(grid->GetPointData()->GetScalars())->GetValue(i);///输出索引号为i点的标量值 if (weight == 255) { vtkIdType point_ind = i; std::cout << "double weight: " << point_ind << std::endl; } } //vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); //mapper->SetInputData(grid); //mapper->SetScalarRange(0, 5); //mapper->SetLookupTable(lut); //vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::Ne();
//actor->SetMapper(mapper);
actor->GetProperty()->SetPointSize(3);
//vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
//render->AddActor(actor);
//render->SetBackground(0.0, 0.0, 0.0);
//vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
//rw->AddRenderer(render);
//rw->SetSize(320, 320);
//vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//rwi->SetRenderWindow(rw);
//rwi->Start();
return 0;
}