使用C#开发VTK笔记(三)-使用VTK创建可视化界面和简单点线面体模型

news2025/2/8 4:24:43

一.使用VTK创建可视化界面

1.创建C#可视化界面

  1. 使用Visual Studio 2022用.net 8.0创建窗体应用
    )
  2. 放入两个水平分割的Panel左侧演示VTK 右侧放按钮
    在这里插入图片描述
  3. 按照第一章节环境搭建的步骤,加入对应Kitware的dll并导入依赖
    在这里插入图片描述

2.初始化Vtk窗口

  1. 引用Kitware.VTK,Form1_Load中,创建渲染窗口控件renderWindowControl并加入窗口Panel的Controls中。 获取窗口的第一个渲染器到render,设置好背景颜色SetBackground。启动窗体,就显示Vtk窗口了。
    这里背景色可以SetBackground和SetBackground2组合设置一个渐变色。
using Kitware.VTK;
namespace VtkPlatform
{
   
    public partial class Form1 : Form
    {
   
        //初始化并创建静态变量控件renderWindowControl避免被系统进程kill
        public static Kitware.VTK.RenderWindowControl xRenderWindowControl=new RenderWindowControl() ;     
        public Form1()
        {
   
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
   
            this.splitContainer1.Panel1.Controls.Add(xRenderWindowControl);
            vtkRenderer xRenderer = xRenderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
            xRenderer.SetBackground(0, 0.5, 0);
        }
        public vtkRenderer GetVtkRenderer()
        {
   
            vtkRenderer Renderer = xRenderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
            return Renderer;
        }
        private void button1_退出_Click(object sender, EventArgs e)
        {
   
            this.Dispose();
        }
    }
}

显示窗口:
在这里插入图片描述

  1. 设置坐标系和操作类
    通过vtkAxesActor 创建坐标轴的Actor,并设置长度,形状,位置后加入Renderer,坐标轴就显示了。
 //创建坐标轴
 vtkAxesActor axes = vtkAxesActor.New();      
 axes.SetXAxisLabelText("X");
 axes.SetYAxisLabelText("Y");
 axes.SetZAxisLabelText("Z");
 axes.SetTotalLength(10, 10, 10);  //设置箭头长度
 axes.SetShaftTypeToCylinder();// 设置箭头形状
 //在3维坐标系中设置各轴的长度。
 axes.SetOrigin(0, 0, 0);
 //axes.AxisLabelsOff();
 //禁用绘制轴标签。
 xRenderer.AddActor(axes);
 vtkCamera camera = xRenderer.GetActiveCamera();
 //camera.Zoom(1.5);
 xRenderer.ResetCamera();

并且这个轴系自带了交互功能,生成以后,就可以进行平移,旋转,缩放了。
在这里插入图片描述

二.使用VTK创建简单点线面体模型

2.1 创建一个点

这里需要注意的是,点实际是由一个vtkPoints创建的,然后需要进一步实例化为Polydata也就是VTK的基本对象之一,由点Point,顶点Vert,直线Line,多折线Polyline,面plane,三角带(triangle strip),多边形等显示组成,具体规范的分类可以查看手册及OpenGL定义。
创建一个点,就需要vtkPoints对象增加一个点,同时新建一个vtkCellArray队列,每增加一个点,vtkCellArray要步进1格,并将PointId放进去。
创建PolyData后,设置点集合SetPoints,设置顶点集合SetVerts。这里只有一个点就比较简单了。
vMapper.SetInputData(polyData); Mapper这里输入的是PolyData,是因为我们构建了PolyData类型的数据进行输入,下面可以看到还可以用其它形式。
创建PolyData流程:
在这里插入图片描述

  private void btn_创建一个点_Click(object sender, EventArgs e)
  {
   
      vtkRenderer xRenderer = GetVtkRenderer();
      vtkPoints vPoints = new vtkPoints();
      vtkCellArray vCellArray = new vtkCellArray();

      //插入点,1是序号,后面是xyz
      //vtkPoints可以放很多点,不管是一个还是多个,都要转换为PolyData的Vert顶点才能显示
      long PointId1 = vPoints.InsertNextPoint(0, 0, 20);
      //顶点序列以1步进
      vCellArray.InsertNextCell(1);
      vCellArray.InsertCellPoint(PointId1);
    
      vtkPolyData polyData = new vtkPolyData();
      polyData.SetPoints(vPoints);
      polyData.SetVerts(vCellArray);

      vtkPolyDataMapper vMapper = new vtkPolyDataMapper();
      vMapper.SetInputData(polyData);
      vtkActor vptActor = new vtkActor();

      vptActor.GetProperty().SetColor((float)255 / 255, (float)255 / 255, (float)0 / 255);
      vptActor.GetProperty().SetPointSize(10);
      vptActor.SetMapper(vMapper);
      xRenderer.AddActor(vptActor);
      xRenderer.ResetCamera();
      xRenderer.GetRenderWindow().Render();
      MessageBox.Show("创建完成!");
  }

创建完成后,显示效果如下:
在这里插入图片描述

2.2 创建多个点

了解了怎么创建一个点,就很容易创建多个点,也就是多增加几个点就行了。
这里为提现多个点的可扩充性,使用坐标数列为输入,这样一次性输入n个点也是一样显示的。

  private void btn_创建多个点_Click(object sender, EventArgs e)
  {
   
      vtkRenderer xRenderer = GetVtkRenderer();
      vtkPoints vPoints = new vtkPoints();
      vtkCel

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

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

相关文章

ctrl键和大写键互换解决方法

电脑卡住之后突然发现Ctrl键和大小写键(CapsLock)互换了,后面试了几种方法都没解决这个问题,最后在万能的贴吧中找到解决方法——键位复位。 108和87键位复位操作: 1.先按住FN不放, 然后,再按住…

PVE相关名词通俗表述方式———多处细节实验(方便理解)

PVE设置初期,对CIDR、 网关、 LinuxBridge、VLAN等很有困惑的朋友一定很需要一篇能够全面通俗易懂的方式去理解PVE 中Linux网桥的工作方式,就像操作一个英雄,多个技能,还是需要一点点去学习理解的,如果你上来就对着别人…

UG NX二次开发(C++)-Ufun函数-UF_MODL_ask_face_props说明

文章目录 1、前言2、UF_MODL_ask_face_props的函数说明3、UF_MODL_ask_face_props的应用3.1 获取归一化曲面上的点3.2 获取非归一化曲面上的点1、前言 UF_MODL_ask_face_props是获取曲面上的微分几何的函数,其能根据曲面上的参数,获取点、矢量等,也是经常用到的一个函数,但…

软件测试技术面试题及参考答案整理

一、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。 兼容的类型,如果细分的话,有平台的兼容,网络兼…

【面试题】2025年百度校招Java后端面试题

文章目录 前言一、网络IO1、服务器处理并发请求有哪几种方式?2、说一下select,poll,epoll的区别?3、Java 有一种现代的处理方式,属于异步I/O,是什么?redis,nginx,netty 是…

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意:有一条无限长跑道,每个人可以规定自己跑步的方向,起点,跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告,每个报告给出了某人在某一时候所在的位置,问跑步的最少可能人数…

.NET9 - Swagger平替Scalar详解(四)

书接上回,上一章介绍了Swagger代替品Scalar,在使用中遇到不少问题,今天单独分享一下之前Swagger中常用的功能如何在Scalar中使用。 下面我们将围绕文档版本说明、接口分类、接口描述、参数描述、枚举类型、文件上传、JWT认证等方面详细讲解。…

【JAVA] 杂谈: java中的拷贝(克隆方法)

这篇文章我们来介绍什么是拷贝,并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝: 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图:​ 1.3 浅拷贝的不足 1.3.1 增加引用…

记录QT5迁移到QT6.8上的一些问题

经常看到有的同学说网上的教程都是假的,巴拉巴拉,看看人家发布时间,Qt官方的API都会有所变动,多搜索,多总结,再修改记录。 下次遇到问题多这样搜索 QT 4/5/6 xxx document,对比一下就知道…

【数据结构与算法】排序算法总结:冒泡 / 快排 / 直接插入 / 希尔 / 简单选择 / 堆排序 / 归并排序

1 排序 1.1 冒泡 内排序的交换排序类别 1.1.1 普通实现 public class BubbleSort {/*** 基本的 冒泡排序*/public static void bubbleSort(int[] srcArray) {int i,j; // 用于存放数组下标int temp 0; // 用于交换数值时临时存放值for(i0;i<srcArray.length-1;i){// j …

分布式储能监控系统为储能电站高效运维与精细化管理赋能

1、引言 随着全球对可持续发展和环境保护意识的增强&#xff0c;能源结构正在经历深刻的转型。传统化石能源因其不可再生性和环境污染问题而逐渐受到限制&#xff0c;而可再生能源如太阳能、风能等因其清洁、可持续的特性而受到广泛关注和推广。这一转型推动了储能技术的快速发…

SciAssess——评估大语言模型在科学文献处理中关于模型的记忆、理解和分析能力的基准

概述 大规模语言模型&#xff08;如 Llama、Gemini 和 GPT-4&#xff09;的最新进展因其卓越的自然语言理解和生成能力而备受关注。对这些模型进行评估对于确定其局限性和潜力以及促进进一步的技术进步非常重要。为此&#xff0c;人们提出了一些特定的基准来评估大规模语言模型…

TiDB 关联子查询及半连接的优化实践

导读 TiDB 针对子查询语句会执行多种子查询相关的优化 ( https://docs.pingcap.com/zh/tidb/stable/subquery-optimization )&#xff0c;以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询&#xff0c;TiDB 优化器默认包含一些自动优化策略&#xff0c;…

Mac 配置pytorch ---- 保姆级教程

一、安装AnaConda 或者轻量级的 miniConda AnaConda安装地址&#xff1a;https://www.anaconda.com/ miniConda安装地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 1) 以miniConda 为例&#xff1a; 进入地址后&#xff0c;找到最新的安装版本下载…

C/C++每日一练:删除链表的倒数第N个节点

链表&#xff08;Linked List&#xff09; 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;Node&#xff09;通过指针链接在一起。与数组不同&#xff0c;链表中的元素在内存中不需要连续存储&#xff0c;每个节点包含两部分&#xff1a; 数据部分&#xff1a;存…

【python】爬去二手车数据 未完成

技术方案 python selenium 先下载Microsoft Edge WebDriver Microsoft Edge WebDriver 官网 先看一下自己的edge版本 搜索到版本然后下载自己的版本 安装依赖 pip install seleniumimport time from selenium import webdriverdriver webdriver.Edge(executable_pathr&qu…

在鸿蒙应用中 Debug 对开发者的帮助

文章目录 摘要引言Debug 的意义与挑战案例&#xff1a;页面渲染性能优化中的 Bug 排查Debug 过程详解问题定位问题解决优化布局与渲染逻辑 代码详细讲解示例代码详细讲解1. 导入必要模块2. 数据生成3. 使用虚拟列表组件items 属性itemHeight 属性renderItem 属性 4. 返回完整组…

YOLO-学习笔记

文章目录 划分区域筛选需要的目标聚类NMS(非极大值抑制) YOLOV1代码解析特征提取层 He 初始化&#xff08;He Initialization&#xff09;问题He 初始化的原理解释&#xff1a; 检测头train()输入处理函数target_processYOLO-V2基于Anchor的偏移量Ground Truth (GT)&#xff1a…

虚拟机VMware安装OpenWrt镜像

前提已经安装VMware Workstation Pro,我使用的是VM16 一.下载OpenWrt系统固件 固件有很多种&#xff0c;我选择下面这个链接的固件: Index of /releases/23.05.3/targets/x86/64/ 下载好之后将红框的镜像解压成绿框的镜像 二.安装转换工具 转换工具下载地址&#xff1a;htt…

Java设计模式 —— 【创建型模式】原型模式(浅拷贝、深拷贝)详解

文章目录 前言原型模式一、浅拷贝1、案例2、引用数据类型 二、深拷贝1、重写clone()方法2、序列化 总结 前言 先看一下传统的对象克隆方式&#xff1a; 原型类&#xff1a; public class Student {private String name;public Student(String name) {this.name name;}publi…