c_bezier曲线类的构造

上传人:w****i 文档编号:106171081 上传时间:2019-10-14 格式:PDF 页数:6 大小:1.06MB
返回 下载 相关 举报
c_bezier曲线类的构造_第1页
第1页 / 共6页
c_bezier曲线类的构造_第2页
第2页 / 共6页
c_bezier曲线类的构造_第3页
第3页 / 共6页
c_bezier曲线类的构造_第4页
第4页 / 共6页
c_bezier曲线类的构造_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《c_bezier曲线类的构造》由会员分享,可在线阅读,更多相关《c_bezier曲线类的构造(6页珍藏版)》请在金锄头文库上搜索。

1、C+ + Bezier 曲线类的构造 ? 陈国华 ( 广东民族学院计算机科学系, 广州 510633) 摘? 要: 该文利用 C+ + 面向对象的新特征, 对 Bezier 曲线的定义和生成过程进行封装, 从 而极大地简化了 Bezier 曲线的定义和绘制过程. 关键词: 面向对象, 类, 模板, Bezier 曲线 中图法分类号: TP302. 4 Bezier 曲线作为一种特殊的参数多项式曲线, 一经问世, 就曾受到 CAGD学术界的广泛重 视. 尽管如今在 CAD 领域有许多种不同的自由型曲线和曲面的构造方法, 但使用 Bezier 曲线 仍不失为一种重要的备选方案. 例如国内外多种矢量

2、字库的构建, 仍然广泛使用 Bezier 曲线技 术. Bezier 曲线的实现方法传统上主要求助于 de Casteljau 算法. 但随着计算机硬件技术的不 断进步, 计算机的处理速度越来越快, 算法的高效尽管仍很重要, 但代码的易于维护性和可重 用性即显得日见重要. 本文利用 C+ + 面向对象的特性, 将 Bezier 曲线的定义和生成建立在矩 阵运算类的基础上, 从而使描述和生成 Bezier 曲线的代码变得简单明了, 且有着很好的可扩展 性. 1 ? Bezier 曲线的矩阵表示 记 B n= Bn 0( t) ? Bnn( t) , 其中 B n i( t )= Cint i(1

3、- t)n- i, t ? 0, 1 . Tn= 1 t ? t n , Vn= b0 b1 ? bn (1 , ? Mn= m00m01?m0n m10m11?m1n ? mn 0mn1?mnn 其中 mij= (- 1) ij *Cin*Cji, 且当 j i 时, mij= 0, 则以 b0, b1, ?, bn为控制顶点的 Bezier 曲线 可以表为 P( t)= Tn*Mn*Vn. 2 ? 几个通用模板的定义 为了能够方便地使用计算机来处理上述简便的 Bezier 矩阵表达式, 从而大大简化计算机 图形软件的开发, 显然我们首先必须能够方便地使用计算机来处理矩阵和向量等对象, 为此

4、目 的我们利用 C+ + 中的最新特征引入了如下向量模板和矩阵模板的概念. 第 21 卷? 第 2 期? ? ? ? ? ? ? ? 江西师范大学学报(自然科学版) ? ? ? ? ? ? ? ? Vol. 21 No. 2 1997 年 5 月? ? ? ? ? ? JOURNAL OF JIANGXI NORMAL UNIVERSITY? ? ? ? ? May 1997 ?收稿日期: 1997- 01- 20 2. 1? 向量模板的定义 template ?class T? class VectorTemplate private: ? ? int numElements; ? ? T

5、* elements; protected: public: VectorTemplate( void) ; VectorTemlate( int) ; VectorTemplate( VectorTemplate?T? ?VectorTemplate( void) ; T ; int size( void) return numElements; ; void resize ( int sizeIn) ; VectorTemplate? T? VectorTemplate? T? float length( void) ; VectorTemplate? T? friend T operat

6、or *( VectorTemplate? T? friend VectorTemplate ?T ? operator + ( VectorTemplate?T ? friend VectorTemplate?T? operator?( VectorT emplate?T? friend VectorTemplate?T? operator *( VectorTemplate?T? friend VectorTemplate?T? operator *( T scalar, VectorTemplate?T? VectorTemplate? T? VectorTemplate? T? Vec

7、torTemplate? T? VectorTemplae?T? cross( VectorT emplate?T? 在向量模板的定义中, 通过运算符的重载, 使我们能像对待普通的数学运算一样来引述两 个向量或向量与标量之间的四则运算. 例如: 对于两个向量 V1、 V2的内积, 只须简单地表示为 V1* V2, 而对于一个标量 s 与向量 V1的乘积亦只须记着 s* V1, 而丝毫不会引起混淆. 2. 2? 矩阵模板的定义 template ?class T? class MatrixTemplate private: int numRows; int numColumns; 128? ?

8、? ? ? ? ? ? ? ? ? ? ? ? ? 江西师范大学学报( 自然科学版) ? ? ? ? ? ? ? ? ? ? ? ? ? 1997 年 VectorTemplate? T? * elements; Void create( int, int) ; protected: public: ? ? MatrixTemplate( void) ? ? numRows= 0; ? ? numColumns= 0; ? ? elements= NULL; ; MatrixTemplate( int size) create( size, size) ; ; MatrixTemplate(

9、int, int) ; MatrixTemplate( MatrixTemplate?T? ?MatrixT emplate( void) ; VectorTemplate? T? ; int nrows( void) return numRows; ; int ncols( void) return numColumns; ; void resize( int new?ncols, int new?nrows) ; friend MatrixT emplate?T? operator *( MatrixTemplate?T? friend VectorTemplate?T? operator

10、 *( MatrixTemplate? T? MatrixTemplate? T? return * this; ; MatrixTemplate? T? float determinant ( void) ; MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? MatrixTemplate? T? ; ;

11、typedef MatrixTemplate?float? Matrix; 在矩阵模板中, 我们不但定义了各种常用的运算, 而且还封装了平移、 缩放、 旋转等成员函 数, 这一切都是为了使图象的生成和处理变得更简便些. 但仅有这两个类当然还不够. 我们的 目的是要生成 Bezier 曲线, 然而我们知道, 在计算机表示中曲线是由折线来逼近的, 而折线又 是由线段组成的. 此外, 两点决定一条线段. 因此, 为了一般的表示一条 Bezier 曲线, 我们需要 先对点、 线段和折线有一个统一的描述, 同时, 这也是为了符合 GKS?3D 图形标准. 129第 2 期? ? ? ? ? ? ? ?

12、? ? ? ? 陈国华? C+ +Bezier 曲线类的构造? ? ? ? ? ? ? ? ? ? ? ? ? ? 点的功能无非是用来确定空间的一个坐标, 所以我们不难从向量类中来派生一个点类, 如: ( 1) 点类 Class SplinePoint: public Vector ? public ? ? ? void setCoord( Vector ? void getCoord( Vector ? ? 有了点类之定义, 我们可以把折线看成是由一系列顶点控制确定的, 但为了使这一系列顶 点的排列有一定的顺序, 并且便于索引访问, 我们又不得不增加一个简单的线性表类来对之加 以管理. (

13、2) 简单表类 template ?class T? class SimpleTable ? ?private: ? ? int curSize; ? ? T * *items; ? ? public: ? ? ? ? T ? ? ( 3) 折线类 class SplinePolyline ? ?protected: SimpleT able?SplinePoint? points; public: SplinePolyline( void) ; SplinePolyline( int np) ; SplinePoint void draw( ) ; 3 ? Bezier 曲线类的构造 如上所

14、述, 计算机所表示的曲线实际上只是一条折线, Bezier 曲线也不例外, 只不过根据 用户的精度要求不同增加插值点的个数有所不同而已. 据此, 我们不难从折线类来派生我们所 130? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 江西师范大学学报( 自然科学版) ? ? ? ? ? ? ? ? ? ? ? ? ? 1997 年 要求的 Bezier 曲线类. class BezCurve: public SplinePolyline private: ? ? int smooth; public: ? ? BezCurve( void) ? ; ? ? BezCurve( int

15、numPointIn) : SplinePolyline( numPointIn+ 1) ? ? ? ? smooth= 5; ? ? void setsmooth( int sIn) smooth= sIn; ? ? int getsmooth( void) return smooth; ? ? void draw( void) ; ? ? void draw( class SplinePerspective 在上述构造中, 我们缺省地取光滑度 smooth= 5, 即在每两个顶点之间加 5 个插值点, 其 中令人感兴趣的当然是 draw( ) 例程, 缺省情况下按 2 维的要求来绘制 Be

16、zier 曲线, 如果给出 适当的透视参数( 由 class Spline Perspective 定义) , 则可按透视要求来绘制 Bezier 曲线. 4 ? 应用 在以往的基于 C 或 Pascal 等语言的 Bezier 曲线的生成过程中, 往往是一面定义一条 Bezi? er 曲线, 然后调用一外部过程来绘制它, 因此涉及复杂的参数传递等问题, 而在此处, 每一条 Bezier 曲线都被定义为知道如何绘制自己了. 因此, 要定义一条 Bezier 曲线并实际地画出它, 只须简单地遵循以下几步即可. 第一步: 定义一条 Bezier 曲线 ? ? ? BezCurve bezcurve( n) ; 如果欲使该曲线更光滑, 则可进一步设置其光滑度 ? ? ? bezcurve. setsmooth( sIn) ; 第二步: 设定 n 个顶点的坐标 ? ? ? bezcurve. setCoord

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号