VTK-变换矩阵vtkMatrix4x4类
vtkMatrix4x4
vtkMatrix4x4类是一个用来表示和操作4阶矩阵的类。具体地说,它被设计用于使用4x4变换矩阵表示进行三维渲染时的齐次坐标[x y z w]。多数情况下采用列向量格式的16个double数组。
空间坐标变换是图像和图形学中的基础之一,VTK中大量与坐标和各个空间之间的转换,弄清楚变换的基本矩阵计算是很有必要的。vtkMatrix4x4和vtkMatrix3x3是VTK矩阵计算的基本操作数据结构。
接口
vtkMatrix4x4类中使用了一个public的double类型的二维数据的成员变量Element,记录了44个值;对应了一个44的齐次线性变换矩阵,第一列表示X轴方向,第二列表示Y轴方向,第三列表示Z轴方向,第四列表示(x,y,z)坐标和缩放系数;
double Element[4][4];
设置矩阵中的初始值:
Zero将每个位置的值都设置为0;
void Zero(){vtkMatrix4x4::Zero(*this->Element);this->Modified();
}
static void Zero(double elements[16]);
[ 0 0 0 0 ][ 0 0 0 0 ][ 0 0 0 0 ][ 0 0 0 0 ]
使用Identity()方法将Element值,填写为单位矩阵;
使用IsIdentity()方法判断矩阵是否为单位矩阵;
void Identity(){vtkMatrix4x4::Identity(*this->Element);this->Modified();
}
static void Identity(double elements[16]);
bool IsIdentity();
[ 1 0 0 0 ][ 0 1 0 0 ][ 0 0 1 0 ][ 0 0 0 1 ]
计算逆矩阵;
1.伴随矩阵A是矩阵A元素所对应的代数余子式,所构成的矩阵,转置后得到的新矩阵。
2.求出矩阵A的行列式|A|;
3.逆矩阵A⁻¹=A/|A|
static void Invert(const vtkMatrix4x4* in, vtkMatrix4x4* out){vtkMatrix4x4::Invert(*in->Element, *out->Element);out->Modified();
}
void Invert() { vtkMatrix4x4::Invert(this, this); }
static void Invert(const double inElements[16], double outElements[16]);
Invert的实现:
//----------------------------------------------------------------------------
// Matrix Inversion (adapted from Richard Carling in "Graphics Gems,"
// Academic Press, 1990).
void vtkMatrix4x4::Invert(const double inElements[16], double outElements[16]) {// inverse( original_matrix, inverse_matrix )// calculate the inverse of a 4x4 matrix//// -1// A = ___1__ adjoint A// det A//// calculate the 4x4 determinent// if the determinent is zero,// then the inverse matrix is not unique.double det = vtkMatrix4x4::Determinant(inElements);if (det == 0.0) {return;}// calculate the adjoint matrixvtkMatrix4x4::Adjoint(inElements, outElements);// scale the adjoint matrix to get the inversefor (int i = 0; i < 16; i++) {outElements[i] /= det;}
}
计算转置矩阵:
static void Transpose(const vtkMatrix4x4* in, vtkMatrix4x4* out){vtkMatrix4x4::Transpose(*in->Element, *out->Element);out->Modified();
}
void Transpose() { vtkMatrix4x4::Transpose(this, this); }
static void Transpose(const double inElements[16], double outElements[16]);
一维点向量通过变换矩阵的处理计算,是左乘;
void MultiplyPoint(const float in[4], float out[4]){vtkMatrix4x4::MultiplyPoint(*this->Element, in, out);
}
void MultiplyPoint(const double in[4], double out[4]){vtkMatrix4x4::MultiplyPoint(*this->Element, in, out);
}
static void MultiplyPoint(const double elements[16], const float in[4], float out[4]);
static void MultiplyPoint(const double elements[16], const double in[4], double out[4]);
float* MultiplyPoint(const float in[4]) VTK_SIZEHINT(4) { return this->MultiplyFloatPoint(in); }
double* MultiplyPoint(const double in[4]) VTK_SIZEHINT(4){return this->MultiplyDoublePoint(in);
}
float* MultiplyFloatPoint(const float in[4]) VTK_SIZEHINT(4){this->MultiplyPoint(in, this->FloatPoint);return this->FloatPoint;
}
double* MultiplyDoublePoint(const double in[4]) VTK_SIZEHINT(4){this->MultiplyPoint(in, this->DoublePoint);
return this->DoublePoint;
}
矩阵乘法
矩阵a右乘矩阵b,将结果放入矩阵c中;
MultiplyAndTranspose4x4()方法在乘法运算后,进行转置;
static void Multiply4x4(const vtkMatrix4x4* a, const vtkMatrix4x4* b, vtkMatrix4x4* c);
static void Multiply4x4(const double a[16], const double b[16], double c[16]);
static void Multiply4x4(const double a[16], const double b[16], float c[16]);
static void MultiplyAndTranspose4x4(const double a[16], const double b[16], float c[16]);
计算伴随矩阵,矩阵的伴随矩阵可用于矩阵的求逆运算。
void Adjoint(const vtkMatrix4x4* in, vtkMatrix4x4* out){vtkMatrix4x4::Adjoint(*in->Element, *out->Element);
}
static void Adjoint(const double inElements[16], double outElements[16]);
计算行列式的值。
double Determinant() { return vtkMatrix4x4::Determinant(*this->Element); }
static double Determinant(const double elements[16]);
对Element的值进行读取。
void SetElement(int i, int j, double value);
double GetElement(int i, int j) const { return this->Element[i][j]; }
double* GetData() { return *this->Element; }
const double* GetData() const { return *this->Element; }
参考资料
https://vtk.org/doc/nightly/html/vtkMatrix4x4_8h.html
VTK-变换矩阵vtkMatrix4x4类相关推荐
- VTK笔记-计算MPR切面-vtkImageReslice类
MPR MPR(Multi-planar Reformation),多平面重建:多平面重建是将扫描范围内所有的轴位图像叠加起来,再对某些标线标定的重组线所指定的组织进行冠状位.矢状位.任意角度斜位 ...
- VTK修炼之道82:VTK管线机制_信息对象类VTKInformation
1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...
- VTK源码阅读--vtkObject类-观察者/命令模式
vtkObject类 vtkObject类是VTK中大多数类的基类: vtkObject类提供了很多API用于跟踪对象修改时间,debug消息,打印类堆栈,以及事件回调: ...
- VTK修炼之道26:图像基本操作_三维图像切片提取
1.三维图像切片提取 切片是指三维图像中的一个切面对应的图像.切面可以是过图像内部一点且平行于XY.YZ.XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面.通过提取切片可以方便的浏览和分 ...
- VTK教程系列:VTK基础及应用开发教程
由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...
- ICP in VTK
提要 今天要研究的是关于图像配准的问题,图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取 ...
- VTK Actor ImageData polyData,Transform 平移,旋转
在计算机图形学中,三维坐标点用齐次坐标表示.利用其次坐标,可以将空间变换用4x4的矩阵来表示.这些变换都可以用矩阵的运算完成. 当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示.因此它 ...
- 基于VTK的MPR实现
基于VTK的MPR实现 多平面重建(MPR)是CT三维数据呈现的重要内容,其在三维数据的任一点空间位置,采用XY.XZ和YZ三个平面切空间数据得到三个切面分别为轴状面.冠状面和矢状面,而且X/Y/Z三 ...
- vtk教程第九章 高级算法
我们再次回到可视化算法.本章描述的算法要么实现起来比较复杂,要么在3D可视化应用中应用较少.我们将算法分类为标量.向量.张量或建模算法. 9.1标量算法 正如我们所看到的,标量算法通常涉及通过查找表映 ...
最新文章
- 【UER #8】打雪仗
- 写给大家看的机器学习书【Part1】什么是机器学习?机器学到的到底是什么?
- 猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配...
- POI创建的文档具有不同条件的灵活样式
- 利用Pattern和Mather来禁止特殊字符的输入
- easyui 改变单元格背景颜色
- 读书篇:《细说PHP》三、PHP的语言结构
- 随机抽奖 php,php随机抽奖
- jsmind-网页版的由js实现的思维导图
- 基于java的出租车预约网站
- MQTT Retained消息和 LWT
- 线程池之ForkJoinPool
- C语言字母大小写互换的简单方法
- 【Python自动化测试】:模拟鼠标操作
- python画图网格线设置_PyPlot设置 plot的网格线间距_matplotlib_酷徒编程知识库
- 【图片按钮】在微信小程序中实现图片按钮
- ubuntu 16.04 桌面修复
- [转载] 黄志敏:一条数据新闻是如何用7步生产出来的?
- Makefile文件名称
- R语言基础知识-学习笔记汇总
热门文章
- PyPy-让Python爬的更快
- React does not recognize the `activeStyle` prop on a DOM element.
- 大话系列 | SVM(下)—时间刺客带你做项目
- c语言和c++还有java_C语言和Java的区别_JAVA和C++的核心区别
- 条件随机场实现命名实体识别
- AWS实战:Aurora到Redshift数据同步
- 深度学习文本分类文献综述(翻译自Deep Learning Based Text Classification: A Comprehensive Review)
- 平原绫香 Hirahara Ayaka-Jupiter
- c语言中while与for循环,C语言中的while循环、do while、for循环
- 无线耳机哪个音质好?无线蓝牙耳机音质排行榜