GDI+学习之路4--线条、曲线和图形(二)

 

         10天都没有更新博文了,忙着做公司的事情。昨天终于交了,感受到做个产品的不容易。看来前期工作还是没有做够,呵呵……但总算完成了。现在可继续我的GDI+学习之路。

基数样条(Cardinal Splines)

         基数样条是一组独立的曲线按照一定的顺序连接成一条较大的曲线。样条由一组点和张力参数描述,基数样条以平滑的方式穿过数组里的每个点,在曲线上不会出现尖角和突变。下图显示一组点和穿过他们每个点的基数样条。

    基数样条在张力参数不同的时候将生成不同的曲线,下图显示了通过相同一组点集的4条基数样条,每条样条都标明了它的张力参数。注意张力系数为0的情况下相当于无限的物理张力,迫使曲线走点之间的最短路径(直线)。张力系数为1表示没有物理张力,此时样条采用最小弯程。如果张力系数大于1,此时的样条看起来就像被压扁的弹簧,被迫经过更长的路径。

需要注意的是,以上4条样条在顶点处都拥有相同的切线。

绘制基数样条的方法如下:

myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);

DrawCurve函数的参数分别为:Pen对象的地址、Point对象数组(存有基数样条经过的点集)、Point对象数组中点的个数、张力参数。

贝塞尔样条(Bezier Splines)

         贝塞尔样条是由四个点所确定的曲线:2个端点(p1p2)和2个控制点(c1c2)。曲线始于p1终于p2。曲线并不经过控制点,但是控制点扮演了磁铁的角色,将曲线往某个方向拉从而影响了曲线的走向。下图显示了贝塞尔样条和它的顶点以及控制点。

注意,曲线从p1开始向控制点c1移动。P1位置的切线是从p1c1。同时请注意,终点p2处的切线是从c2p2的。

绘制贝塞尔样条的方法如下:

myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);

DrawBezier函数的参数为:Pen对象的地址、起始点(00)、两个控制点(4020)和(80150)、终点(10010)。下图显示所绘制的贝塞尔样条曲线:

路径(Paths)

    路径由线条、矩形以及简单曲线等组合而成。以下基本构成块对于绘制图像非常有用。

l  Lines (线条)

l  Rectangles (矩形)

l  Ellipses (椭圆)

l  Arcs (弧线)

l  Polygons (多边形)

l  Cardinal splines (基数样条)

l  Bézier splines (贝塞尔样条)

Microsoft Windows GDI+中,GraphicsPath对象允许您将这些基本组成部分组合成一个单独的单位。整个一组线条、矩形、多边形和曲线可以通过Graphcis类的DrawPath方法一次性绘制。下图显示的是一条有线条、弧线、贝塞尔样条以及基数样条所组成的路径。

GraphicsPath类提供如下方法用于创建一系列对象:AddLineAddRectangleAddEllipseAddArcAddPolygonAddCurve (用于基数样条)以及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对象存有一个线条、一个椭圆和一条贝塞尔曲线。下图所示为该路径:

另外,您也可以添加路径到路径,这允许您将已有路径组合成更大更复杂的路径。以下代码将graphicsPath1graphicsPath2加入到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);

下图所示为这个路径。注意这个路径并没有连接起来;弧线、基数样条、字符串和饼图都是相离的。

现在就写到这里,晚上继续。

 

你可能感兴趣的:(GDI+)