【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://xiahunao.cn/news/2662224.html

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

相关文章

【Redis交响乐】Redis中的通用命令

文章目录 1. 基本命令 get set2. 全局命令(1)keys(2)exists(3)del(4)expire && ttl面试题: redis中key的过期策略是怎么实现的?定时器的实现原理(1)基于优先级队列/堆(2)基于时间轮实现的定时器 (5) type 我们知道,redis是按照键值对的方式存储数据的. Redis中基本的命…

tcp/ip实现两个手机之间连接同步显示

app主界面 选择一:TCP客户端 选择二:TCP服务端 点击下图item时进入曲线绘制页面 如果是服务器端它不需要连任何设备就可以直接进入绘制界面如果是TCP的话就不能直接进入,否则就会提示未连接网络连接不能放在主线程,页面去调方法&…

外贸自建站教程指南?海洋建站的方法技巧?

最新的外贸自建站教程?做电商如何搭建外贸独立站? 在如今竞争激烈的国际贸易市场,外贸企业想要脱颖而出,拥有一个专业、高效的网站至关重要。海洋建站将为您提供一份全面的外贸自建站教程指南,帮助您迈出建设成功网站…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日,由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的第七届大数据“星河(Galaxy)”案例评选结果公示,亚信安慧AntDB数据库两项目入选,其中“基于Ant…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

Gooxi亮相2023中国数据与存储峰会展示最新存储解决方案

今日,以“数智创新,AI未来”为主题的2023 中国数据与存储峰会在北京顺利举行,Gooxi受邀参与并展示了最新存储服务器产品,搭配最新处理器平台,能够广泛应用在人工智能、数据分析、云端计算、数据存储和高性能计算等领域…

浪潮信息:打造IT领域首个数字样机应用,荣膺鼎革奖

10月26日,第六届“鼎革奖”数字化转型先锋榜正式揭晓,51个企业及机构荣登榜单,浪潮信息的“全栈数智化研发”项目获得“研发转型典范奖”。这一荣誉再次彰显了浪潮信息在数字化转型领域的领先地位,展现了其在研发转型方面的卓越成…

rax3000m刷openwrt固件

rax3000m刷机过程(nand版本) 刷机准备文件https://www.123pan.com/s/X5m9-6Ynj.html提取码:VtBW 接线关系:路由器lan口接电脑 1.上传配置开启ssh的配置文件(登录路由器后台管理界面在找到配置管理,上传配置文件rax3…

价格成谜,小米汽车到底要卖给谁?

文|刘俊宏 编|王一粟 “不要再讲9.9万了,不可能的,也不要再讲14.9万,小米SU7是有理由的贵”,小米集团创始人、董事长雷军在12月28日的小米汽车技术发布会上,把价格作为最大的悬念留给了市场。…

C++:第十一讲DFS深搜

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单,就是这样:通过创造性自我表达的途径和世界分享真实的你。 前言 今天带着大家…

软件测试/测试开发丨Python、pycharm 安装与环境配置

Python 安装与环境配置 1. Python 安装 版本推荐 3.10.0下载地址:www.python.org/downloads/w… 若需要安装旧版本,在页面下方选择对应版本即可,MacOS选择对应系统即可 图示下载windows 3.11.4版本 安装Python 执行安装程序,安…

CRM诞生到现在历经了哪些发展阶段?CRM系统的五个关键节点

CRM管理系统从被发明到现在,历经多次迭代已经成为一个相对成熟的系统。企业可以靠它管理客户信息,提升盈利能力。今天就来介绍一下CRM的发展历程。 一、CRM系统的雏形 广义上的CRM系统其实可以追溯到古希腊时期。当时的商人靠书写记录自己与客户和合作…

稳定币分析的 3 个关键指标

作者:lesleyfootprint.network 数据源:The Stablecoin Dashboard 稳定币因其固有特性而在加密货币领域中独树一帜,它们的特点是价格与特定的参考资产(通常是美元或欧元等法定货币)锚定。这种锚定机制的目的是缓解数字…

Oracle 拼接字符串

语法 使用||拼接如果内容中有单引号,则可在该单引号前面再加一个单引号进行转义 例子 比如有一个业务是根据需要生成多条插入语句 select insert into des_account_des_role(des_account_id, roles_id) values( || id || , || (select id from des_role where wo…

Python中的数据类型

如果说python中的数据类型,那我们要从标准数据类型说起,在python中标准数据类型如下: 数字类型: 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 在python2.X中数据类型分的比较多,有int(有符号整型),long(…

腾讯云轻量应用服务器租用优惠价格表(多配置报价)

腾讯云轻量应用服务器优惠价格表,12月最新报价,腾讯云轻量2核2G3M带宽62元一年、2核2G4M轻量服务器118元一年,540元三年、2核4G5M带宽218元一年,756元三年、4核8G12M轻量服务器646元15个月,CVM云服务器S5实例2核2G配置…

springCould中的OpenFeign-从小白开始【6】

目录 1.简单介绍❤️❤️❤️ 2.能干嘛❤️❤️❤️ 3.简单入门 ❤️❤️❤️ 4.超时控制 ❤️❤️❤️ 5.日志打印❤️❤️❤️ 1.简单介绍❤️❤️❤️ OpenFeign是一个用于微服务架构中的声明式、模板化的HTTP客户端库。它简化了编写服务间通信的代码,使得开…

nrm的保姆级使用教程

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 &#x1f4…

如何本地搭建FastDFS文件服务器并实现远程访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目(jar) 1.3、编写 Dockerfile 文件,构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a)简…