VTK笔记-图形相关-vtkImageCanvasSource2D绘制几何图形-程序员宅基地

技术标签: VTK笔记-图形相关  VTK  

前言

vtkImageCanvasSource2D

vtkImageCanvasSource2D可以根据指定的大小和类型创建一个空白的2D图像的画布。空白是没有标量数据,然后可以在画布上绘制各种图形元素,比如:矩形,椭圆、线段。
在这里插入图片描述

主要接口说明

标量维度:
virtual void vtkImageCanvasSource2D::SetNumberOfScalarComponents(int i)
函数功能:设置标量数据维度;
函数参数:int i:维度数值;
virtual int GetNumberOfScalarComponents() const;
函数功能:获取标量数据维度;
设置标量数据类型相关函数接口:
void SetScalarTypeToFloat();
void SetScalarTypeToDouble();
void SetScalarTypeToInt();
void SetScalarTypeToUnsignedInt();
void SetScalarTypeToLong();
void SetScalarTypeToUnsignedLong();
void SetScalarTypeToShort();
void SetScalarTypeToUnsignedShort();
void SetScalarTypeToUnsignedChar();
void SetScalarTypeToChar();
void SetScalarType(int);
int GetScalarType() const;
颜色相关函数接口:
void SetDrawColor(double a) { this->SetDrawColor(a, 0.0, 0.0, 0.0); }
void SetDrawColor(double a, double b) { this->SetDrawColor(a, b, 0.0, 0.0); }
void SetDrawColor(double a, double b, double c) { this->SetDrawColor(a, b, c, 0.0); }
函数功能:设置颜色,vtkImageCanvasSource2D画图的过程就是把颜色值当作标量值,然后赋给图形内部的各个点;
画图相关函数接口:
void FillBox(int min0, int max0, int min1, int max1);
函数功能:绘制方块;
函数参数:int min0,int max0:第一维度从小到大的范围为min0-max0;第二维度从小到大的范围为min1-max1;
void FillTube(int x0, int y0, int x1, int y1, double radius);
函数功能:绘制有宽度的线段;
函数参数:int x0, int y0:线段开始位置点;int x1, int y1:线段结束位置点; double radius:线段宽;
void FillTriangle(int x0, int y0, int x1, int y1, int x2, int y2);
函数功能:绘制三角形;
函数参数:int x0, int y0:三角形第一个点;int x1, int y1:三角形第二个点;int x2, int y2:三角形第三个点;
void DrawCircle(int c0, int c1, double radius);
函数功能:绘制圆形轮廓;
函数参数:int c0, int c1:圆心坐标点;double radius:圆的半径;
void DrawPoint(int p0, int p1);
函数功能:绘制点;
函数参数:int p0, int p1:像素点坐标;
void DrawSegment(int x0, int y0, int x1, int y1);
函数功能:绘制线段在2D图像上;
函数参数:int x0, int y0:线段第一个点;线段的第二个点;
void DrawSegment3D(double* p0, double* p1);
函数功能:在3D空间内绘制线段;
函数参数:double* p0第一个点(x,y,z);double* p1:第二个点(x,y,z);
void DrawSegment3D(double x1, double y1, double z1, double x2, double y2, double z2);
函数功能:在3D空间内绘制线段,函数内部使用 void DrawSegment3D(double* p0, double* p1)来实现功能;
函数参数:double x1, double y1, double z1:第一个点坐标;double x2, double y2, double z2:第二个点坐标;
void DrawImage(int x0, int y0, vtkImageData* i) { this->DrawImage(x0, y0, i, -1, -1, -1, -1); }
函数功能:在画布的x0和y0位置绘制输入图像的子图像。
函数参数:int x0, int y0:起始坐标位置;
void DrawImage(int x0, int y0, vtkImageData*, int sx, int sy, int width, int height);
函数功能:在画布的x0和y0位置绘制输入图像的子图像。子图像由sx、sy、width和height定义。
函数参数:int x0, int y0:起始坐标位置;int sx, int sy:?? int width, int height:图形宽高;
void FillPixel(int x, int y);
函数功能:用另一种颜色填充有颜色的区域。(如连接性)所有连接到像素(x,y)的像素(并且具有相同的值)都被当前的“DrawColor”替换。
函数参数:int x, int y:颜色填充开始的坐标点,在该点附近的连通颜色都会改变;

实例

使用上文提到的接口,实现在画布上绘制线段,圆,方块,带有宽带的线段的示例;

代码

#include "vtkSmartPointer.h"
#include "vtkImageCanvasSource2D.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageViewer2.h"

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

using namespace std;
int main()
{
    
	vtkSmartPointer<vtkImageCanvasSource2D> imageSource = vtkSmartPointer<vtkImageCanvasSource2D>::New();
	imageSource->SetNumberOfScalarComponents(1);
	imageSource->SetScalarTypeToUnsignedChar();
	imageSource->SetExtent(0, 512, 0, 512, 0, 0);
	// 1.设置背景颜色
	imageSource->SetDrawColor(86.0);
	// 2.绘制背景方块;
	imageSource->FillBox(0, 512, 0, 512);
	imageSource->SetDrawColor(0.0);
	// 3.有宽度线段
	imageSource->FillTube(500, 20, 30, 400, 5);
	// 4.设置颜色为白色
	imageSource->SetDrawColor(255.0);
	// 5.线段
	imageSource->DrawSegment(10, 20, 500, 510);
	// 6.设置颜色为黑色
	imageSource->SetDrawColor(0.0);
	// 7.绘制圆轮廓
	imageSource->DrawCircle(400, 350, 80.0);
	imageSource->SetDrawColor(255.0);
	// 8.给圆填充颜色
	imageSource->FillPixel(450, 350);
	imageSource->SetDrawColor(170);
	imageSource->FillTriangle(100, 100, 300, 150, 150, 300);
	imageSource->Update();
	// 生成渲染对象;
	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
	viewer->SetInputConnection(imageSource->GetOutputPort());
	viewer->SetColorLevel(127.0);
	viewer->SetColorWindow(256);
	viewer->SetSize(512, 512);
	viewer->SetupInteractor(iren);
	viewer->Render();
	iren->Initialize();
	iren->Start();
	return 0;
}

运行后效果
在这里插入图片描述

解读

1.创建画布,指定其大小和标量数据类型;
2.绘制6个图形元素,每画一个图形前,都用方法SetDrawColor设置了一个颜色;
注意: 1)画图的过程就是把颜色值当作标量值,然后赋给图形内部的各个点。
2)如果图形的位置有重叠,那么后面画的图形的颜色值会覆盖先前画的;
3)FillPixel方法会使用一种颜色替换掉指定区域的颜色,其参数是一个画布上的点坐标,该点的颜色就是需要被替掉的颜色,在该点的周围,所有颜色相同的区域颜色都要被替换掉,知道遇到不同颜色的区域为止,其效果类似于Windows自带的画图程序中的填充效果。

遇到的问题

1.不知道怎么对圆内的区域进行填充颜色;

引用

1.《VTK图形图像开发进阶》;
2.《医学图像编程技术》;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liushao1031177/article/details/116040643

智能推荐

数据结构-栈和队列的应用(验证括号的正确性,表达式求值,层次遍历)_python数据结构栈和队列的应用--算术表达式求值演示设计报告-程序员宅基地

文章浏览阅读206次。栈和队列的应用  栈的应用  验证括号的正确性  题目很简单就是输入一串字符,判断字符中的括号是否合法。直接上代码:#include <iostream>#include <string.h>using namespace std;typedef char ElemType;#define MAXSIZE 100typedef struct Stack{ ElemType data[MAXSIZE]; int top;}Stack;void Init_python数据结构栈和队列的应用--算术表达式求值演示设计报告

PYNQ-TinyYoloV3 ON THE PYNQ_pynq yolov3-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏59次。Today,You can use python to develop FPGA,it is PYNQ.The brief specification of PYNQ Z2 is as follows, with some parameters I am concerned about bolded:ZYNQ XC7Z020-1CLG400C •650MHz dual-core Cortex-A9 processor •DDR3memory controller with 8 DM..._pynq yolov3

vue 渲染多列表格,拖动加载-程序员宅基地

文章浏览阅读302次。vue在使用el-table渲染多列(几千列)表格时,页面会十分卡顿,使用html原生表格拖动滚动条加载列,可以解决这个问题。line_data中的数据title对应index_title里的内容。

五分钟了解机器学习的基本概念-程序员宅基地

文章浏览阅读1.4w次,点赞21次,收藏120次。三分钟了解机器学习的基本概念-1、人工智能、机器学习、深度学习之间的关系2、什么是机器学习?3、机器学习的常见问题之 过拟合4、如何克服过拟合?5、机器学习的类型6、分类和回归_机器学习

入行网络安全需要学习哪些知识点?白帽子都给你汇总在这里,一文全懂-程序员宅基地

文章浏览阅读55次。理论层面的知识是面试必备,大家要熟练掌握(占40%),业务项目的实操部分是职场晋升必备(占60%);就业环节,简历作为敲门砖优化工作必不可少(占70%),面试过程大家基于学习能力,完全可以去自信面对即可(占30%)。最后还是老规矩:想要转行学习网络的同学,希望能进一步告知你的年龄、学历、专业背景以及目前在城市等具体情况,方便我针对性给到更合理的建议哟~

解决虚拟机vmware虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...-程序员宅基地

文章浏览阅读147次。前言虚拟机使用的是VMware Workstation,并且首次在虚拟机体验64 位系统。在新建好虚拟机,运行时候就出现了VMware Workstation 的提醒:此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。如图:提示信息已将该虚拟机配置为使用64位客户机操作系统。但是,无法执行64位操作。此主机支持Intel VT-x,但In..._老薛主机安装imobtrax安装失败

随便推点

如何利用大模型LLM辅助,使用Python完成将CSV快速导入MySQL数据库-程序员宅基地

文章浏览阅读269次,点赞3次,收藏5次。导入的过程:错误的行通过“异常”抓去出来,保存到-error.csv结尾的文件中,以便后续继续处理,原来导入的文件只留下正确的可导入的数据。2、定义好导入的文件和表对,文件都要在变量path目录下,格局需要修改,也可path放空,在map对里面直接写完整的文件名。无废话,CSV中有少量不合规数据需要手工处理可利用此方法,适合有点经验的程序员,可以不熟Python,思路还是要有一点。本人不熟Python,chatGPT由于网络问题总是不太好用,利用了。看“main()”函数,,辅助实现了相关代码。

linux下oracle日志文件在哪里,Linux环境下利用数据文件、控制文件、日志文件恢复ORACLE10g数据库...-程序员宅基地

文章浏览阅读1.3k次。重装系统后,我们正好也有原数据库的数据文件、控制文件和日志文件的话,那么在恢复数据库时有下面两种情况。1.如果新系统的Oracle与重装前的数据库是一样的话(数据库的安装目录、数据文件目录等数据库结构),那么此时数据库的恢复比较简单:1)备份新系统的Oracle相关数据库文件,如oradata/SID/下面的文件。2)删除新建数据库的所有数据文件、控制文件和日志文件。复制原数据库的数据文件、控..._linux的oracle数据库操作日志在哪

Linux命令总结-程序员宅基地

文章浏览阅读781次,点赞21次,收藏23次。-表示用户--主机名--家目录--管理员用户--普通用户~--root的家目录-opt目录。

802.1W RSTP_如何判断ap,rp接口-程序员宅基地

文章浏览阅读573次。RSTP比起STP主要优化在哪里?802.1D STP的最大问题在于收敛速度特别慢,而RSTP主要优化在收敛效率上。RSTP的端口角色RP------根端口DP------指定端口NDP------阻塞端口AP------替代根端口------能够实时监控RP的状态BP------备份指定端口如何区分一个NDP接口是AP还是BP通过查看该NDP接口收到的BPDU中的Bridge ID是否为自身的Bridge ID如果收到的BPDU中的Bridge ID不是自身的Bridg_如何判断ap,rp接口

Attention is All You Need?LSTM提出者:我看未必-程序员宅基地

文章浏览阅读304次。视学算法报道机器之心编辑部转载自公众号:机器之心Transformer 中的注意力机制等价于一种 Hopfield 网络中的更新规则?LSTM 提出者 Sepp Hochreiter 等..._玻尔兹曼机亚稳态

使用Go语言编写的微服务架构实践-程序员宅基地

文章浏览阅读233次,点赞4次,收藏8次。1.背景介绍在本文中,我们将探讨如何使用Go语言编写微服务架构。微服务架构是一种分布式系统的设计方法,它将应用程序拆分为多个小服务,每个服务都负责处理特定的功能。这种架构有助于提高系统的可扩展性、可维护性和可靠性。Go语言是一种静态类型、编译式、并发性能强的编程语言,它非常适合编写微服务。1. 背景介绍微服务架构是近年来逐渐成为主流的分布式系统设计方法。它的核心思想是将应用程序拆分为多...

推荐文章

热门文章

相关标签