【VTK-Rendering::Annotation】第一期 vtkCaptionActor2D

很高兴在雪易的CSDN遇见你 

VTK技术爱好者 QQ:870202403


前言

本文分享vtkCaptionActor2D源码解析,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO


目录

前言

1. vtkCaptionActor2D概述

2. 重要参数

2.1 定义标注文本

2.2 设置标注附着点

2.3 设置是否启用边框 

2.4 设置是否启用标注到附着点的引导线

2.5 指定2D或3D箭头

2.6 设置文本与包围盒的距离

2.7 设置文本属性

 2.8 设置箭头是否在Edge上附着 

3. 原理解析

3.1 vtkBorderRepresentation原理解析

结论:


1. vtkCaptionActor2D概述

        vtkCaptionActor2D是一个2DActor和3DActor混合的对象,用于将文本与场景中的点(AttachmentPoint)相关联。可以使用矩形边框和将标题连接到附着点的引线来绘制标题。可选地,可以在leader的端点处对其进行符号化,以创建箭头或其他指示符。

        使用vtkCaptionActor2D时,必须指定Position和Position2两个点。Position和Position2定义标题的大小,AttachmentPoint定义标题所关联的点。还必须定义标题文本、是否希望在标题周围设置边框,以及是否希望在标题到附件点之间设置一个引线。

        文本的属性通过关联的vtkTextProperty进行设置。引线可以设置为2D或3D。(2D绘制在底层几何上,3D三维引线可能被几何遮挡。)

2. 重要参数

2.1 定义标注文本

  //@{/*** Define the text to be placed in the caption. The text can be multiple* lines (separated by "\n").* 定义标注的文本,文本可以多行(通过"\n"进行分隔)*/virtual void SetCaption(const char* caption);virtual char* GetCaption();//@}

2.2 设置标注附着点

  //@{/*** Set/Get the attachment point for the caption. By default, the attachment* point is defined in world coordinates, but this can be changed using* vtkCoordinate methods.* 设置标注的附着点,默认为世界坐标系。可以通过vtkCoordinate的方法进行更改*/vtkWorldCoordinateMacro(AttachmentPoint);//@}

2.3 设置是否启用边框 

  //@{/*** Enable/disable the placement of a border around the text.* 可用/不可用文本外的包围框*/vtkSetMacro(Border, vtkTypeBool);vtkGetMacro(Border, vtkTypeBool);vtkBooleanMacro(Border, vtkTypeBool);//@}

2.4 设置是否启用标注到附着点的引导线

  //@{/*** Enable/disable drawing a "line" from the caption to the* attachment point.* 可用/不可用 标注到附着点的线*/vtkSetMacro(Leader, vtkTypeBool);vtkGetMacro(Leader, vtkTypeBool);vtkBooleanMacro(Leader, vtkTypeBool);//@}

2.5 指定2D或3D箭头

  //@{/*** Indicate whether the leader is 2D (no hidden line) or 3D (z-buffered).* 指定箭头为2D或3D*/vtkSetMacro(ThreeDimensionalLeader, vtkTypeBool);vtkGetMacro(ThreeDimensionalLeader, vtkTypeBool);vtkBooleanMacro(ThreeDimensionalLeader, vtkTypeBool);//@}//@{/*** Specify a glyph to be used as the leader "head". This could be something* like an arrow or sphere. If not specified, no glyph is drawn. Note that* the glyph is assumed to be aligned along the x-axis and is rotated about* the origin. SetLeaderGlyphData() directly uses the polydata without* setting a pipeline connection. SetLeaderGlyphConnection() sets up a* pipeline connection and causes an update to the input during render.* 设置箭头的头部输入数据*/virtual void SetLeaderGlyphData(vtkPolyData*);virtual void SetLeaderGlyphConnection(vtkAlgorithmOutput*);virtual vtkPolyData* GetLeaderGlyph();//@}//@{/*** Specify the relative size of the leader head. This is expressed as a* fraction of the size (diagonal length) of the renderer. The leader* head is automatically scaled so that window resize, zooming or other* camera motion results in proportional changes in size to the leader* glyph.* 设置箭头符号的大小*/vtkSetClampMacro(LeaderGlyphSize, double, 0.0, 0.1);vtkGetMacro(LeaderGlyphSize, double);//@}//@{/*** Specify the maximum size of the leader head (if any) in pixels. This* is used in conjunction with LeaderGlyphSize to cap the maximum size of* the LeaderGlyph.* 像素上设置箭头符号的最大像素值*/vtkSetClampMacro(MaximumLeaderGlyphSize, int, 1, 1000);vtkGetMacro(MaximumLeaderGlyphSize, int);//@}

2.6 设置文本与包围盒的距离

  //@{/*** Set/Get the padding between the caption and the border. The value* is specified in pixels.* 设置/获取标注文本和包围框之间的距离*/vtkSetClampMacro(Padding, int, 0, 50);vtkGetMacro(Padding, int);//@}//@{/*** Get the text actor used by the caption. This is useful if you want to control* justification and other characteristics of the text actor.* 获取文本Actor对象*/vtkGetObjectMacro(TextActor, vtkTextActor);//@}

2.7 设置文本属性

  //@{/*** Set/Get the text property.* 设置文本的属性*/virtual void SetCaptionTextProperty(vtkTextProperty* p);vtkGetObjectMacro(CaptionTextProperty, vtkTextProperty);//@}

 2.8 设置箭头是否在Edge上附着 

  //@{/*** Enable/disable whether to attach the arrow only to the edge,* NOT the vertices of the caption border.* 箭头在包围框上的附着点;若为On时,表示附着点考虑包围框四个边的中点;否则不考虑*/vtkSetMacro(AttachEdgeOnly, vtkTypeBool);vtkGetMacro(AttachEdgeOnly, vtkTypeBool);vtkBooleanMacro(AttachEdgeOnly, vtkTypeBool);//@}

3. 原理解析

3.1 vtkBorderRepresentation原理解析

        定义一个矩形,左下角点为(0.,0.,0.),右上角点为(1.,1.,0.)。

        定义由这四个点组成的矩形边界的PolyData数据

  // Create the geometry in canonical coordinatesthis->BWPoints = vtkPoints::New();this->BWPoints->SetDataTypeToDouble();this->BWPoints->SetNumberOfPoints(4);this->BWPoints->SetPoint(0, 0.0, 0.0, 0.0); // may be updated by the subclassthis->BWPoints->SetPoint(1, 1.0, 0.0, 0.0);this->BWPoints->SetPoint(2, 1.0, 1.0, 0.0);this->BWPoints->SetPoint(3, 0.0, 1.0, 0.0);vtkCellArray* outline = vtkCellArray::New();outline->InsertNextCell(5);outline->InsertCellPoint(0);outline->InsertCellPoint(1);outline->InsertCellPoint(2);outline->InsertCellPoint(3);outline->InsertCellPoint(0);this->BWPolyData = vtkPolyData::New();this->BWPolyData->SetPoints(this->BWPoints);this->BWPolyData->SetLines(outline);outline->Delete();

        给PolyData数据添加Transform变换,并将其映射为actor2D 数据。

  this->BWTransform = vtkTransform::New();this->BWTransformFilter = vtkTransformPolyDataFilter::New();this->BWTransformFilter->SetTransform(this->BWTransform);this->BWTransformFilter->SetInputData(this->BWPolyData);this->BWMapper = vtkPolyDataMapper2D::New();this->BWMapper->SetInputConnection(this->BWTransformFilter->GetOutputPort());this->BWActor = vtkActor2D::New();this->BWActor->SetMapper(this->BWMapper);this->BorderProperty = vtkProperty2D::New();this->BWActor->SetProperty(this->BorderProperty);

        通过两个vtkCoordinate对象约束矩形的左下角点和右上角点。

  this->PositionCoordinate = vtkCoordinate::New();this->PositionCoordinate->SetCoordinateSystemToNormalizedViewport();this->PositionCoordinate->SetValue(0.05, 0.05);this->Position2Coordinate = vtkCoordinate::New();this->Position2Coordinate->SetCoordinateSystemToNormalizedViewport();this->Position2Coordinate->SetValue(0.1, 0.1); // may be updated by the subclassthis->Position2Coordinate->SetReferenceCoordinate(this->PositionCoordinate);

        在每次Render的时候,获取当前的Display坐标对原始PolyData数据进行Transform,即可看到一个一直处于视平面的矩形框。

    // Set things upint* pos1 = this->PositionCoordinate->GetComputedViewportValue(this->Renderer);int* pos2 = this->Position2Coordinate->GetComputedViewportValue(this->Renderer);// If the widget's aspect ratio is to be preserved (ProportionalResizeOn),// then (pos1,pos2) are a bounding rectangle.if (this->ProportionalResize){}// Now transform the canonical widget into display coordinatesdouble size[2];this->GetSize(size);double tx = pos1[0];double ty = pos1[1];double sx = (pos2[0] - pos1[0]) / size[0];double sy = (pos2[1] - pos1[1]) / size[1];this->BWTransform->Identity();this->BWTransform->Translate(tx, ty, 0.0);this->BWTransform->Scale(sx, sy, 1);this->BuildTime.Modified();

保持位置不变的原因:每次旋转或移动渲染窗口时,都重新获取两个vtkCoordinate对象的ViewPort坐标系下的坐标,并对其进行重新绘制。 

3.2 vtkCaptionActor2D

结论:

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

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

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

相关文章

CSP CCF 201312-2 ISBN号码 C++满分题解

解题思路&#xff1a; 1.用一个int数组单独存储每个数字&#xff1b;用char数组存储原始标识符串&#xff0c;方便输出 2.计算后得到标识码&#xff0c;判断是否正确 #include<iostream> using namespace std;int main() {int num[15]; //存储每个位置的数char arr[15…

UniApp小程序使用vant引入vant weapp

HBuilder X里新建项目指路 HBuilderX新建项目 安装node.js指路 安装node.js 1.通过npm安装 查看npm环境 //打开终端输入命令查看版本 npm -version 1.1.右键打开外部终端窗口 1.2.输入npm init -y命令 1.3.通过命令安装 npm i vant/weapp1.3.3 -S --production 1.4.打开工具…

联合办公靠谱吗?

提起联合办公&#xff0c;许多人可能会想到喧嚣的开放式办公区、精巧的咖啡吧台以及随处可见的共享会议室。随着工作模式的更新迭代&#xff0c;联合办公无疑已经成为了现代办公室文化的热门趋势。但面对这种浪潮&#xff0c;不少人仍然保持着观望的态度&#xff0c;不免产生疑…

新药(化药)注册申报资料都包含哪些?

新药的注册申报是新药上市前的重要步骤,其流程可以简单概括为①前期准备→②申报材料准备→③递交注册申请→④审评和审批→⑤监管和跟踪。本文将着重介绍新药(化药)注册申报的一般流程和主要环节(附流程图)。(关于新药注册申报成功率和耗费时间问题写到最后) ①前期准备 在开…

应对策略:财务数据智能化转型潜在风险

在技术的推动下&#xff0c;企业正步入数智化转型的新时代。大数据、人工智能、云计算、物联网和区块链等尖端科技正蓬勃发展&#xff0c;为制造业带来了前所未有的机遇与挑战。在这场技术革命的浪潮中&#xff0c;制造业面临着巨大的变革压力。识别转型过程中潜在风险并采取应…

Proxyman:现代本地Web调试代理工具

1. 简介 1.1 什么是Proxyman&#xff1f; Proxyman是一款专为macOS设计的现代本地Web调试代理工具&#xff0c;它不仅支持macOS平台&#xff0c;还能无缝地与iOS和Android设备进行集成。作为一个网络调试工具&#xff0c;Proxyman的设计旨在提供高性能、直观且功能丰富的解决…

Python中使用SQLite数据库的方法2-1

1 SQLite数据库简介 SQLite数据库是一种轻量级的、优秀的开源关系型数据库。它使用Python的标准库实现&#xff0c;并且存储数据库在普通文件中。这些文件在不同机器和操作系统之间是可以移植的&#xff0c;在很多安卓手机中&#xff0c;也是把SQLite作为嵌入数据库使用。 2 …

SpringBoot整合Spring-Security 认证篇(保姆级教程)

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135195636 代码仓库: https://gitee.com/skyblue0678/springboot-demo 为了跟shiro区别开&#xff0c;新建了一个分支&#xff1a; 目录 &#x1f339;1、友善问候一下 Spring …

【高性能篇】QPS概念、RT概念

什么是QPS&#xff0c;什么是RT&#xff1f; ✔️典型解析✔️扩展知识仓✔️RT ✔️QPS✔️ QPS和TPS✔️并发用户数✔️最佳线程数 ✔️典型解析 QPS&#xff0c;指的是系统每秒能处理的请求数(Query Per Second)&#xff0c;在Web应用中我们更关注的是Web应用每秒能处理的re…

Arduino驱动VL6180X光学测距传感器(OLED显示)

Arduino驱动VL6180X光学测距传感器&#xff08;OLED显示&#xff09; 简介原理模块参数接线图代码结果 简介 VL6108X三合一光电模块&#xff0c;芯片内集成了IR VSEL(vertical-cavity surface-emitting laser)红外垂直腔面发射激光器光源、接近传感器、环境光传感器&#xff0…

node fs模块读取文件 readFile、readFileSync、fsPromises.readFile、createReadStream

文章目录 1.读取文件1.1 readFile1.2 readFileSync1.3 fsPromises.readFile&#xff1a;promise的写法1.4 fs.createReadStream 1.读取文件 readFile&#xff1a;异步读取文件readFileSync&#xff1a;同步读取文件fsPromises.readFile&#xff1a;promise的写法 需要注意的是…

C语言rand函数,srand函数,time函数实现随机数,及猜数字小游戏

怀心之所爱&#xff0c;奔赴山河 前言 最近在复习c的知识&#xff0c;想起之前写过一个猜数字小游戏&#xff0c;所以今天就把自己关于随机数的使用经验分享一下&#xff0c;希望对大家有帮助。 一.rand函数 1.函数的声明如下 可以看到&#xff0c;返回值是int类型&#xff…