科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于Windows GDI 的几何线条处理

基于Windows GDI 的几何线条处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

介绍了GDI 对几何线条创建、应用等基本方法,并以实例的方式对其中难于理解的部分提供了示例代码。

作者:徐歆恺 梁博 葛庆平 来源:计算几与信息技术 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
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+进行图形编程,比原先的GDI编程过程要容易很多,而且最终的图形功能也更强大。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章