1.参数
2.主代码
#include "InitInclude.h"
#include <vtkQuadric.h>
#include <vtkSampleFunction.h>
#include <vtkContourFilter.h>
#include <vtkOutlineFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkImageData.h>
#include <vtkSmartPointer.h>
void Sphere();
//vtkSmartPointer<vtkActor> PlotFunction(vtkQuadric*quadric, double value);
//vtkSmartPointer<vtkActor> PlotFunction();
//装源及主机
vtkSmartPointer<vtkActor> sheyuan()
{
const int num_points = 4;
vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
double top_left[num_points][3] = {
{ 0, 2280 - 3200, 0 },
{ 0, 2280, 0 },
{ -2300, 2280, 0 },
{ -2300, 2280 - 3200, 0 }
};
double Hight = 2170.0;
// 几何数据 + 拓扑数据
polygonPoints->SetNumberOfPoints(num_points);
polygon->GetPointIds()->SetNumberOfIds(num_points);
for (int i = 0; i < num_points; ++i){
polygonPoints->SetPoint(i, top_left[i]);
polygon->GetPointIds()->SetId(i, i);
}
polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
polygonGrid->SetPoints(polygonPoints);
vtkNew<vtkDataSetSurfaceFilter> surface_filter;
surface_filter->SetInputData(polygonGrid);
surface_filter->Update();
vtkNew<vtkTriangleFilter> filter;
filter->SetInputData(surface_filter->GetOutput());
filter->Update();
// Apply linear extrusion(对平面进行拉伸成3D)
vtkSmartPointer<vtkLinearExtrusionFilter> extrude = vtkSmartPointer<vtkLinearExtrusionFilter>::New();
extrude->SetInputConnection(filter->GetOutputPort());
extrude->SetExtrusionTypeToNormalExtrusion();
extrude->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
extrude->SetScaleFactor(Hight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
bool isExtrude = true;
if (isExtrude)
{
polygonMapper->SetInputConnection(extrude->GetOutputPort());
}
else
{
polygonMapper->SetInputConnection(filter->GetOutputPort());
}
polygonMapper->ScalarVisibilityOff();
actor->SetMapper(polygonMapper);
actor->GetProperty()->SetOpacity(1.0);
actor->GetProperty()->SetColor(0.6, 0.2, 0.61);
return actor;
}
//床
vtkSmartPointer<vtkActor> chuang()
{
const int num_points = 4;
vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
double chuangkuan_danbian = 800;//图纸显示为935mm
double top_left[num_points][3] = {
{ 0, -1*chuangkuan_danbian, 0 },
{ 2360, -1 * chuangkuan_danbian, 0 },
{ 2360, chuangkuan_danbian, 0 },
{ 0, chuangkuan_danbian, 0 },
};
double ChangHight = 851;
// 几何数据 + 拓扑数据
polygonPoints->SetNumberOfPoints(num_points);
polygon->GetPointIds()->SetNumberOfIds(num_points);
for (int i = 0; i < num_points; ++i){
polygonPoints->SetPoint(i, top_left[i]);
polygon->GetPointIds()->SetId(i, i);
}
polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
polygonGrid->SetPoints(polygonPoints);
vtkNew<vtkDataSetSurfaceFilter> surface_filter;
surface_filter->SetInputData(polygonGrid);
surface_filter->Update();
vtkNew<vtkTriangleFilter> filter;
filter->SetInputData(surface_filter->GetOutput());
filter->Update();
// Apply linear extrusion(对平面进行拉伸成3D)
vtkSmartPointer<vtkLinearExtrusionFilter> extrude = vtkSmartPointer<vtkLinearExtrusionFilter>::New();
extrude->SetInputConnection(filter->GetOutputPort());
extrude->SetExtrusionTypeToNormalExtrusion();
extrude->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
extrude->SetScaleFactor(ChangHight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
bool isExtrude = true;
if (isExtrude)
{
polygonMapper->SetInputConnection(extrude->GetOutputPort());
}
else
{
polygonMapper->SetInputConnection(filter->GetOutputPort());
}
polygonMapper->ScalarVisibilityOff();
actor->SetMapper(polygonMapper);
actor->GetProperty()->SetOpacity(0.7);
actor->GetProperty()->SetColor(0.8, 0.8, 0.8);
return actor;
}
void GammaKnife()
{
vtkSmartPointer<vtkActor> actorzhuji = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkActor> actorChang = vtkSmartPointer<vtkActor>::New();
//vtkSmartPointer<vtkActor> actorPlotFunction = vtkSmartPointer<vtkActor>::New();
vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
actorzhuji = sheyuan();
actorChang = chuang();
//actorPlotFunction = PlotFunction();
render->AddActor(actorzhuji);
render->AddActor(actorChang);
//render->AddActor(actorPlotFunction);
render->SetBackground(1, 1, 1); // Background color dark blue
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
//vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(render);
renWin->SetSize(1024, 768);
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Initialize();
iren->Start(); //blog.csdn.net/liushao1031177/article/details/118443631
}
//int main1()
//{
// Sphere();
// return 0;
//}
//
//void Sphere()
//{
// vtkSmartPointer<vtkQuadric>quadric = vtkSmartPointer<vtkQuadric>::New();
// quadric->SetCoefficients(200, 200, 120, 0, 0, 0, 0, 0, 0, 0);
//
// // F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 + a3*x*y + a4*y*z + a5*x*z + a6*x + a7*y + a8*z + a9
// // F(x,y,z) = 1*x^2 + 1*y^2 + 1*z^2
// //PlotFunction(quadric, 1);
// PlotFunction( );
//}
//
////vtkSmartPointer<vtkActor> PlotFunction(vtkQuadric *quadric, double value)
//vtkSmartPointer<vtkActor> PlotFunction( )
//{
//
// vtkSmartPointer<vtkQuadric>quadric = vtkSmartPointer<vtkQuadric>::New();
// quadric->SetCoefficients(0.5, 0.5, 0.4, 0, 0, 0, 0, 0, 0, 0);
// double value = 1;
//
// //采样二次函数
// vtkSmartPointer<vtkSampleFunction>sample = vtkSmartPointer<vtkSampleFunction>::New();
// sample->SetSampleDimensions(150, 150, 150);
// sample->SetImplicitFunction(quadric);
// //x,y,z取值范围
// double xmin = -2, xmax = 2, ymin = -2, ymax = 2, zmin = 0, zmax = 2;
// //double scale = 0.2;
// sample->SetModelBounds(xmin, xmax, ymin, ymax, zmin, zmax);
// //创建5个曲面surfaces F(x,y,z) = constant
//
// /*vtkContourFilter*contours=vtkContourFilter::New();
// contours->SetInputData(sample->GetOutput());
// contours->GenerateValues(5,0,1.2);*/
// //创建第0 isosurface
// vtkSmartPointer<vtkContourFilter>contours = vtkSmartPointer<vtkContourFilter>::New();
// contours->SetInputConnection(sample->GetOutputPort());
// contours->GenerateValues(1, value, value);
// //将contours映射到图形图元
// vtkSmartPointer<vtkPolyDataMapper>contourMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// contourMapper->SetInputConnection(contours->GetOutputPort());
// contourMapper->SetScalarRange(0, 1.2);
// //创建contour演员
// vtkSmartPointer<vtkActor>contourActor = vtkSmartPointer<vtkActor>::New();
// contourActor->SetMapper(contourMapper);
// /*创建一个方盒,将函数曲面包围起来,标识抽样体*/
// ////创建方盒的边看线
// //vtkSmartPointer<vtkOutlineFilter>outline = vtkSmartPointer<vtkOutlineFilter>::New();
// //outline->SetInputConnection(sample->GetOutputPort());
// ////将线框映射为图形图元
// //vtkSmartPointer<vtkPolyDataMapper>outlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// //outlineMapper->SetInputConnection(outline->GetOutputPort());
// //创建outline演员
// vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
// outlineActor->SetMapper(contourMapper);
// //outlineActor->SetMapper(outlineMapper);
// outlineActor->GetProperty()->SetColor(0, 0, 0);
// return outlineActor;
//
// ////创建显示窗口
// //vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
// //vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
// //renWin->AddRenderer(ren1);
// //vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
// //iren->SetRenderWindow(renWin);
// ////在场景中添加演员
// //ren1->AddActor(contourActor);
// //ren1->AddActor(outlineActor);
// //ren1->SetBackground(1, 1, 1);
// ////渲染 互动
// //renWin->Render();
// //iren->Start();
//}
3.效果