4 GDI+中坐标系的转换实例( 三 )


可以通过两步完成:
(1)平移至虚线位置;
(0, dy);
(2)旋转一定角度 。
(45);
如果我们把(1)(2)顺序反过来,那么最终的结果如下图:
所以说先平移、旋转的顺序很重要 。当前的操作是在前一步完成之后的新坐标系中进行的 。对应于矩阵算法相当于左乘 。
5.2.2 带参数的函数的理解
publicvoid TranslateTransform(
float dx,
float dy,
MatrixOrder order
)
在MSDN中对于解释为:
其实际效果是,相当于无此参数的版本,也就是说此次调用是在前面操作结果的基础上操作的;相当于矩阵左乘 。
相当于此次操作先于前面的操作起作用,也就是先进行当前的操作,在此基础上进行此次调用前面的操作 。相当于矩阵右乘 。在中都是采用模式的 。
如此看来,上述英文解释正好相反了 。这个不能说是错,可能是从不同的视角来看问题,我们的视角是:从Page坐标系一步步变化成最终坐标系 。
5.3 .属性
这个属性比较特殊 。MSDN的解释为:
获取或设置此的几何世界变换的副本 。
获取的是变换矩阵的副本,而不是变换矩阵本身,也就是每次获取时,新建一个和变换矩阵成员值相同的矩阵对象,并返回 。
问题是设置 。设置的不是副本,而是变换矩阵本身 。
内部实现伪代码
class
;
get {.Clone(); }
set { =value; }
如果要通过矩阵乘法进行坐标转换,那么代码如下:
e.. = ..((....))
6 变换函数不能解决的问题
GDI+提供了平移、旋转、缩放等函数供我们调用,来把Page坐标系一步步改造成最终的建模坐标系在Page中的表现形态 。对于绝大多数情况,这些函数足够了,但是看如下:
无论怎么平移和旋转,Page坐标系也无法编程上面红色显示的坐标系 。这是因为Page坐标系属于左手坐标系,而红色所示是右手坐标系 。在数学上,大多数情况使用的都是右手坐标系,模型也是建立在右手坐标系上,那么如何把Page转化为右手坐标系呢 。也就是把y轴反向 。答案是通过直接操纵的变换矩阵 。
e.. = e...((1, 0, 0, -1, 0, 0));//y反向
上述代码就实现了y轴反向的目的 。
如果你对变换矩阵很了解,直接操作矩阵左右乘法,与调用相关的GDI+变换函数功效完全相同,可以实现任意变换 。
(后注:Y轴反方向可以通过g.(1, -1)完成)