vtk-对输入的三维模型在某个方向等间距提取模型的切面轮廓线

#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <vtkCutter.h>
#include <vtkPolyDataMapper.h>
#include <vtkPlane.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataWriter.h>
#include <vtkPolyData.h>
#include <vtkStripper.h>
#include <vtkContourFilter.h>
#include <vtkPoints.h>
#include <iostream>
using namespace std;

double Distance(double *a, double *b) {
    double o = (a[0] - b[0]) * (a[0] - b[0]);
    double p = (a[1] - b[1]) * (a[1] - b[1]);
    double q = (a[2] - b[2]) * (a[2] - b[2]);
    return o + p + q;
}

int main() {
    //读入stl看看效果图
    vtkSmartPointer<vtkSTLReader> reader =
        vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName("../data/xxxx.stl");
    reader->Update();

    vtkSmartPointer<vtkPolyData> inputPolyData = vtkSmartPointer<vtkPolyData>::New();
    inputPolyData = reader->GetOutput();

    vtkSmartPointer<vtkPolyDataMapper> inputMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    inputMapper->SetInputData(inputPolyData);//

    //创建切割平面
    vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New();
    plane->SetOrigin(inputPolyData->GetCenter());//设置切割平面起点
    plane->SetNormal(0, 1, 0); //设置切割方向为X方向

//得到输入的模型的最小坐标
    double minBound[3];
    minBound[0] = inputPolyData->GetBounds()[0];
    minBound[1] = inputPolyData->GetBounds()[2];
    minBound[2] = inputPolyData->GetBounds()[4];

//得到输入的模型的最小大坐标
    double maxBound[3];
    maxBound[0] = inputPolyData->GetBounds()[1];
    maxBound[1] = inputPolyData->GetBounds()[3];
    maxBound[2] = inputPolyData->GetBounds()[5];

//得到输入的模型的中心坐标
    double center[3];
    center[0] = inputPolyData->GetCenter()[0];
    center[1] = inputPolyData->GetCenter()[1];
    center[2] = inputPolyData->GetCenter()[2];
    cout << center[0] << "," << center[1] << "," << center[2] << endl;
    double distanceMin = sqrt(Distance(minBound, center));
    double distanceMax = sqrt(Distance(maxBound, center));


//创建模型切割器
    vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New();
    cutter->SetCutFunction(plane);//设置切割平面
    cutter->SetInputData(inputPolyData);//设置模型
    cutter->GenerateValues(5, -distanceMin, distanceMax);//在模型的最大最小范围内等间距创建30个切面,得到轮廓线


//将切线结果输出为vtk文件格式
    vtkSmartPointer<vtkPolyData> ResultPoly = cutter->GetOutput(); //输出为polydata
    vtkSmartPointer<vtkPolyDataWriter> vtkWriter = vtkSmartPointer<vtkPolyDataWriter>::New();
    vtkWriter->SetInputConnection(cutter->GetOutputPort());
    vtkWriter->SetFileName("../save/result.vtk");
    vtkWriter->Write();


    vtkSmartPointer<vtkPolyDataMapper> cutterMapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    cutterMapper->SetInputConnection(cutter->GetOutputPort());
    cutterMapper->ScalarVisibilityOff();

    vtkSmartPointer<vtkActor> planeActor =
        vtkSmartPointer<vtkActor>::New();
    planeActor->GetProperty()->SetColor(1, 0, 0);
    planeActor->GetProperty()->SetLineWidth(5);
    planeActor->SetMapper(cutterMapper);

    vtkSmartPointer<vtkActor> inputActor =
        vtkSmartPointer<vtkActor>::New();
    inputActor->GetProperty()->SetColor(1, 1, 1);//白色
    inputActor->SetMapper(inputMapper);
    inputActor->GetProperty()->SetOpacity(0.5);//透明度

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(planeActor);
    renderer->AddActor(inputActor);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(600, 600);

    vtkSmartPointer<vtkRenderWindowInteractor> interactor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);
    renderer->SetBackground(0.2, 0.3, 0.5);
    renderWindow->Render();

    interactor->Start();
    return 0;
}

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VTK中,可以使用vtkContourFilter类来显示三维模型的等值线。vtkContourFilter是一种数据过滤器,可以根据给定的等值参数从输入数据集中提取等值线。以下是使用vtkContourFilter显示三维模型的等值线的基本步骤: 1. 加载三维模型数据集并创建vtkPolyData对象。 2. 创建vtkContourFilter对象并设置等值参数。 3. 将vtkPolyData对象作为vtkContourFilter对象的输入。 4. 使用vtkPolyDataMapper和vtkActor将vtkContourFilter对象的输出映射到可视化管道中。 下面是一个简单的示例代码,演示如何在VTK中显示三维模型的等值线: ```python import vtk # 1.加载三维模型数据集并创建vtkPolyData对象 reader = vtk.vtkSTLReader() reader.SetFileName("example.stl") reader.Update() polydata = reader.GetOutput() # 2.创建vtkContourFilter对象并设置等值参数 contour = vtk.vtkContourFilter() contour.SetInputData(polydata) contour.SetValue(0, 0.5) # 设置等值参数为0.5 # 3.将vtkPolyData对象作为vtkContourFilter对象的输入 # 4.使用vtkPolyDataMapper和vtkActor将vtkContourFilter对象的输出映射到可视化管道中 mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(contour.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) # 创建可视化窗口和渲染器 renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) # 创建交互器并启动渲染 interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) interactor.Initialize() renderWindow.Render() interactor.Start() ``` 在上面的示例中,我们加载了一个STL格式的三维模型数据集,并使用vtkContourFilter提取了等值线。然后,我们将vtkContourFilter对象的输出映射到可视化管道中,并通过vtkRenderWindowInteractor启动渲染。在渲染窗口中,我们可以看到三维模型的等值线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值