vtkCookieCutter
效果图
vtkCookieCutter:用一个或多个多边形切割二维平面上定义的vtkPolyData。
这里只设置了一个多边形进行切割
void CookieCutter()
{
//设置底图平面面
vtkSmartPointer<vtkPlaneSource> plane = vtkSmartPointer< vtkPlaneSource>::New();
plane->SetCenter(0.5, 0.5, 0.0);//平面中心的位置
plane->SetOrigin(0, 0, 0);//三个点中的起点
plane->SetPoint1(1, 0, 0);//三个点中的终点1
plane->SetPoint2(0, 1, 0);//三个点中的终点2
plane->SetXResolution(25);x方向上分成25段(相当于x方向有25个格子)
plane->SetYResolution(25);//y方向有25个格子
plane->Update();
vtkSmartPointer<vtkPolyDataWriter> w1_glyphData = vtkSmartPointer<vtkPolyDataWriter>::New();
w1_glyphData->SetFileName("plan.vtk");
w1_glyphData->SetInputData(plane->GetOutput());
w1_glyphData->Update();
w1_glyphData->Write();
// loops相当于闭合线
vtkSmartPointer<vtkPolyData> loops = vtkSmartPointer< vtkPolyData>::New();
vtkSmartPointer<vtkPoints> loopPts = vtkSmartPointer< vtkPoints>::New();
vtkSmartPointer<vtkCellArray> loopPolys = vtkSmartPointer< vtkCellArray>::New();
loops->SetPoints(loopPts);
loops->SetPolys(loopPolys);
loopPts->SetNumberOfPoints(4);
loopPts->SetPoint(0, 0.5, 1.0, 0.0);
loopPts->SetPoint(1, 0, 0.5, 0.0);
loopPts->SetPoint(2, 0.5, 0.0, 0.0);
loopPts->SetPoint(3, 1.0, 0.5, 0.0);
loopPolys->InsertNextCell(4);
loopPolys->InsertCellPoint(0);
loopPolys->InsertCellPoint(1);
loopPolys->InsertCellPoint(2);
loopPolys->InsertCellPoint(3);
vtkSmartPointer<vtkPolyDataWriter> w1 = vtkSmartPointer<vtkPolyDataWriter>::New();
w1->SetFileName("closedLine.vtk");
w1->SetInputData(loops);
w1->Update();
w1->Write();
// 裁剪结果
vtkSmartPointer<vtkCookieCutter> cookie = vtkSmartPointer< vtkCookieCutter>::New();
cookie->SetInputConnection(plane->GetOutputPort());
cookie->SetLoopsData(loops);
cookie->Update();
vtkSmartPointer<vtkPolyDataWriter> w1_cookie = vtkSmartPointer<vtkPolyDataWriter>::New();
w1_cookie->SetFileName("new_cookie.vtk");
w1_cookie->SetInputData(cookie->GetOutput());
w1_cookie->Update();
w1_cookie->Write();
vtkSmartPointer<vtkTriangleFilter> filter = vtkSmartPointer<vtkTriangleFilter>::New();
filter->SetInputData(cookie->GetOutput());
filter->Update();
vtkSmartPointer<vtkPolyDataWriter> w1_cookieTrianglefilter = vtkSmartPointer<vtkPolyDataWriter>::New();
w1_cookieTrianglefilter->SetFileName("cookieTrianglefilter.vtk");
w1_cookieTrianglefilter->SetInputData(filter->GetOutput());
w1_cookieTrianglefilter->Update();
w1_cookieTrianglefilter->Write();
//裁剪后三角剖分
vtkSmartPointer<vtkDelaunay2D> delanuy = vtkSmartPointer<vtkDelaunay2D>::New();
delanuy->SetInputData(cookie->GetOutput());
delanuy->Update();
vtkSmartPointer<vtkPolyDataWriter> w1_cookieDelanut = vtkSmartPointer<vtkPolyDataWriter>::New();
w1_cookieDelanut->SetFileName("cookieDelanuy.vtk");
w1_cookieDelanut->SetInputData(delanuy->GetOutput());
w1_cookieDelanut->Update();
w1_cookieDelanut->Write();
vtkSmartPointer<vtkPolyData> cookie_3D = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> newpoints = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolyData> inputPolyData = delanuy->GetOutput();
vtkPoints *inputpoints = inputPolyData->GetPoints();
int npts = inputpoints->GetNumberOfPoints();
double *x;
for (int i = 0; i < npts; i++) {
x = inputpoints->GetPoint(i);
x[2] = vtkMath::Random(0.0, 0.2);
newpoints->InsertNextPoint(x[0], x[1],x[2]);
}
cookie_3D->SetPoints(newpoints);
vtkSmartPointer<vtkPolyDataWriter> beforeWrite = vtkSmartPointer<vtkPolyDataWriter>::New();
beforeWrite->SetFileName("cookie_3D.vtk");
beforeWrite->SetInputData(cookie_3D);
beforeWrite->Update();
beforeWrite->Write();
}
输出结果: