VTK 种子小部件 SeedWidget

news2024/11/24 22:54:13

Part1 vtkSeedWidget介绍

    vtkSeedWidget 用于在场景中放置多个种子点。种子点可用于诸如连通性, 区域生长分割算法之,分割等。

效果图:

vtkSeedWidget默认交互操作:
1. 鼠标点击widget上空白位置放置种子点
2. 鼠标移入种子点(箭头变为小手),按下delete删除种子点
3. 鼠标移入种子点(箭头变为小手),按住鼠标左键拖动可以移动种子点
有放置对应就有拾取,如何自定义拾取每个点放在以后拾取的交互单独讲,这里只介绍vtk默认的拾取功能。


Part2 vtkSeedWidget 官方案例 

vtk官方提供了三个例子,

1. vtkSeedWidget  三维放置;

#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointHandleRepresentation2D.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkProperty2D.h> // For setting the color in the handles
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSeedRepresentation.h>
#include <vtkSeedWidget.h>
#include <vtkSphereSource.h>

int main(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
{
	//vtkNew<vtkNamedColors> colors;

	vtkNew<vtkSphereSource> sphereSource;
	sphereSource->Update();

	// Create a mapper and actor
	vtkNew<vtkPolyDataMapper> mapper;
	mapper->SetInputConnection(sphereSource->GetOutputPort());
	vtkNew<vtkActor> actor;
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(100,0,100);

	vtkNew<vtkRenderer> renderer;
	renderer->AddActor(actor);
	//renderer->SetBackground(colors->GetColor3d("SlateGray").GetData());

	vtkNew<vtkRenderWindow> window;
	window->AddRenderer(renderer);
	window->SetWindowName("SeedWidget");

	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(window);

	// Create the representation for the seed widget and for its handles
	vtkNew<vtkPointHandleRepresentation2D> handleRep;
	//handleRep->GetProperty()->SetColor(colors->GetColor3d("Red").GetData());
	vtkNew<vtkSeedRepresentation> widgetRep;
	widgetRep->SetHandleRepresentation(handleRep);

	// Create the seed widget
	vtkNew<vtkSeedWidget> seedWidget;
	seedWidget->SetInteractor(interactor);
	seedWidget->SetRepresentation(widgetRep);

	window->Render();
	seedWidget->On();
	window->Render();
	interactor->Initialize();
	interactor->Start();

  
	return EXIT_SUCCESS;
}

2.平面场景下放置种子点 SeedWidgetImage 回调种子点增加、移动、删除信息

 

#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkImageActor.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkInteractorStyleImage.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointHandleRepresentation2D.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkProperty2D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSeedRepresentation.h>
#include <vtkSeedWidget.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>

#include <array>

namespace {
class vtkSeedImageCallback : public vtkCommand
{
public:
  static vtkSeedImageCallback* New()
  {
    return new vtkSeedImageCallback;
  }

  vtkSeedImageCallback() = default;

  virtual void Execute(vtkObject*, unsigned long event, void* calldata)
  {
    if (event == vtkCommand::PlacePointEvent)
    {
      std::cout << "Placing point..." << std::endl;
      std::cout << "There are now "
                << this->SeedRepresentation->GetNumberOfSeeds() << " seeds."
                << std::endl;
      for (unsigned int seedId = 0; static_cast<int>(seedId) <
           this->SeedRepresentation->GetNumberOfSeeds();
           seedId++)
      {
        double pos[3];
        this->SeedRepresentation->GetSeedDisplayPosition(seedId, pos);
        std::cout << "Seed " << seedId << " : (" << pos[0] << " " << pos[1]
                  << " " << pos[2] << ")" << std::endl;
      }
      return;
    }
    if (event == vtkCommand::InteractionEvent)
    {
      std::cout << "Interaction..." << std::endl;
      if (calldata)
      {
        double pos[3];
        this->SeedRepresentation->GetSeedDisplayPosition(0, pos);
        std::cout << "Moved to (" << pos[0] << " " << pos[1] << " " << pos[2]
                  << ")" << std::endl;
      }
      return;
    }
  }

  void SetRepresentation(vtkSmartPointer<vtkSeedRepresentation> rep)
  {
    this->SeedRepresentation = rep;
  }
  void SetWidget(vtkSmartPointer<vtkSeedWidget> widget)
  {
    this->SeedWidget = widget;
  }

private:
  vtkSeedRepresentation* SeedRepresentation = nullptr;
  vtkSeedWidget* SeedWidget = nullptr;
};
} // namespace

int main(int /* argc */, char* /* argv */[])
{
  vtkNew<vtkNamedColors> colors;

  std::array<double, 3> drawColor1{0, 0, 0};
  std::array<double, 3> drawColor2{0, 0, 0};
  auto color1 = colors->GetColor3ub("MidnightBlue").GetData();
  auto color2 = colors->GetColor3ub("Tomato").GetData();
  for (auto i = 0; i < 3; ++i)
  {
    drawColor1[i] = color1[i];
    drawColor2[i] = color2[i];
  }
  // Create an image
  vtkNew<vtkImageCanvasSource2D> drawing;
  drawing->SetScalarTypeToUnsignedChar();
  drawing->SetNumberOfScalarComponents(3);
  drawing->SetExtent(0, 20, 0, 50, 0, 0);
  // Make a blue background
  drawing->SetDrawColor(drawColor1.data());
  drawing->FillBox(0, 20, 0, 50);
  // Make a red circle
  drawing->SetDrawColor(drawColor2.data());
  drawing->DrawCircle(9, 10, 5);
  drawing->Update();

  vtkNew<vtkImageActor> imageActor;
  imageActor->SetInputData(drawing->GetOutput());

  // Create a renderer and render window
  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(imageActor);
  renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());

  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->AddRenderer(renderer);
  renderWindow->SetWindowName("SeedWidgetImage");

  // An interactor
  vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // Setup interactor style
  vtkNew<vtkInteractorStyleImage> interactorStyleImage;
  renderWindowInteractor->SetInteractorStyle(interactorStyleImage);

  // Create the representation
  vtkNew<vtkPointHandleRepresentation2D> handle;
  handle->GetProperty()->SetColor(1, 0, 0);
  vtkNew<vtkSeedRepresentation> rep;
  rep->SetHandleRepresentation(handle);

  // Seed widget
  vtkNew<vtkSeedWidget> seedWidget;
  seedWidget->SetInteractor(renderWindowInteractor);
  seedWidget->SetRepresentation(rep);

  vtkNew<vtkSeedImageCallback> seedCallback;
  seedCallback->SetRepresentation(rep);
  seedCallback->SetWidget(seedWidget);
  seedWidget->AddObserver(vtkCommand::PlacePointEvent, seedCallback);
  seedWidget->AddObserver(vtkCommand::InteractionEvent, seedCallback);

  renderWindow->Render();

  renderWindowInteractor->Initialize();
  renderWindow->Render();
  seedWidget->On();

  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

 3. 空间场景中放置种 回调种子点增加、移动、删除信息 SeedWidgetWithCustomCallback
 
 
 

#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointHandleRepresentation2D.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkProperty2D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSeedRepresentation.h>
#include <vtkSeedWidget.h>
#include <vtkSphereSource.h>

namespace {
	class vtkSeedCallback : public vtkCommand
	{
	public:
		static vtkSeedCallback* New()
		{
			return new vtkSeedCallback;
		}

		vtkSeedCallback()
		{
		}

		virtual void Execute(vtkObject*, unsigned long event, void* calldata)
		{
			if (event == vtkCommand::PlacePointEvent)
			{
				std::cout << "Point placed, total of: "
					<< this->SeedRepresentation->GetNumberOfSeeds() << std::endl;
			}
			if (event == vtkCommand::InteractionEvent)
			{
				if (calldata)
				{
					std::cout << "Interacting with seed : "
						<< *(static_cast<int*>(calldata)) << std::endl;
				}
			}

			std::cout << "List of seeds (Display coordinates):" << std::endl;
			for (vtkIdType i = 0; i < this->SeedRepresentation->GetNumberOfSeeds(); i++)
			{
				double pos[3];
				this->SeedRepresentation->GetSeedDisplayPosition(i, pos);
				std::cout << "(" << pos[0] << " " << pos[1] << " " << pos[2] << ")"
					<< std::endl;
			}
		}

		void SetRepresentation(vtkSeedRepresentation* rep)
		{
			this->SeedRepresentation = rep;
		}

	private:
		vtkSeedRepresentation* SeedRepresentation;
	};
} // namespace

int main(int, char*[])
{
	vtkNew<vtkNamedColors> colors;

	vtkNew<vtkSphereSource> sphereSource;
	sphereSource->Update();

	// Create a mapper and actor
	vtkNew<vtkPolyDataMapper> mapper;
	mapper->SetInputConnection(sphereSource->GetOutputPort());
	vtkNew<vtkActor> actor;
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(colors->GetColor3d("MidnightBlue").GetData());

	// A renderer and render window
	vtkNew<vtkRenderer> renderer;
	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow->AddRenderer(renderer);
	renderWindow->SetWindowName("SeedWidgetWithCustomCallback");

	renderer->SetBackground(colors->GetColor3d("SlateGray").GetData());
	renderer->AddActor(actor);

	// An interactor
	vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
	renderWindowInteractor->SetRenderWindow(renderWindow);

	// Create the representation
	vtkNew<vtkPointHandleRepresentation2D> handle;
	handle->GetProperty()->SetColor(colors->GetColor3d("Red").GetData());
	vtkNew<vtkSeedRepresentation> rep;
	rep->SetHandleRepresentation(handle);

	// Seed widget
	vtkNew<vtkSeedWidget> seedWidget;
	seedWidget->SetInteractor(renderWindowInteractor);
	seedWidget->SetRepresentation(rep);

	vtkNew<vtkSeedCallback> seedCallback;
	seedCallback->SetRepresentation(rep);
	seedWidget->AddObserver(vtkCommand::PlacePointEvent, seedCallback);
	seedWidget->AddObserver(vtkCommand::InteractionEvent, seedCallback);

	renderWindow->Render();

	renderWindowInteractor->Initialize();
	renderWindow->Render();
	seedWidget->On();

	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

 

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

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

相关文章

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】- 未完稿

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

SpringCloud Alibaba——Nacos1.x作为注册中心的原理

目录 一、原理二、原理步骤图解 一、原理 使用Http发送注册查询服务提供方列表定时拉取 (每10秒)检测到服务提供者异常&#xff0c;基于UDP协议推送更新定时心跳 (5秒)&#xff0c;检测服务状态定时心跳任务检查集群数据同步任务使用Distro 二、原理步骤图解 Nacos1.x作为注…

python的浅拷贝和深拷贝

1、结论 python中的拷贝有以下三种 变量的赋值操作 只是形成两个变量,实际上还是指向同一个对象 浅拷贝 Python拷贝一般都是浅拷贝&#xff0c;拷贝时&#xff0c;对象包含的子对象内容不拷贝&#xff0c;因此&#xff0c;源对象与拷贝对象会引用同一个子对象 深拷贝 使用co…

【C++】开源:Web文件服务器

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍开源项目——Web文件服务器。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

代码随想录day17

110. 平衡二叉树 首先是明白什么是平衡二叉树&#xff1a; 一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 然后&#xff0c;区别二叉树的高度和深度&#xff1a; 二叉树的高度&#xff1a;从叶子节点到根节点 二叉树的…

【C语言】多组输入

C系列文章目录 目录 C系列文章目录 一、什么是多组输入&#xff1f; 二、如何使用多组输入 2.1&#xff0c;试题举例讲解 2.2&#xff0c;错误解法 2.3&#xff0c;我们实现多组输入的思路 2.4&#xff0c;第一种正确的解法 2.5&#xff0c;第二种正确的解法 2.6&…

Exchange 服务器监控工具

Microsoft Exchange Server 是个消息与协作系统&#xff0c;提供了通常所需要的全部邮件服务功能&#xff0c;可以被用来构架应用于企业、学校的邮件系统或免费邮件系统。包括从电子邮件、会议安排、团体日程管理、任务管理、文档管理、实时会议和工作流等丰富的协作应用&#…

基于PyQt5的图形化界面开发——打砖块

目录 0. 前言1. 砖块类定义2. 挡板类定义3. 碰撞检测4. 小球和游戏初始化5. 完整代码6. 运行效果演示7. Pyinstaller 编译exe程序PyQt5 0. 前言 本文使用 PyQt5实现一个打砖块小游戏 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Pyt…

自学成为一名顶级黑客(网络安全)

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 行为&#xff1a;从编程开始掌握&#xff0c;前端后端、通信协议、什么都学。 缺点&#xff1a;花费时间太长、实际向安全过渡后可用到的关键知识并不多。…

加密与解密 解密篇 逆向分析技术 (一) 栈/调用约定

目录 逆向是什么 32位软件逆向技术 1.启动函数 2.函数 函数的识别 函数的参数 利用栈进行传递 下面是通过esp来寻址 通过寄存器来传递参数 例子 例子 函数的返回值 例子 例子 逆向是什么 将可执行程序反汇编 通过分析反汇编代码来理解其代码功能&#xff08;各个…

慢速减压控制技术在预防同步辐射光源和原位透射电镜氮化硅窗口膜真空中破裂的应用

摘要&#xff1a;氮化硅薄膜窗口广泛应用于同步辐射光源中的扫描透射软X射线显微镜和原位透射电镜&#xff0c;但氮化硅薄膜只有几百纳米的厚度&#xff0c;很容易因真空抽取初期的快速压差变化造成破裂。为此&#xff0c;本文提出了线性缓变压力控制解决方案&#xff0c;即控制…

【小数据处理】从日志中获取json数据的处理

写在头上 本次分析的数据来源是SpringBoot服务输出的logback日志。具体配置参考&#xff1a; 处理工具:Notepad v7.6。处理的日志内容不易过大&#xff0c;Notepad能打开电脑不卡最好&#xff08;100M以内吧&#xff09;。如果实在过大&#xff0c;先从日志源头进行截取&…

【javaEE面试题(五)在JMM(Java Memory Model (Java 内存模型))下谈volatile的作用】【保证内存可见 和 指令有序】

volatile的作用 JMM下volatile作用 volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 “内存可见性”. 代码在写入 volatile 修饰的变量的时候 改变线程工作内存中volatile变量副本的值将改变后的副本的值从工作内存刷新到主内存 代码在读取 volatile 修饰的变量的时…

微信小程序上线与发布图文步骤操作

1.上传代码 打开微信小程序&#xff0c;在微信开发者工具的工具栏中单击“上传”按钮&#xff0c;页面中弹出提示框&#xff0c;根据提示填写相应的信息&#xff0c;然后单击“上传”按钮&#xff0c;即可上传代码。 2.查看上传代码之后的版本 登录微信小程序管理后台&…

【docker】部署svn服务器,docker安装部署svn服务器

话不多说直接上步骤&#xff01; 1.下载镜像&#xff0c;创建容器 # 下载镜像 docker pull elleflorio/svn-server # 创建svn仓库目录&#xff0c;进入svn仓库目录 mkdir -p /var/svn # 创建svn服务容器&#xff0c;把容器中的svn仓库映射到本机&#xff0c;并映射3690端口 d…

基于深度学习的高精度安全帽及背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全帽及背心检测识别系统可用于日常生活中或野外来检测与定位安全帽及背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全帽及背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

动手学深度学习——线性回归(原理解释+代码详解)

目录 1、线性回归2、线性回归模型2.1 线性模型2.2 损失函数2.2.1 平方差损失函数2.2.2 整个数据集上的损失函数 2.3 随机梯度下降2.4 用模型进行预测 3、线性回归的简单实现3.1 生成数据集3.2 读取数据集3.3 初始化模型参数3.4 定义模型3.5 定义损失函数3.6 定义优化算法3.7 训…

H3C-Cloud Lab实验-OSPF配置实验

一、实验拓扑图 实验需求&#xff1a; 1、按照图示配置 IP 地址 2、按照图示分区域配置 OSPF &#xff0c;实现全网互通 3、为了路由结构稳定&#xff0c;要求路由器使用环回口作为 Router-id&#xff0c;ABR 的环回口宣告进骨干区域 4、掌握OSPF初始化流程、路由表学习的过…

基于linux下的高并发服务器开发(第一章)- GDB调试(2)1.14

&#xff08;1&#xff09;执行 gcc test.c -o test -g &#xff0c;生成test文件 &#xff08;2&#xff09;gdb test &#xff08;3&#xff09;list 查看当前文件代码 list/l &#xff08;从默认位置显示&#xff09; &#xff08;4&#xff09;l 20 list/l 行号 &#xf…