10天都没有更新博文了,忙着做公司的事情。昨天终于交了,感受到做个产品的不容易。看来前期工作还是没有做够,呵呵……但总算完成了。现在可继续我的GDI+学习之路。
基数样条是一组独立的曲线按照一定的顺序连接成一条较大的曲线。样条由一组点和张力参数描述,基数样条以平滑的方式穿过数组里的每个点,在曲线上不会出现尖角和突变。下图显示一组点和穿过他们每个点的基数样条。
基数样条在张力参数不同的时候将生成不同的曲线,下图显示了通过相同一组点集的4条基数样条,每条样条都标明了它的张力参数。注意张力系数为0的情况下相当于无限的物理张力,迫使曲线走点之间的最短路径(直线)。张力系数为1表示没有物理张力,此时样条采用最小弯程。如果张力系数大于1,此时的样条看起来就像被压扁的弹簧,被迫经过更长的路径。
需要注意的是,以上4条样条在顶点处都拥有相同的切线。
绘制基数样条的方法如下:
myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);
DrawCurve函数的参数分别为:Pen对象的地址、Point对象数组(存有基数样条经过的点集)、Point对象数组中点的个数、张力参数。
贝塞尔样条是由四个点所确定的曲线:2个端点(p1和p2)和2个控制点(c1和c2)。曲线始于p1终于p2。曲线并不经过控制点,但是控制点扮演了磁铁的角色,将曲线往某个方向拉从而影响了曲线的走向。下图显示了贝塞尔样条和它的顶点以及控制点。
注意,曲线从p1开始向控制点c1移动。P1位置的切线是从p1到c1。同时请注意,终点p2处的切线是从c2到p2的。
绘制贝塞尔样条的方法如下:
myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);
DrawBezier函数的参数为:Pen对象的地址、起始点(0,0)、两个控制点(40,20)和(80,150)、终点(100,10)。下图显示所绘制的贝塞尔样条曲线:
路径由线条、矩形以及简单曲线等组合而成。以下基本构成块对于绘制图像非常有用。
l Lines (线条)
l Rectangles (矩形)
l Ellipses (椭圆)
l Arcs (弧线)
l Polygons (多边形)
l Cardinal splines (基数样条)
l Bézier splines (贝塞尔样条)
在Microsoft Windows GDI+中,GraphicsPath对象允许您将这些基本组成部分组合成一个单独的单位。整个一组线条、矩形、多边形和曲线可以通过Graphcis类的DrawPath方法一次性绘制。下图显示的是一条有线条、弧线、贝塞尔样条以及基数样条所组成的路径。
GraphicsPath类提供如下方法用于创建一系列对象:AddLine、AddRectangle、AddEllipse、AddArc、AddPolygon、AddCurve (用于基数样条)以及AddBezier。
绘制一条路径的方法如下:
myGraphicsPath.AddLine(0, 0, 30, 20);
myGraphicsPath.AddEllipse(20, 20, 20, 40);
myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10);
myGraphics.DrawPath(&myPen, &myGraphicsPath0);
DrawPath方法的参数分别为:Pen对象的地址和GraphicsPath对象地址。GraphicsPath对象存有一个线条、一个椭圆和一条贝塞尔曲线。下图所示为该路径:
另外,您也可以添加路径到路径,这允许您将已有路径组合成更大更复杂的路径。以下代码将graphicsPath1和graphicsPath2加入到myGraphicsPath中 ,AddPath方法的第二个参数用于指定新增路径是否与已有路径相连。
myGraphicsPath.AddPath(&myGraphicsPath1, FALSE);
myGraphicsPath.AddPath(&myGraphicsPath2, TRUE);
字符串和饼图也可以加入到路径中(图饼是椭圆的一部分)。下面将创建一个有弧线、基数样条、字符串和饼图组成的路径。
myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);
myGraphicsPath.AddCurve(myPointArray, 3);
myGraphicsPath.AddString(L”a string in a path”, 18, &myFontFamily, 0, 24, myPointF, &myStringFormat);
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);
myGraphicsPath.DrawPath(&myPen, &myGraphicsPath);
下图所示为这个路径。注意这个路径并没有连接起来;弧线、基数样条、字符串和饼图都是相离的。
现在就写到这里,晚上继续。