5.3.4 贝塞尔样条曲线

来源:互联网 发布:linux服务启动关闭管理 编辑:程序博客网 时间:2024/05/24 00:40

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P127

        英语单词“spline”(曲尺,又称为样条曲线)最初指的是一块可以弯曲的物体,可以是木头、橡皮或金属条,它可以用来在纸张上绘制曲线。例如,如果有一些离散的点,并且想在它们之间画曲线,无论是内插拟合或者外插拟合,都应当首先将这些点描绘在图纸上。接着,固定一个曲尺在这些点上,使用铅笔沿着曲尺绕着这些点弯曲的方向绘制曲线

        当然,现在样条曲线已经变成了一个个数学公式。有很多种不同的样条曲线,但是贝塞尔样条曲线是计算机图形程序设计中用得最广的。它直到最近才得以加到操作系统的图形工具库中,并且它出自一个几乎不可能的来源:20 世纪 60 年代,法国雷诺汽车公司由手工设计(使用黏土模型)转变到使用计算机辅助设计。这就需要用到一些数学工具,而皮埃尔 ● 贝济埃(Pierre Bezier)提出了一套数学公式,事实证明这些数学公式起了很大作用。

        从那时起,二维的贝塞尔样条曲线被认为是在计算机图形学中最有用的曲线之一(仅次于直线和椭圆)。在 PostScript 中,贝塞尔样条曲线用于所有的曲线(甚至椭圆线也由贝塞尔样条曲线来近似)。PostScript 字体的字符轮廓的定义也使用贝塞尔样条曲线定义。(TrueType 则使用另外一种相对简单快速的样条曲线公式。)

        一条二维贝塞尔样条曲线使用四个点定义:两个端点和两个控点。两个端点表示曲线的起点和终点。控点就好像“磁铁”一样把曲线从两个端点间的直线处吸弯。

        贝塞尔样条曲线在计算机辅助设计中非常有用,因为它又如下几个特性。首先,只要经过少量的练习,通常就可以自由操纵曲线,画出与预期形状非常接近的曲线。

        其次,贝塞尔样条曲线非常易于控制。对一些样条曲线公式而言,它们代表的曲线不经过任何一个定义该曲线的点。而贝塞尔样条曲线总是固定在两个端点之间(因为这是用于推导贝塞尔公式时所做的假设之一)。而且,一些形式的样条曲线公式有奇点,在这些点曲线趋于无穷远,这在计算机辅助设计中是不希望出现的。贝塞尔样条曲线则从来没有这种奇点;事实上,贝塞尔样条曲线总是位于一个由端点和控点连接而成的四边形(称为“凸包”)之内。

        然后,贝塞尔样条曲线的另外一个特征是端点和控点之间的关系。曲线总是和从起点到第一个控点绘制的直线相切,并保持同一方向。(这是通过 BEZIER 程序来在视觉上 表示的。)同时,也和从第二个控点到终点绘制的直线相切,并保持同一方向。这是用于推导贝塞尔公式的另外两个假设。

        最后,贝塞尔样条曲线通常是很有美感的,我知道这是一个主观的标准,但这并非只是我的个人意见。

        在 32 位的 Windows 版本出现之前,必须使用 Polyline 函数来建立贝塞尔样条曲线。同时还需要知道下面的贝塞尔样条曲线的参数方程。(x0, y0)是起点,(x3,y3)是重点,(x1,y1)和(x2,y2)是两个控点。t 值的范围是从 0 到 1,改变 t 的值可以获得不同的曲线:

        在 Windows 98 中,不需要知道这些公式。为了绘制一条或多条连接的贝塞尔样条曲线,只需要简单地调用:

[cpp] view plain copy
  1. PolyBezier(hdc, apt, iCount);  

[cpp] view plain copy
  1. PolyBezierTo (hdc, apt, iCount);  
在这两种情况下,参数 apt 都是一个 POINT 结构的数组。使用 PolyBezier 函数,前四个点(按照顺序)分别表示第一条贝塞尔样条曲线的起点、第一个控点、第二个控点和终点。随后的每一条贝塞尔样条曲线则只需要给出三个点,因为前一条贝塞尔样条曲线的终点就是后一条贝塞尔样条曲线的起点,如此类推。参数 iCount 等于你所绘制的这些首尾相接的曲线的条数的三倍加上 1。

        PolyBezierTo 函数把当前位置作为第一个起点,所以第一条以及后续的贝塞尔样条曲线都需要值给出三个点。当此函数返回时,当前位置被设置为曲线的终点。



提示:绘制一系列相连的贝塞尔样条曲线时,仅当第一条贝塞尔样条曲线的第二个控点、第一条贝塞尔样条曲线的终点(也就是第二条贝塞尔样条曲线的起点)与第二条贝塞尔样条曲线的第一个控点是线性关系时(即三点共线时),曲线在连接点处才是平滑的。

0 0
原创粉丝点击