#ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkInteractionStyle) #endif #include <iostream> using namespace std; #include <vtkVersion.h> #include <vtkPolyData.h> #include <vtkProperty.h> #include <vtkMath.h> #include <vtkSmartPointer.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkImageData.h> #include <vtkGreedyTerrainDecimation.h> #include <vtkInteractorStyleTrackballCamera.h> #include <vtkInteractionWidgetsModule.h> void myShow(vtkGreedyTerrainDecimation* anInput) { vtkSmartPointer<vtkPolyDataMapper> aMapper=vtkSmartPointer<vtkPolyDataMapper>::New(); aMapper->SetInputConnection(anInput->GetOutputPort()); aMapper->ScalarVisibilityOn(); vtkSmartPointer<vtkActor> anActor=vtkSmartPointer<vtkActor>::New(); anActor->SetMapper(aMapper); anActor->GetProperty()->SetInterpolationToFlat(); anActor->GetProperty()->EdgeVisibilityOn(); anActor->GetProperty()->SetEdgeColor(1,0,0); vtkSmartPointer<vtkRenderer> ren1=vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renWin=vtkSmartPointer<vtkRenderWindow>::New(); ren1->AddActor(anActor); ren1->ResetCamera(); ren1->SetBackground(1,1,1); renWin->AddRenderer(ren1); renWin->SetSize(512,512); vtkSmartPointer<vtkRenderWindowInteractor> iren=vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); iren->Start(); } int main() { vtkSmartPointer<vtkImageData> image=vtkSmartPointer<vtkImageData>::New(); image->SetDimensions(120,120,1); image->AllocateScalars(VTK_UNSIGNED_CHAR,1); int dims[3]; // double max=sqrt(dims[0]*dims[0]+dims[1]*dims[1]); image->GetDimensions(dims); double R=100;//球面半径 double r=0;//任意x、y坐标点,到(0,0)点的距离 double r2=r*r; double rCrown=dims[0]/2; double rCrown2=rCrown*rCrown;//球冠半径的平方 double hmax2=R*R-rCrown2;//最大弧矢高的平方 double hmax=R-sqrt(hmax2);//最大弧矢高 for(double i=0;i<dims[0];i++) { for(double j=0;j<dims[1];j++) { unsigned char* pixel=static_cast<unsigned char*>(image->GetScalarPointer(i,j,0)); double x=(i-dims[0]/2),y=(j-dims[1]/2); r2=x*x+y*y; r=sqrt(r2); if(r<rCrown) //不知道为什么,要在后面多加一个最大弧矢高hmax,才能得到正确的球冠,大概是坐标方向问题吧 pixel[0]=sqrt(R*R-r2)-(R-hmax)+hmax; else pixel[0]=hmax; } } vtkSmartPointer<vtkGreedyTerrainDecimation>decimation=vtkSmartPointer<vtkGreedyTerrainDecimation>::New(); decimation->SetInputData(image); decimation->Update(); //可视化 myShow(decimation); return 0; }