设为首页 加入收藏

TOP

基于Windows GDI+的几何线条处理(二)
2012-11-04 15:32:53 来源: 作者: 【 】 浏览:604
Tags:基于 Windows GDI 几何 线条 处理
  4、路径的几何变形

  GDI+提供的Matrix类封装表示几何变形的3×3仿射矩阵。通过设置Matrix对象,可以旋转、缩放、错切或平移GraphicsPath对象。

  表2 Matrix类常用成员函数

常用成员函数功能描述
Rotate 相对于原点顺时针旋转指定角度
Scale缩放操作
Shear错切变换操作
Translate 平移操作
Reset重置此Matrix对象,使其成为单位矩阵

  以矩形为例,路径变形的示例代码如下:

Graphics g(hdc);
GraphicsPath path;
path.AddRectangle(Rect(40, 10, 200, 50));
g.DrawPath(&Pen(Color(255, 0, 0, 0),1), &path); // 在应用变形矩阵之前绘制矩形
// 路径变形
Matrix matrix;
matrix.Rotate(30.0f); //旋转顺时针30度
matrix.Scale(0.5f,0.5f);//缩小一半
path.Transform(&matrix);//应用变形
g.DrawPath(&Pen(Color(255, 0, 0, 0),3), &path); // 以3象素宽的粗线绘制变换后的矩形


图4 矩形的旋转与缩放

  类似的,用GraphicsPath类的Warp方法,可以对路径应用由一个矩形和一个平行四边形定义的扭曲变形。

  5、路径的存储与读取

  GraphicsPath 对象存储一系列直线和贝塞尔样条。尽管可以将若干种类型的曲线(椭圆、弧形和基数样条)添至路径,但在存储到路径中之前,各种曲线都会自动转化为贝塞尔样条。直线可以由起点和终点来构成,而贝塞尔样条曲线是由起点、终点和控制点定义。所以,对于一个路径的描述,可以通过对路径点信息的处理来实现。

  1) 存储路径

  在GraphicsPath对象的存储过程中,有三个函数非常重要,那就是GetPointCount、GetPathPoints和GetPathTypes,利用这3个函数,可以获得路径中路径点的数目、坐标和类型。具体代码如下:

INT count = path.GetPointCount(); // 获得路径点数目
ar<<count; // 存储路径点数目
dataPoints = new Point[count];
path.GetPathPoints(dataPoints, count); // 获得路径点坐标
pTypes = new BYTE[count];
path.GetPathTypes(pTypes, count); // 获得路径点类型
//开始存储
for(INT i=0;i<count;i++){
 ar<<dataPoints[i].X<<dataPoints[i].Y; // 存储路径点坐标
 ar<<pTypes[i]; // 存储路径点类型
}
……………………
delete dataPoints; // 回收内存
delete pTypes;

  2) 读取路径

  由于GraphicsPath类中只有构造函数才能由路径点创建,读取路径的方法就要复杂一些了。具体代码如下:

path.Reset(); // 重置路径
INT count;
ar>>count; // 读取路径点数目
dataPoints = new Point[count]; // 定义路径点坐标
pTypes = new BYTE[count]; // 定义路径点类型
//开始读取
for(INT i=0;i<count;i++){
 ar>>dataPoints[i].X>>dataPoints[i].Y; // 读取路径点坐标
 ar>>pTypes[i]; // 读取路径点类型
}
GraphicsPath pa(dataPoints,pTypes,count); // 由路径点创建临时路径pa
path.AddPath(&pa,false); // 将临时路径pa添加到路径path中
……………………
delete dataPoints; // 回收内存
delete pTypes;

  6、路径的线段逼近

  调用GraphicsPath对象的Flatten方法,可以将路径中的曲线全部转换成多段相连的直线段,如图5所示,这种方法也被称为"拉平"或"展平"。Flatten方法接收拉平参数,该参数指定拉平的路径和原始路径之间的最大距离。


图5 原始曲线路径与拉平后的路径(这里拉平参数为8.0)

  将路径拉平后,使用直线段长度累加的方法,可以轻易地计算出路径曲线的长度和其他信息,并可以通过降低拉平参数值的方法来提高计算的精度。由于路径点的坐标是以浮点数的形式保存的,因而用这种方式得到的曲线长度的精度还是相当高的。

  结束语

  GraphicsPath还有很多种用法,比如可以使用IsVisible方法判断坐标点是否落在路径上,使用IsOutlineVisible方法指示当使用指定的Pen对象绘制此GraphicsPath 对象时,指定点是否包含在后者的轮廓内。

  从开发的实践过程来看,使用GDI+进行图形编程(www.cppentry.com),比原先的GDI编程(www.cppentry.com)过程要容易很多,而且最终的图形功能也更强大。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇QQ尾巴病毒的Visual C++实现探讨 下一篇Visual C++中动态链接库技术浅谈

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: