CPR曲面重建代码

废话不说,直接上代码:

#include "vtkAutoInit.h"
#include "vtkPolyData.h"
#include "vtkProbeFilter.h"
#include "vtkParametricFunctionSource.h"
#include "vtkParametricSpline.h"
#include "vtkDICOMImageReader.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkWindowLevelLookupTable.h"
#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkNamedColors.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageData.h"
#include "vtkDataSetMapper.h"VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);// 由曲线生成曲面vtkPolyData* SweepLine(vtkParametricFunctionSource* line, double direction[3], double distance, int cols)
{int rows = line->GetOutput()->GetNumberOfPoints(); //待生成的surface的行数为曲线上点的个数double spacing = distance / rows;           //列方向上的spacingvtkPolyData* surface = vtkPolyData::New();//生成点cols += 1;int numberOfPoints = rows * cols;       //surface内点的个数int numberOfPolys = (rows - 1) * (cols - 1);vtkPoints* points = vtkPoints::New();points->Allocate(numberOfPoints);vtkCellArray* polys = vtkCellArray::New();polys->Allocate(numberOfPolys);//生成每行每列的点坐标,double x[] = { 0.0, 0.0, 0.0 };int cnt = 0;for (int row = 0; row < rows; row++){for (int col = 0; col < cols; col++) {double p[3] = { 0.0,0.0,0.0 };line->GetOutput()->GetPoint(row, p);x[0] = p[0] + direction[0] * col * spacing;x[1] = p[1] + direction[1] * col * spacing;x[2] = p[2] + direction[2] * col * spacing;points->InsertPoint(cnt, x);cnt++;}}//生成四边形vtkIdType pts[4] = { 0,0,0,0 };for (int row = 0; row < rows - 1; row++){for (int col = 0; col < cols - 1; col++){pts[0] = col + row * cols;pts[1] = pts[0] + 1;pts[2] = pts[0] + cols + 1;pts[3] = pts[0] + cols;//   polys->InsertNextCell(4, pts);   //每临近的四个点构成一个单元polys->InsertNextCell(4, pts);}}surface->SetPoints(points);surface->SetPolys(polys);return surface;
}int main(int argc, char* argv[])
{char szInputFile[] = { "D:/imgdata/2013-06-04_dcm" };vtkDICOMImageReader* reader = vtkDICOMImageReader::New();reader->SetDataByteOrderToLittleEndian();reader->SetDirectoryName(szInputFile);reader->Update();int resolution = 100;int extent[2] = { 255, 255 };double thickness = 1.0;double spacing[2] = { 1.0, 1.0 };//自定义折线顶点坐标vtkPoints* points = vtkPoints::New();//(a,b,c,d)其中a表示序号,(b,c,d)表示点的坐标points->InsertPoint(0, 1.0, 0.0, 0.0);points->InsertPoint(1, 200, 100, 0.0);points->InsertPoint(2, 100, 200, 0.0);points->InsertPoint(3, 200, 300, 0.0);//将点插值逆合成一条曲线vtkParametricSpline* spline = vtkParametricSpline::New();spline->SetPoints(points);vtkParametricFunctionSource* splineFilter = vtkParametricFunctionSource::New();splineFilter->SetParametricFunction(spline);splineFilter->Update();//有曲线生成曲面double direction[] = { 0.0, 0.0, 1.0 };int distance = 160;vtkPolyData* surface = SweepLine(splineFilter, direction, distance, resolution);vtkProbeFilter* sampleVolume = vtkProbeFilter::New();//这里只能填1,和0,否则曲面要么是一块,要么什么也没有;sampleVolume->SetInputConnection(1, reader->GetOutputPort());sampleVolume->SetInputData(0, surface);//根据数据源的数据范围设置映射表的窗宽窗位vtkWindowLevelLookupTable* wlLut = vtkWindowLevelLookupTable::New();double range = reader->GetOutput()->GetScalarRange()[1] - reader->GetOutput()->GetScalarRange()[0];double level = (reader->GetOutput()->GetScalarRange()[1] - reader->GetOutput()->GetScalarRange()[0]) / 2;wlLut->SetWindow(range);wlLut->SetLevel(level);//创建映射器和角色vtkDataSetMapper* mapper = vtkDataSetMapper::New();mapper->SetInputConnection(sampleVolume->GetOutputPort());mapper->SetLookupTable(wlLut);mapper->SetScalarRange(0, 255);vtkActor* actor = vtkActor::New();actor->SetMapper(mapper);//创建渲染器,渲染窗口和交互vtkRenderer* ren = vtkRenderer::New();vtkRenderWindow* renWin = vtkRenderWindow::New();renWin->AddRenderer(ren);renWin->SetWindowName("CurvedReformation");vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();iren->SetRenderWindow(renWin);//将角色添加到场景ren->AddActor(actor);vtkNamedColors* colors = vtkNamedColors::New();// ren->SetBackground(colors->GetColor3d("DarkSlateGray"));ren->SetBackground(0.4, 0.4, 0.4);//设置相机以查看图像ren->GetActiveCamera()->SetViewUp(0, 0, 1);ren->GetActiveCamera()->SetPosition(0, 0, 0);ren->GetActiveCamera()->SetFocalPoint(1, 0, 0);ren->ResetCamera();//渲染和交互renWin->Render();iren->Start();return 0;
}

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java微信小程序校园自助打印系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

2024年江苏省13市科技企业上市培育计划入库企业申报条件程序和截止时间

一、江苏省13市科技企业上市培育计划入库企业申报条件 1.企业属于有效期内高新技术企业&#xff0c;申报时须在我省行政区域内成立三年以上&#xff0c;经营状况良好&#xff0c;已设立或拟设立为股份有限公司&#xff0c;且尚未在主板、创业板、科创板、北证上市或在“新三板…

计算机网络知识点(八)

目录 一、简述HTTP常见的响应状态码及其含义 1、解析 2、分类 二、简述GET请求和POST请求的区别 三、简述Cookie和Session的区别 四、简述HTTPS的加密与认证过程 一、简述HTTP常见的响应状态码及其含义 1、解析 ①200&#xff1a;从状态码发出的请求被服务器正常处理。 …

【开源项目】智慧北京案例~超经典实景三维数字孪生智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!

飞渡科技数字孪生北京管理平台&#xff0c; 依托实景数字孪生底座&#xff0c;以城市感知网络为硬件基础&#xff0c;以城市大数据为核心资源&#xff0c;以数字孪生、云计算、人工智能为关键技术&#xff0c;实现城市产业规划、资产安全管理、城市能耗监控等一体化空间融合。 …

CP AUTOSAR标准之FlexRayStateManager(AUTOSAR_CP_SWS_FlexRayStateManager)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块FlexRay状态管理器(FrSM)的功能、API和配置。   AUTOSAR BSW堆栈为每条通信总线指定一个总线特定状态管理器。该模块应实现相应总线的控制流。FrSM是通信服务层的成员。它与通信硬件抽象层和系统服务层交互。 3 相关文献 …

基于电商模式的性能测试(2) —— 使用Jmeter参数化功能+JSR223 PreProcessor+JSON Extractor完成注册登录的数据驱动

1、前置条件 此例使用的是GitHub上一个开源的电商项目mall&#xff0c;需要的可以去GitHub上下载部署&#xff0c;有详细的部署教程&#xff1a; GitHub地址&#xff1a;github.com/macrozheng/…部署教程&#xff1a;macrozheng.github.io/mall-learni… 2、场景抽离 首先要…

C#的无边框窗体项目模板 - 开源研究系列文章

继续整理和编写代码及博文。 这次将笔者自己整理的C#的无边框窗体项目的基本模板进行总结&#xff0c;得出了基于C#的.net framework的Winform的4个项目模板&#xff0c;这些模板具有基本的功能&#xff0c;即已经初步将代码写了&#xff0c;直接在其基础上添加业务代码即可&am…

java实现一个图的最短路径算法

import java.util.*; //java实现一个图的最短路径算法 public class Test_34 { // 定义一个常量INF&#xff0c;表示无穷大。private static final int INF Integer.MAX_VALUE; // 定义一个方法dijkstra&#xff0c;接受一个二维数组图和一个起始节点作为参数。public s…

七牛云 Miku 快直播,陪你一起看球!

足球&#xff0c;作为全球最受欢迎的运动之一&#xff0c;每一次大赛都是球迷心中的狂欢&#xff0c;每一场比赛都记录着足球历史的精彩。 2000 年&#xff0c;特雷泽盖的金球&#xff0c;照亮了法兰西的足球梦想。 2004 年&#xff0c;查理斯特亚斯的头槌破门&#xff0c;成就…

小甲鱼——集合

一什么是集合 type({}) <class dict> #字典 type({"one"}) <class set> #集合type({"one":1}) <class dict> #字典 跟集合一样&#xff0c;字典最大的特性就是——唯一性 即&#xff1a;集合中的所有元素&#xff0c;都应该是独…

第15天:Vue.js应用的测试和调试

第15天&#xff1a;Vue.js应用的测试和调试 目标 学习Vue.js应用的测试和调试方法&#xff0c;包括E2E&#xff08;端到端&#xff09;测试和单元测试。 任务概览 学习单元测试基础。探索E2E测试框架。实现Vue组件的测试。 详细步骤 1. 单元测试基础 单元测试是对应用中…

浅谈逻辑控制器之while控制器

浅谈逻辑控制器之while控制器 “While控制器”是一种高级控制结构&#xff0c;它允许用户基于特定条件来循环执行其下的子采样器或控制器&#xff0c;直至该条件不再满足。本文旨在详细介绍While控制器的功能、配置方法、使用场景以及实践示例&#xff0c;帮助测试工程师高效利…

上海市计算机学会竞赛平台2023年8月月赛丙组下降幂多项式

题目描述 &#x1d465;x 的 &#x1d458;k 次下降幂定义为 &#x1d465;(&#x1d458;)(&#x1d465;)(&#x1d465;−1)(&#x1d465;−2)⋯(&#x1d465;−&#x1d458;1)x(k)(x)(x−1)(x−2)⋯(x−k1) &#x1d465;x 的下降幂多项式是由 &#x1d465;x 的一组…

工信部中小企业局一行莅临盘古信息调研指导

近日&#xff0c;中小企业数字化转型城市试点调研交流活动在广东东莞举行&#xff0c;工业和信息化部中小企业局副局长商超&#xff0c;广东工业和信息化厅二级巡视员张振祥&#xff0c;工业和信息化部中小企业局创业创新处处长李海涛&#xff0c;东莞市委常委、副市长刘光滨&a…

泵设备的监测控制和智慧运维

泵是一种输送流体或使流体增压的机械。它通过各种工作原理&#xff08;如离心、柱塞等&#xff09;将机械能转换为流体的动能或压力能&#xff0c;从而实现液体的输送、提升、循环等操作。 泵的一些具体应用场景&#xff1a; 1.智能水务&#xff1a;在城市供水管网中&#xff…

【vuejs】 $on、$once、$off、$emit 事件监听方法详解以及项目实战

1. Vue实例方法概述 1.1 vm.$on vm.$on是Vue实例用来监听自定义事件的方法。它允许开发者在Vue实例上注册事件监听器&#xff0c;当事件被触发时&#xff0c;指定的回调函数会被执行。 事件监听&#xff1a;vm.$on允许开发者绑定一个或多个事件到Vue实例上&#xff0c;并且可…

python turtle 002代码表白

代码&#xff1a;pythonturtle002表白资源-CSDN文库 # 作者V w1933423 import turtle import mathdef draw_love():# 创建turtle画笔t turtle.pen()t turtle# 提起画笔&#xff0c;移动到起始位置t.up()t.goto(0, 150)t.down()# 设置颜色并开始填充t.color(red)t.begin_fill…

​中国9大流域地图SHP数据

九大流域片区是指中国境内九个主要流域片区。 分别包括东南诸河区、内陆河区、松辽河流区、海河流域区、淮河流域区、珠江流域片、西南诸河片、长江流域片和黄河流域片等。 如果这九大流域数据对你有用&#xff0c;请在文末查看该数据的领取方法。 中国9大流域图 流域&…

jeecg启动微服务并注册到本地nacos

1、maven勾选环境和微服务模式&#xff0c;并刷新 2、pom文件修改nacos注册地址 3、本地启nacos gateway 和自己想要的cloud下面的模块pos sys 4、打断点测试接口&#xff0c;访问gateway端口和想要测试的地址

借助 Cloudflare D1 和 Drizzle 在 Astro 上实现全栈

使用 Cloudflare D1 和 Drizzle ORM 将后端添加到 Astro 项目的分步指南 文章目录 安装 Astro添加 Cloudflare 适配器部署到 Pages安装 wrangler 并登录创建 D1 数据库创建 wrangler.toml 文件将 .wrangler 添加到 .gitignore更新 astro.config.ts安装 Drizzle 依赖项创建 driz…