《Practical WPF Charts and Graphics 》翻译——之十

来源:互联网 发布:mysql front 5.3 编辑:程序博客网 时间:2024/06/17 02:44

WPF里的向量和矩阵

 

WPF在2D空间的齐次坐标系实现了一个Vector和Matrix结构。它使用一个列向量左乘矩阵的转换。齐次坐标系里的一个点或者一个向量使用三个双精度值(X,Y,1)进行定义。在WPF里,这些坐标也可以用两个双精度值(X,Y)表示,既然第三个双精度值一直等于1。

 

向量结构

 

WPF里使用一个structure定义向量。一个结构体和一个类相似。一个类和一个结构体都可以包含数据成员和函数成员。一个结构体和一个类的主要区别是结构体是一个值类型,因此存在栈里面。一个类,另一方面,是一个引用类型,存储一个动态分配的对象的引用。通常,结构体相对类来说有一个性能优势,因为结构体是分配在栈上,过时之后会立即释放掉。注意结构体不能从另一个类或者结构体继承;也就是说,及沟通不能是一个基类,因为它隐藏密封的自然性质。结构体不允许有一个无参数的构造器。许多简单的数学功能,包括向量和矩阵,由于性能原因,在WPF使用结构体定义。

一个Vector是齐次坐标系里一个带有3个元素的列数组。由于最后一个元素一直等于1,只有前两个元素需要指定。例如:

Vector v= new Vector(10, 20);

注意在WPF里一个向量和一个点是两个不同的对象。下面的表达在WPF里是不正确的:

Vector v= new Point(10,20);

然后,你可以使用点定义一个向量,或者反过来,通过下面的方式:

       Vectorv1 = new Point(10, 20) - new Point(20, 30);

Vector v2 = (Vector)new Point(10, 20);

Point pt1 = (Point)new Vector(10, 20);

一个向量有下面的四个公共属性:

Length-获取向量的长度

LengthSquared-获取向量长度的平方

X-获取或者设置向量的X组成部分

Y-获取或者设置向量的Y组成部分

另外,有一些和向量相关的方法允许你对它们进行不同的数学操作。下面是一些经常用到的方法:

l  Add-增加一到某一点的向量或者另一个向量

l  Subtract-从一个向量减去另一个向量

l  Multiply-使用一个特定的浮点数,矩阵或者向量乘以一个向量,返回一个向量结果

l  Divide-用一个标量除一个向量,返回一个向量

l  CrossProduct-计算两个向量的叉积

l  AngleBetween-获取两个向量间的夹角,用角度表示

l  Normalize-归一化向量

例如:

Vectorv1 = new Vector(20, 10);

Vectorv2 = new Vector(10, 20);

doublecross = Vector.CrossProduct(v1, v2);

doubleangle = Vector.AngleBetween(v1, v2);

v1.Normalize();

doublelength2 = v1.LengthSquared; 

 

这产生叉积的大小cross=300和一个沿Z轴的方向,它可以通过公式轻易的证明


Angle=36.78度。这可以通过下面的公式证明,这个公式计算两个向量的夹角

      

V1归一化后的结果存进v1。这种情况下,v1变成(0.894,0.447),可以通过长度的平方证明:length2=1

 

矩阵结构


我们已经证明了齐次坐标系里的变换矩阵经常带有最后一列(0,0,1)。可以从任何组合变换矩阵使用这些基本的变换有相同的最后一行看出来。基于这个事实,WPF定义了3*2大小矩阵的变换。因此,WPF里的矩阵有6个元素,分成3行和2列。在方法和属性里,Matrix对象经常用6个元素的数组指定,如下面:(M11,  M12,  M21, M22,  OffsetX,  OffsetY). OffsetX和OffsetY代表变换值。

例如,由默认的构造器构造的缺省的一致矩阵包含一个(1, 0, 0, 1, 0, 0)值。用矩阵表示方式,这就是 。这是 的简化式。最后一列通常是

因此,一个在X方向有3单元,Y方向2单元的变换,将会表示成(1,0,0,1,3,2)。用矩阵的形式,我们有 。这是的简化式。

你可以在WPF里使用重载构造函数创建一个矩阵对象。这得到一个双精度的数组,它保存着矩阵元素,作为参数。下面的代码段用代码创建了3个矩阵对象用来平移,旋转和旋转。

doubledx = 3;

doubledy = 2;

doublesx = 0.5;

doublesy = 1.5;

doubletheta = Math.PI / 4;

doublesin = Math.Sin(theta);

doublecos = Math.Cos(theta);

Matrixtm = new Matrix(1, 0, 0, 1, dx, dy);

Matrixsm = new Matrix(sx, 0, 0, sy, 0, 0);

Matrixrm = new Matrix(cos, sin, -sin, cos, 0, 0);

tm矩阵是一个平移矩阵,它将一个对象在X方向平移3个单位,在Y方向平移两个单位。拉伸矩阵sm一个对象在X方向拉伸0.5倍,在Y方向拉伸1.5倍。最后的rm矩阵将一个对象关于原点旋转45度。

另外相对于这六个矩阵元素的属性,还有四个和矩阵相关的公共属性:

Determinant—获取矩阵的行列式

HasInverse—获取一个表示Matrix结构是否可逆的值

Identity—获取一个一致矩阵

IsIdentity—获取一个表示Matrix结构是否为一致矩阵的值

 

矩阵操作

 

WPF里的Matrix结构提供了进行旋转,拉伸和平移的方法。它也实现了一些进行矩阵操作的方法。例如,你也可以使用Invert方法来得到一个可逆矩阵的逆。这个方法没有参数。Multiply方法将两个矩阵相乘并返回一个新矩阵作为结果。下面是一些矩阵操作常用的方法:

Scale—添加一个指定的拉伸向量到Matrix结构

ScaleAt—将矩阵关于指定点拉伸到指定大小

Translate—添加一个指定偏移量的平移到到Matrix结构

Rotate—应用一个关于原点的指定角度的旋转到Matrix结构


原创粉丝点击