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类相关推荐

  1. VTK笔记-计算MPR切面-vtkImageReslice类

    MPR   MPR(Multi-planar Reformation),多平面重建:多平面重建是将扫描范围内所有的轴位图像叠加起来,再对某些标线标定的重组线所指定的组织进行冠状位.矢状位.任意角度斜位 ...

  2. VTK修炼之道82:VTK管线机制_信息对象类VTKInformation

    1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...

  3. VTK源码阅读--vtkObject类-观察者/命令模式

    vtkObject类 vtkObject类是VTK中大多数类的基类:         vtkObject类提供了很多API用于跟踪对象修改时间,debug消息,打印类堆栈,以及事件回调:        ...

  4. VTK修炼之道26:图像基本操作_三维图像切片提取

    1.三维图像切片提取 切片是指三维图像中的一个切面对应的图像.切面可以是过图像内部一点且平行于XY.YZ.XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面.通过提取切片可以方便的浏览和分 ...

  5. VTK教程系列:VTK基础及应用开发教程

    由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...

  6. ICP in VTK

    提要          今天要研究的是关于图像配准的问题,图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取 ...

  7. VTK Actor ImageData polyData,Transform 平移,旋转

    在计算机图形学中,三维坐标点用齐次坐标表示.利用其次坐标,可以将空间变换用4x4的矩阵来表示.这些变换都可以用矩阵的运算完成. 当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示.因此它 ...

  8. 基于VTK的MPR实现

    基于VTK的MPR实现 多平面重建(MPR)是CT三维数据呈现的重要内容,其在三维数据的任一点空间位置,采用XY.XZ和YZ三个平面切空间数据得到三个切面分别为轴状面.冠状面和矢状面,而且X/Y/Z三 ...

  9. vtk教程第九章 高级算法

    我们再次回到可视化算法.本章描述的算法要么实现起来比较复杂,要么在3D可视化应用中应用较少.我们将算法分类为标量.向量.张量或建模算法. 9.1标量算法 正如我们所看到的,标量算法通常涉及通过查找表映 ...

最新文章

  1. 【UER #8】打雪仗
  2. 写给大家看的机器学习书【Part1】什么是机器学习?机器学到的到底是什么?
  3. 猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配...
  4. POI创建的文档具有不同条件的灵活样式
  5. 利用Pattern和Mather来禁止特殊字符的输入
  6. easyui 改变单元格背景颜色
  7. 读书篇:《细说PHP》三、PHP的语言结构
  8. 随机抽奖 php,php随机抽奖
  9. jsmind-网页版的由js实现的思维导图
  10. 基于java的出租车预约网站
  11. MQTT Retained消息和 LWT
  12. 线程池之ForkJoinPool
  13. C语言字母大小写互换的简单方法
  14. 【Python自动化测试】:模拟鼠标操作
  15. python画图网格线设置_PyPlot设置 plot的网格线间距_matplotlib_酷徒编程知识库
  16. 【图片按钮】在微信小程序中实现图片按钮
  17. ubuntu 16.04 桌面修复
  18. [转载] 黄志敏:一条数据新闻是如何用7步生产出来的?
  19. Makefile文件名称
  20. R语言基础知识-学习笔记汇总

热门文章

  1. PyPy-让Python爬的更快
  2. React does not recognize the `activeStyle` prop on a DOM element.
  3. 大话系列 | SVM(下)—时间刺客带你做项目
  4. c语言和c++还有java_C语言和Java的区别_JAVA和C++的核心区别
  5. 条件随机场实现命名实体识别
  6. AWS实战:Aurora到Redshift数据同步
  7. 深度学习文本分类文献综述(翻译自Deep Learning Based Text Classification: A Comprehensive Review)
  8. 平原绫香 Hirahara Ayaka-Jupiter
  9. c语言中while与for循环,C语言中的while循环、do while、for循环
  10. 无线耳机哪个音质好?无线蓝牙耳机音质排行榜