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


当所有的图形都绘制完毕后,在把这些小的图形统统放到Page坐标系里 。具体就是,调用绘制小图形的代码之前调用GDI+的()系列函数把小图形的建模坐标系放置到Page坐标系里,在绘制小图形的代码之后,调用() 。
讲到这里,也许大家会有疑问了,GDI+最后是如何把Page坐标系的图形绘制到屏幕上的呢,这就是显示器的坐标系 。
3.坐标系
对于Page坐标系和坐标系的转换,应用程序员不需要了解了,GDI+已经把这部分隐藏了 。
4 GDI+中坐标系的转换实例 4.1题目
利用GDI+绘制如下图形:
4.2 分析
仔细看上面的图形,不难发现,此图形有6部分组成:头,左臂,右臂,身体,左腿,右腿 。分别把各个部分分给6个设计师去建模,然后把各个模型连同其建模坐标系一起放到到Page坐标系中 。如下图:
4.3代码
pHead;
pBody;
;
;
;
;
SizeF sHead = newSizeF(30, 30); //头大小30cm
SizeF sBody = newSizeF(50, 70); //身体大小
SizeF sArm = newSizeF(10, 60); //胳膊大小
SizeF sLeg = newSizeF(20, 70); //腿大小
void ( e)
e..(Pens.Red, -sHead.Width / 2.0f, -sHead. / 2.0f, sHead.Width, sHead.);
void ( e)
e..(Pens.Black, 0, 0, sBody.Width, sBody.);
void ( e)
e..(Pens.Black, 0, 0, sArm.Width, sArm.);
void ( e)
e..(Pens.Black, 0, 0, sArm., sArm.Width);
void ( e)
e..(Pens.Black, 0, 0, sLeg.Width, sLeg.);
void ( e)
e..(Pens.Black, 0, 0, sLeg., sLeg.Width);
void ( ,e)
pHead = new(this.Width / 2.0f, 100f);//放置头坐标系
e..(pHead.X, pHead.Y);
(e);//调用负责头建模的代码
e..();//重置矩阵
pBody = new(pHead.X - sBody.Width/2.0f, pHead.Y+sHead./2.0f);
e..(pBody.X, pBody.Y);
(e);
e..();
= pBody;
e..(.X, .Y);
e..(45);
(e);
e..();
= new(pBody.X + sBody.Width, pBody.Y);
e..(.X, .Y);
e..(45);
【4 GDI+中坐标系的转换实例】(e);
e..();
= new(pBody.X, pBody.Y + sBody.);
e..(.X, .Y);
e..(45);
(e);
e..();
= new(pBody.X + sBody.Width, pBody.Y + sBody.);
e..(.X, .Y);
e..(45);
(e);
e..();
5 MSDN中的几个不妥
由于GDI存在的时间很长,而GDI+诞生后为了兼容,一部分函数采用了与GDI相同的名称,甚至参数,参数的含义在MSDN中也按照原来的解释,导致了一些容易让读者误解的地方 。
5.1绘图函数中关于左上角upper-left 的描述
我们知道,GDI+的绘图函数使用的坐标系是由建模人员随意定义的,以函数
publicvoid DrawRectangle(
Pen pen,
float x,
float y,
float width,
float height
)
为例,MSDN中对x,y解释如下:
Type:.
The x- of the upper-leftof theto draw.
Type:.

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

文章插图
The y- of the upper-leftof theto draw.
然而此处的x,y真的是矩形左上角坐标吗?换句话说,左上是从什么角度看的 。如下图:
在A1坐标系中,()函数中的x,y确实代表了矩形的左上角 。A2和A3是A1经过旋转以后得到的坐标系,此时x,y在建模者看来显然是右下角和左下角 。而对于更常见的笛卡尔右手坐标系B来说,(x,y)也不是左上角 。左上角的概念仅在Page坐标系中成立 。关于(x,y)的正确解释应该是:
矩形四个角中,x,y值都最小的那个角的坐标 。
5.2 问题
5.2.1不带参数的变换函数顺序执行的理解
前面提到过其实对坐标系的转换就是矩阵的乘法运算 。这里面涉及到了变换的顺序和矩阵乘法的顺序的问题 。讲解之前一定要确立坐标系变换的视角:把建模坐标系放置到Page坐标系中,从Page坐标系一步步变化成最终坐标系 。