可通过小球进行旋转的十字光标(vtkResliceCursor)

news2024/10/6 20:41:15

        前一段事件看到VTK的一个例子:

该案例是vtk.js写的,觉得很有意思,个人正好也要用到,于是萌生了用C++修改VTK源码来实现该功能的想法。原本以为很简单,只需要修改一下vtkResliceCursor就可以了,加上小球,加上几个Actor,就能实现,没想到该功能整花了我差不多一个月的时间。但也学到了不少知识,下面就该功能的实现效果和方法做个大致解说:

我实现的效果:

实现方法:

1,首先在vtkResliceCursor中定义六个小球的位置。因为是X,Y,Z三个轴,每个轴上两个小球,所以总共有六个小球。代码:

void vtkResliceCursor::BuildCursorGeometryWithoutHole()
{
	// 其他源码省略
    .......
	for (int i = 0; i < 3; i++)
	{
		 
		//wulc
		{
			this->SpherePoints[0][i] = this->Center[i] - sphereLength * this->XAxis[i];
			this->SpherePoints[1][i] = this->Center[i] + sphereLength * this->XAxis[i];
			this->SpherePoints[2][i] = this->Center[i] - sphereLength * this->YAxis[i];
			this->SpherePoints[3][i] = this->Center[i] + sphereLength * this->YAxis[i];
			this->SpherePoints[4][i] = this->Center[i] - sphereLength * this->ZAxis[i];
			this->SpherePoints[5][i] = this->Center[i] + sphereLength * this->ZAxis[i];
		}
 
	  }
    // 其他源码省略
    .......
}

sphereLength 是一个自定义的常数,也就是中心到小球的距离。可以是 30 ,40 ,50 .。。。。

 除此之外我们还要定义一个函数,通过该函数可以获取这六个小球的坐标。比如 GetPointPosition(double p[6][3]);

2,在vtkResliceCursorPicker中判断鼠标是否靠近小球中心位置,靠近小球坐标时,将鼠标光标变为手掌形状。判断方法就是鼠标的位置和小球位置的距离,其中有现成的代码:

/----------------wulc---------------------------------------------------
int vtkResliceCursorPicker::IntersectPointWithPoint(double p1[3], double p2[3], double Points[], double tol)
{
	double pts[6][3] = { {0,0,0} };
	for (size_t i = 0; i < 6; i++)
	{
		pts[i][0] = Points[3*i];
		pts[i][1] = Points[3*i + 1];
		pts[i][2] = Points[3 * i + 2];
	}

	int j = 0;
	for ( ; j < 6; j++)
	{
		double X[4] = { pts[j][0], pts[j][1], pts[j][2], 1 };
  
		int i;
		double ray[3], rayFactor, projXYZ[3];


		for (i = 0; i < 3; i++)
		{
			ray[i] = p2[i] - p1[i];
		}
		if ((rayFactor = vtkMath::Dot(ray, ray)) == 0.0)
		{
			return 0;
		}
		 
		const double t = (ray[0] * (X[0] - p1[0]) +
			ray[1] * (X[1] - p1[1]) +
			ray[2] * (X[2] - p1[2])) / rayFactor;

		if (t >= 0.0 && t <= 1.0)
		{
			for (i = 0; i < 3; i++)
			{
				projXYZ[i] = p1[i] + t * ray[i];
				if (fabs(X[i] - projXYZ[i]) > tol)
				{
					break;
				}
			}

			if (i > 2) // within tolerance
			{
				return 1;
			}
		}
	}
	return 0;
}

 3,最后要在vtkResliceCursorActor类中添加小球,代码:

//wulc
  if (this->Renderer == nullptr) return;
  if (axisNormal == 1)//x-z平面
  {
	   
	  double* position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(2);
	  if (fabs(position[0] - 0.0) > 0.001 || fabs(position[1] - 0.0) > 0.001 || fabs(position[2] - 0.0) > 0.001)
	  {
		  this->SphereActor[2]->GetProperty()->SetColor(1, 0, 0);
		  this->SphereActor[3]->GetProperty()->SetColor(1, 0, 0);
		  this->SphereActor[2]->SetPosition(position[0], position[1], position[2]);
		  this->SphereActor[3]->SetPosition(position[3], position[4], position[5]);

		  position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(0);

		  this->SphereActor[0]->GetProperty()->SetColor(0, 0, 1);
		  this->SphereActor[1]->GetProperty()->SetColor(0, 0, 1);
		  this->SphereActor[0]->SetPosition(position[0], position[1], position[2]);
		  this->SphereActor[1]->SetPosition(position[3], position[4], position[5]);
	  }

  }
  else if (axisNormal == 2)//x-y平面
  {
	  double* position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(0);
	  if (fabs(position[0] - 0.0) > 0.001 || fabs(position[1] - 0.0) > 0.001 || fabs(position[2] - 0.0) > 0.001)
	  {
		  this->SphereActor[0]->GetProperty()->SetColor(0, 1, 0);
		  this->SphereActor[1]->GetProperty()->SetColor(0, 1, 0);
		  this->SphereActor[0]->SetPosition(position[0], position[1], position[2]);
		  this->SphereActor[1]->SetPosition(position[3], position[4], position[5]);
		  position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(1);
		  this->SphereActor[2]->GetProperty()->SetColor(1, 0, 0);
		  this->SphereActor[3]->GetProperty()->SetColor(1, 0, 0);
		  this->SphereActor[2]->SetPosition(position[0], position[1], position[2]);
		  this->SphereActor[3]->SetPosition(position[3], position[4], position[5]);
		  
	  }
	  
  }
  else if (axisNormal == 0) //y-z平面
  {
	 

	  double* position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(2);
	  if (fabs(position[0] - 0.0) > 0.001 || fabs(position[1] - 0.0) > 0.001 || fabs(position[2] - 0.0) > 0.001)
	  {
	  	this->SphereActor[0]->GetProperty()->SetColor(0, 1, 0);
	  	this->SphereActor[1]->GetProperty()->SetColor(0, 1, 0);
	  	this->SphereActor[0]->SetPosition(position[0], position[1], position[2]);
	  	this->SphereActor[1]->SetPosition(position[3], position[4], position[5]);
	  	position = this->CursorAlgorithm->GetResliceCursor()->GetSpherePostion(1);
	  	this->SphereActor[2]->GetProperty()->SetColor(0, 0, 1);
	  	this->SphereActor[3]->GetProperty()->SetColor(0, 0, 1);
	  	this->SphereActor[2]->SetPosition(position[0], position[1], position[2]);
	  	this->SphereActor[3]->SetPosition(position[3], position[4], position[5]);
	   
	  }

  }

这就可以了,欢迎小伙伴能够一块讨论。

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

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

相关文章

压缩列表(ziplist)

压缩列表&#xff08;ziplist&#xff09;&#xff1a; ziplist是列表键和哈希键的底层实现之一 当一个列表键只包含少量列表项&#xff0c;并且每个列表项要么是小整数或者短字符串&#xff0c;那么redis会使用ziplist来做列表键的实现当一个哈希键只包含少量键值对&#xff0…

【机器学习300问】119、什么是语言模型?

语言模型&#xff08;Language Models&#xff09;是自然语言处理&#xff08;NLP&#xff09;的重要组成部分&#xff0c;它的目的是量化一段文本或一个序列的概率。简单讲就是你给语言模型一个句子&#xff0c;它给你计算出特定语言中这个句子出现的概率。这样的概率度量可以…

基于jeecgboot-vue3的Flowable流程--增加我的抄送

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、前端我的抄送界面代码 <template><div class"p-2"><!--查询区域--><div class"jeecg-basic-table-form-container"><a-form ref"…

身为小白,浅浅聊一聊容器化部署

作为一个萌新小白&#xff0c;常常听人说起容器化部署某某程序……这时候我只能装作波澜不惊的样子&#xff0c;然后回去狠狠补课。 今天就来浅浅聊一下我对容器化部署的理解吧&#xff0c;为和我一样的萌新做个简单的科普&#xff0c;有什么不对的地方也请各位大佬友好交流。 …

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…

Linux操作系统以及一些操作命令、安装教程

Web课程完结啦&#xff0c;这是Web第一天的课程大家有兴趣可以传送过去学习 http://t.csdnimg.cn/K547r Linux-Day01 课程内容 Linux简介 Linux安装 Linux常用命令 1. 前言 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统&#xff0c;大家比…

帮助汽车制造业实现高精度脚垫上下料自动化

随着汽车制造业的快速发展&#xff0c;对生产效率和产品质量的要求日益提高。在汽车制造过程中&#xff0c;脚垫的上下料操作是一个重要的环节&#xff0c;传统的人工操作方式已经无法满足现代生产的需求。富唯智能凭借其先进的3D视觉引导机器人抓取技术&#xff0c;成功解决了…

Paragon NTFS for Mac 15软件下载及安装教程

简介&#xff1a; NTFS For Mac 15是首个支持Mac上读写NTFS外置存储设备解决方案 &#xff0c;解决mac不能读写外置让您更加简单直观的在Mac机上随意对NTFS文件修改、删除等操作。 安 装 包 获 取 地 址&#xff1a; Paragon Ntfs For Mac 15版&#xff1a; ​​https://sou…

05-5.4.1 树的存储结构

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

广东工业大学领导一行莅临泰迪智能科技参观交流

6月13日&#xff0c;广东工业大学经济学院党委书记林伟英、经济学院党委副书记陈朝阳、党政办主任徐嘉靖、数学与统计学院徐圣兵莅临泰迪智能科技产教融合实训中心参观交流。泰迪智能科技董事长张良均、运营中心总监翁梦婷、校企合作经理吴桂锋进行了热情接待。 会上&#xff0…

Java共享台球室无人系统支持微信小程序+微信公众号

共享台球室无人系统 &#x1f3b1; 创新台球体验 近年来&#xff0c;共享经济如火如荼&#xff0c;从共享单车到共享汽车&#xff0c;无一不改变着我们的生活方式。而如今&#xff0c;这一模式已经渗透到了更多领域&#xff0c;共享台球室便是其中之一。不同于传统的台球室&a…

为什么会出现多头自注意力机制???

自注意力机制已经在捕捉序列内部依赖关系方面表现出色&#xff0c;但是引入多头自注意力机制的主要原因是为了进一步提升模型的表达能力和性能。这种机制的设计和应用基于以下几个关键考虑&#xff1a; 1. 增加模型的复杂性和多样性 单一的自注意力机制虽然有效&#xff0c;但…

2024大模型学习全攻略:从小白到专家,一站式进阶之路

前言 随着人工智能技术的迅猛发展&#xff0c;大模型&#xff08;Large Models&#xff09;已成为这一领域的新宠。从GPT系列到BERT&#xff0c;再到各类变体&#xff0c;大模型以其强大的能力吸引了无数开发者和研究者的目光。那么&#xff0c;作为一个零基础的学习者&#x…

qss实现登录界面美化

qss实现登录界面美化 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 去掉头部this->setWindowFlag(Qt::FramelessWindowHint);// 去掉空白部分th…

linux下的进程通讯

一. 实验内容 1&#xff0e;编写一个程序&#xff0c;实现在两个进程之间运用管道进行通讯。程序中创建一个子进程&#xff0c;然后父、子进程各自独立运行。父进程不断地在标准输入设备上读入小写字母&#xff0c;写入管道。子进程不断地从管道中读取字符&#xff0c;转换为大…

【工程2区】毕业神刊 —— 1-2个月录用!非黑!非预警!

【欧亚科睿学术】 电力能源类SCIE ✅ 进展超顺 ✅ 录用率高 ✅ 领域相关均可 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xff0c;中科院4区 【版面类型】正刊&#xff0c;仅少量版面 【终审周期】走期刊部系统&#xff0c;预计3个月左右录用 【检索情况…

中电金信:银行业数据中心何去何从

20多年前&#xff0c;计算机走进国内大众视野&#xff0c;计算机行业迎来在国内的高速发展时代。银行业是最早使用计算机的行业之一&#xff0c;也是计算机技术应用最广泛、最深入的行业之一。近年来&#xff0c;随着银行竞争加剧&#xff0c;科技如何引领业务、金融科技如何发…

高端品牌网站建设

随着互联网的快速发展&#xff0c;越来越多的企业开始意识到高端品牌网站建设对于企业发展的重要性。高端品牌网站建设不仅是企业形象展示的窗口&#xff0c;更是与消费者进行有效沟通和互动的桥梁。下面从设计、内容和用户体验三个方面&#xff0c;探讨高端品牌网站建设的重要…

板凳----Linux/Unix 系统编程手册 25章 进程的终止

25.1 进程的终止&#xff1a;_exit()和exit() 440 1. _exit(int status)&#xff0c; status 定义了终止状态&#xff0c;父进程可调用 wait 获取。仅低8位可用&#xff0c;调用 _exit() 总是成功的。 2.程序一般不会调用 _exit()&#xff0c; 而是调用库函数 exit()。exit() …

图片的大小如何改变?有效率改图片大小的方法

图片怎么将改变图片大小呢&#xff1f;现在经常在使用图片的时候需要先按照上传平台的要求来修改尺寸和大小&#xff0c;将图片调整到满足使用的大小之后然后上传使用。那么如何在线改变图片大小呢&#xff0c;有一个很简单的方法能够快速在线改图片大小&#xff0c;今天小编将…