参考之前记录的标量颜色映射,很多时候为了搞清楚标量在空间或者平面上的分布趋势,通常会通过提取等值面或者等值线的方式将这些数据可视化,这里会记录怎么使用VTK实现这样的功能。 工欲善其事必先利其器,实现这个功能的核心是vtkContourFIlter类,它提供了等值线(等值面)提取算法,只需要准备好数据,然后设置好轮廓参数,就可以实现了。关于过滤器的使用可以参考之前关于VTK渲染流水线的博客。 这个过滤器的功能是从众多的标量值中找出标量值相等的位置,把这些位置连成线或者生成面,当然这个过程中会使用已有的标量值进行插值…

2022年2月24日 0条评论 2325点热度 5人点赞 大脸猫 阅读全文

使用颜色映射标量数据是数据可视化中为了表现多个维度的数据时常用的一种手段 要作出这种图,数据类型一般为一个空间中的平面数据或者三维模型数据再加上一个或者多个的标量数据,在VTK中使用这样的数据类型需要了解两个关键类,vtkDataSetAttributes和vtkDataSet。 vtkDataSet是一个抽象类,不能直接实例化,它是VTK所有数据集类型的父类,主要为数据集类型声明了一些通用接口以及成员。 从这个继承树中可以看到vtkDataSet所有的子类。 实现颜色标量映射主要关注的只有两个接口: vtkCel…

2022年2月12日 0条评论 2947点热度 4人点赞 大脸猫 阅读全文

数据可视化是以图形的形式描述数据的一种方式,这其中包括三个步骤: 将数据转换为图形元素 将图形元素转换为计算机可绘制的图形 绘制图形 VTK将这个前两个步骤分解成了一些固定的过程,每个过程由不同的对象负责,将这些过程对象链接起来就是VTK的可视化流水线。 如图是一个数据到图形的最简单的可视化流水线。 Source代表数据源,源数据类型可以是多边形数据、网格数据、点数据等等,构造元数据的方式也多种多样,列如使用vtkCylinderSource类构造一个圆柱的数据,或者使用VTK提供的各种读取文件的类,从文件种生成源…

2022年1月12日 1条评论 2560点热度 1人点赞 大脸猫 阅读全文

这里使用了二维矩阵线程插值的方法和通过操作像素颜色来对QImage进行快速渲染方法,在之前的博文中有详细介绍。 二维矩阵线性插值方法:http://cppdebug.com/archives/155 QImage快速渲染方法:http://cppdebug.com/archives/186 通常需要使用Contour图展示的数据,都是三维数据。在绘制的过程中,一般用横纵坐标轴表示其中的一个数据,然后另一个数据使用颜色表示。 对于这样的需求,使用之前写到过的image数据渲染方法,非常简单就可以实现。 稍微改一改之前…

2021年7月15日 2条评论 3025点热度 4人点赞 大脸猫 阅读全文

在对QImage进行渲染的时候,有两种方式。一种是使用qpainter,把QImage作为一个画布构造一个QPainter,这样就可以使用QPainter的绘图函数在QImage对象上进行一些操作。还有一种方法是直接对QImage的数据及进行操作。 首先要了解QImage储存图像数据的方式,Qimage::Format给出了很多中数据存储的方式, 官方文档https://doc.qt.io/qt-5/qimage.html#Format-enum 这里以Format_ARGB32为例,我们知道图片都是以一个一个像素…

2021年7月15日 0条评论 3315点热度 14人点赞 大脸猫 阅读全文

现在又两个数,2和6,在中间插入一个数值,那么我们一般用(2+6)/2 = 4,这样在中间插入一个值。 那么在A和B之间插入数据的公式为(A+B)/2。 有这样一个长度为6一维数组: {1,5,7,9,10,14} 在每两个数中插入一个数值,之后得到一个长度为11的数组。 只需要先调整原数据的位置,将索引*2得到在新数组中的位置,然后再利用上面的插值公式 d[index] = (d[index-1] + d[index+1])/2。代码如下: const int length = 6; const int newL…

2021年7月15日 0条评论 5378点热度 10人点赞 大脸猫 阅读全文

Qt提供了一个非常方便的多语言国际化方案,开发者使用它可以用非常简单的方式让程序支持多种语言。 这里记录一个qt多语言的最简单的示例,开发工具使用的使qtcreator。 要实现多语言得支持,首先得在代码中完成这几个步骤: #include<QTranslator> //实例化一个翻译模块的对象,并载入翻译文件 QTranslator translator; translator.load("translator.qm"); //使用QApplictioin的对象,为程序安装翻译模块 app.insta…

2021年7月15日 0条评论 3658点热度 10人点赞 大脸猫 阅读全文

C++是一门允许程序员自己管理内存的语言,程序员们可以用使用new和delete自由的在堆空间中申请和释放内存,当然也可以使用从C继承而来的malloc和free。这样的内存管理机制在对内存把控要求极高的应用场景下提供了极大的便利,但是如果程序员对C++的内存管理机制不够熟悉,没有正确的申请和释放内存,造成的后果无疑是灾难性的。那么这里就记录一下new 与delete的多种使用方式。   这是最简单,也是最常用的使用方式 class A; A *a = new a; delete a; 首先了解一下这里的…

2021年7月13日 0条评论 3857点热度 11人点赞 大脸猫 阅读全文

前言: 最近使用虚函数的时候遇到了一个坑,折腾了挺久,后来查了一些资料才搞明白,遂记录一下。 假如有两个类A、B。B继承A,那么这个时候,A类的指针类型可以指向B的对象。 class A{ public: void say(){ std::cout << "A" << std::endl; } }; class B:public A{ public: void say(){ std::cout << "B" << std::endl; } }; A* a = new …

2021年3月31日 0条评论 2681点热度 0人点赞 大脸猫 阅读全文

之前尝试重定向std输出语句,并没有找到合适解决重定向时如何捕获输出事件的问题,只能使用定时器定时的检测缓冲区中的内容。 《关于std::cerr\cout\cin的重定向》 之后我在一个开源项目的代码中找到一个方案可以完美的解决这个问题。 使用这个方法首先得先了解流缓冲区std::streambuf。流缓冲区是负责它所关联的流对象所有写入、读取操作的对象,流对象会将输入输出操作都委托给缓冲区对象,将缓冲区当作一个流对象与输入输出之间的一个中介。 std::streambuf的详细介绍,戳一戳 这里主要关注sync…

2021年3月18日 0条评论 2400点热度 2人点赞 大脸猫 阅读全文
123456