双三次Bezier曲面
- 格式:doc
- 大小:125.00 KB
- 文档页数:7
双三次Bezier曲面法向量计算在计算机图形学中,双三次Bezier曲面是一种常用的曲面表示方法,它可以通过控制点来描述复杂的曲面形状。
在实际应用中,我们经常需要计算Bezier曲面上各点的法向量,以便进行光照、渲染和其他图形处理操作。
本文将从基础概念开始,逐步深入地探讨双三次Bezier曲面法向量的计算方法。
1. 什么是双三次Bezier曲面先来了解一下什么是双三次Bezier曲面。
双三次Bezier曲面是由两个方向上分别为双三次Bezier曲线的曲面组成。
它由16个控制点所确定,其中4x4个点可以用来描述曲面形状,而每个控制点可以在3D空间中确定。
在三维空间中,双三次Bezier曲面可以被表示为B(u, v)=ΣΣPijBi(u)Bj(v),其中Pij为控制点,Bi(u)和Bj(v)为Bezier基函数。
2. 双三次Bezier曲面法向量的计算接下来,我们将讨论如何计算双三次Bezier曲面上各点的法向量。
对于双三次Bezier曲面上的某一点,我们可以通过偏导数来计算其法向量。
具体而言,我们可以使用以下公式来计算双三次Bezier曲面上某一点的法向量:N(u, v)=Bv(u, v)×Bu(u, v)。
3. 法向量的应用法向量在图形学中有着广泛的应用。
比如在渲染中,法向量可以帮助我们计算光照效果,使得曲面看起来更加真实。
另外,在非真实感渲染中,法向量也可以用来渲染卡通风格的图像。
法向量还可以用于碰撞检测、物体拾取等应用领域。
4. 个人观点和理解对于双三次Bezier曲面法向量的计算,我个人认为这是计算机图形学中非常重要的一个知识点。
理解并掌握了曲面法向量的计算方法,可以帮助我们更好地处理曲面的光照效果、渲染和交互操作。
深入理解法向量的应用也可以为我们在图形学领域的研究和开发提供更多的可能性。
总结通过本文的讨论,我们了解了双三次Bezier曲面的基本概念,以及如何计算曲面上各点的法向量。
实验六 双三次Bezier 曲面一、实验目的根据Bizer 曲面的基础知识和数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲面数学模型的理解。
二、实验任务(2学时)Bezier 曲面算法及其程序设计。
三、实验内容和实验步骤1、算法描述Bezier 曲面是由Bezier 曲线拓广而来,以两组正交的Bezier 曲线控制点构造空间网格来生成曲面。
m×n 次张量积形式的 Bezier 曲面的定义如下(参照教材P200式7-20):(u ,v )∈〔0,1〕×〔0,1〕双三次Bezier 曲面定义如下(参照教材P201式7-21): (u ,v )∈〔0,1〕×〔0,1〕展开上式,有代入得到:)()(),(m 0i ,,0,∑∑===v B u B P v u p n j m i n j j i 33,,3,3i 00(,)()() i j i j j p u v P B u B v ===∑∑0,30,00,10,20,31,31,01,11,21,30,31,32,33,32,02,12,22,32,33,03,13,23,33,3()()(,)()()()()()()B v P P P P B v P P P P p u v B u B u B u B u P P P P B v P P P P B v ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤=⋅⋅⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦320,3321,3322,333,3()331()363()33()B u u u u B u u u u B u u u B u u ⎧=-+-+⎪=-+⎪⎨=-+⎪⎪=⎩320,3321,3322,333,3()331()363()33()B v v v v B v v v v B v v vB v v ⎧=-+-+⎪=-+⎪⎨=-+⎪⎪=⎩0,00,10,20,31,01,11,21,3322,02,12,22,313313630(,)13300P P P P P P P P p u v u u u P P P P --⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎡⎤=⋅⋅⎣⎦⎢⎥⎢⎥-⎢⎥⎢⎥32133136303300v v v ⎡⎤--⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⋅⎢⎥⎢⎥-⎢⎥⎢⎥令则有: 生成曲面时可以通过先固定u, 变化v 得到一簇Bezier 曲线;然后固定v ,变化u 得到另一簇Bezier 曲线,两簇曲线交织生成Bezier 曲面。
《计算机图形学》练习测试题库一.选择题1.实验表明,镜面反射系数W(θ)与物体类型和角度有关。
当角度θ在30到60度时,金、银玻璃三种物体的W(θ)值从小到大依次为( B )。
A 银、金、玻璃B 玻璃、银、金C 金、玻璃、银D 玻璃、金、银2.灰度等级为16级,分辨率为1024*1024的显示器,至少需要的帧缓存容量为( A )A 512KB;B 1MBC 2MB;D 3MB3.在面片的数量非常大的情况下哪一个消隐算法速度最快? ( C )A 深度缓存算法(Z-Buffer)B 扫描线消隐算法C 深度排序算法(画家算法)D 不知道4.双三次Bezier曲面的4条边界都是三次Bezier曲线,其特征网格有( C )个顶点。
A 9;B 12;C 16;D 205.下列有关平面几何投影的叙述,错误的是( C )A 透视投影又可分为一点透视、二点透视、三点透视;B 斜投影又可分为斜等测、斜二测;C 正轴测又可分为正一测、正二测、正三测;D 正视图又可分为主视图、侧视图、俯视图。
6.下面关于深度缓存消隐算法(Z-Buffer)的论断哪一条不正确? ( B )A 深度缓存算法并不需要开辟一个与图像大小相等的深度缓存数组B 深度缓存算法不能用于处理对透明物体的消隐C 深度缓存算法能并行实现D 深度缓存算法中没有对多边形进行排序7.用转角法判别点在区域的内外。
将疑点M与边界上一点P连接,当P沿边界移动一周时,M点处于区域外的是( A )A MP与给定的某条直线夹角变化值为0;B MP与给定的某条直线夹角变化值为2π;C MP与给定的某条直线夹角变化值为π;D MP与给定的某条直线夹角变化值为3π8. 在下列叙述语句中,不正确的论述为( C )A 在图形文件系统中,点、线、圆等图形元素通常都用其几何特征参数来描述;B 在图形系统中,图形处理运算的精度不取决于显示器的分辨率;C 在光栅扫描图形显示器中,所有图形都按矢量直接描绘显示,不存在任何处理;D 在彩色图形显示器中,使用RGB颜色模型。
课程名称:《计算机图形学》论文题目:双三次Bezier曲面的绘制教学部:年级:班级:学号:姓名:摘 要:本文主要讨论了在VC++中使用OpenGL 绘制Bezier 、NURBS 等典型曲面的一般性方法和OpenGL 的特点及功能,OpenGL 可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性 。
关键词:Bezier 曲面;OpenGL ;曲面绘制一、设计概述1.设计要求1)掌握双三次Bezier 曲面定义:Bezier 曲面与 Bezier 曲线有相同的性质,Bezier 曲面片是由特征多面体的顶点决定的,利用两组正交的 Bezier 曲线逼近由控制点网格描述的曲面。
给定(n+1)*(m+1)个点Pjk (i=0,1…n ;j=0,1,...m ),则可以生成一个n*m 次的Bezier 曲面片,其表示形式为其中Pij 是Bezier 曲面片的特征多面体。
当m=n=3时,特征多面体有16个顶点,其相应的Bezier 曲面片称为双三次Bezier 曲面片。
2)实现矩阵相关运算;双三次Bezier 曲面片的矩阵表示为其中2.设计方案∑∑===m i n j n j m i j i Q v B u B p v u 00,,,)()(),([0,1]v)(u,∈T T bb Q V GM UM v u =),(⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----=0001003303631331b M ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=44434241343332312423222114131211P P P P P P P P P P P P P P P P G []123u u u U =[]123v v v V =1)给定16个三维控制点如下:P00(200,20,0),P01(150,0,100),P02(50,-130,100),P03(0,-250,50);P10(150,100,100),P11(100,30,100),P12(50,-40,100),P13(0,-110,100);P20(140,280,90),P21(80,110,120),P22(30,30,130),P23(-50,-100,150);P30(150,350,30),P31(50,200,150),P32(0,50,200),P33(-70,0,100);2)实现键盘控制曲面旋转效果二、环境需求分析开发环境:Windows XP开发工具:Microsoft Visual Studio 2005运行环境:本系统是基于OpenGL软件接口和VC++应用程序开发的一套管理系统,本系统可以在装有Windows 98 /2000/XP/NT的操作系统下运行。
双三次b样条曲面与费格森曲面和双三次贝齐尔曲面的等价关系式双三次B样条曲面(Bi-Cubic B-Spline Surface)是一类基于多项式插值的曲面表示方法。
在计算机图形学、计算机辅助设计、机器视觉等领域中广泛应用。
而费格森曲面(Ferguson Surface)和双三次贝齐尔曲面(Bi-Cubic Bezier Surface)也是常见的曲面生成方法。
本文将介绍这三种曲面生成方法的等价关系式。
首先我们来介绍双三次B样条曲面。
B样条曲面是一种通过控制顶点来控制曲面形状的方法。
B样条曲面利用局部控制的特点,可以被看作是一种分段多项式曲面,因此具有一定的灵活性。
双三次B样条曲面是一种常用的B样条曲面表示方法,其控制点的方程用二阶分段多项式表示。
费格森曲面是另一种曲面表示方法,它采用二次多项式的形式表示曲面。
它的控制顶点包括四个点:一个内部点和三个连接该内部点的边界点。
费格森曲面对于局部变形和替换,具有一定的优势。
双三次贝齐尔曲面也是一种常用的曲面表示方法,其控制点方程用三次多项式表示。
通过控制顶点的变换,可以轻松地调整曲面的形状和平滑度。
关于这三种曲面表示方法的等价关系式,在很长一段时间内一直是一个研究热点。
事实上,它们之间有一定程度上的等价性。
具体而言,费格森曲面和双三次贝齐尔曲面都可以看作是双三次B样条曲面的一种特殊情况。
以费格森曲面为例,我们可以将其表示成如下形式:S(u,v) = [(1-u)^3P0 + 3u(1-u)^2P1 + 3u^2(1-u)P2 +u^3P3]× (1-v)^2+ [(1-u)^3Q0 + 3u(1-u)^2Q1 + 3u^2(1-u)Q2 + u^3Q3] × v^2+ 3[(1-u)^2P0 + 2u(1-u)P1 + u^2P2] × (1-v)^2v+ 3[(1-u)^2Q0 + 2u(1-u)Q1 + u^2Q2] × v^2(1-v)其中,P0、P1、P2、P3和Q0、Q1、Q2、Q3为角点坐标。
第十一章 Bézier 曲面在第十章,我们利用直积(张量积)的方法,把参数三次曲线扩展成参数双三次曲面。
本章仍然运用这一思想,将Bézier 曲线拓广成Bézier 曲面。
11.1 Bézier 曲面的定义及性质给定三维空间)1()1(+⨯+n m 个点n j m i j i ,,1,0;,,1,0,, b ==,n m ⨯次参数曲面:1,0,)()(),(00,≤≤=∑∑==v u v B u B v u mi nj n j m i j i b P (11.1.1)称为n m ⨯次Bézier 曲面,式中)(),(v B u B n j m i 分别是m 次Bernstein 基函数和n 次Bernstein 基函数。
j i ,b 称为曲面片的控制顶点或Bézier 点,逐次用线段连接点列j i ,b 中相邻两点组成的空间网格叫做曲面片的控制网格或Bézier 网格。
Bézier 曲面是通过用张量积方法将一元Bernstein 基推广为二元Bernstein 基,来实现由Bézier 曲线向Bézier 曲面的推广。
因此,Bézier 曲线的许多性质在Bézier 曲面场合下同样成立,具体有以下几条:1. 仿射不变性;2. 凸包性;3. 边界性质。
Bézier 曲面的四条边界曲线),1(),,0(),1,(),0,(v v u u P P P P 分别是m 次和n 次Bézier 曲线,且四个控制角点n m n m ,,00,0,0,,,b b b b 位于曲面之上;4. 等参数线。
固定u u =,那么曲线 P ),(v u 是一条n 次Bézier 曲线,其控制顶点为n j u B mi mi j i v j ,,1,0,)(0,b b ==∑= 同理,固定v v =,其参数曲线),(v u P 为一条m 次Bézier 曲线,相应的控制顶点为m i v B nj n j j i u i,,1,0,)(0,b b ==∑= 然而变差缩减性对Bézier 曲面将不再成立。
Bezier曲线原理及实现代码(c++)一、原理:贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。
贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau 算法开发,以稳定数值的方法求出贝塞尔曲线。
线性贝塞尔曲线给定点P0、P1,线性贝塞尔曲线只是一条两点之间的直线。
这条线由下式给出:且其等同于线性插值。
二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t) 追踪:。
TrueType字型就运用了以贝塞尔样条组成的二次贝塞尔曲线。
P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝塞尔曲线。
曲线起始于P0走向P1,并从P2的方向来到P3。
一般不会经过P1或P2;这两个点只是在那里提供方向资讯。
P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。
曲线的参数形式为:。
现代的成象系统,如PostScript、Asymptote和Metafont,运用了以贝塞尔样条组成的三次贝塞尔曲线,用来描绘曲线轮廓。
一般化P0、P1、…、P n,其贝塞尔曲线即。
例如:。
如上公式可如下递归表达:用表示由点P0、P1、…、P n所决定的贝塞尔曲线。
则用平常话来说,阶贝塞尔曲线之间的插值。
一些关于参数曲线的术语,有即多项式又称作n阶的伯恩斯坦基底多项式,定义00 = 1。
点P i称作贝塞尔曲线的控制点。
多边形以带有线的贝塞尔点连接而成,起始于P0并以P n终止,称作贝塞尔多边形(或控制多边形)。
贝塞尔多边形的凸包(convex hull)包含有贝塞尔曲线。
线性贝塞尔曲线函数中的 t 会经过由 P 0 至P 1 的 B(t ) 所描述的曲线。
例如当 t=0.25 时,B(t ) 即一条由点 P 0 至 P 1 路径的四分之一处。
就像由 0 至 1 的连续 t ,B(t ) 描述一条由 P 0 至 P 1 的直线。
双三次Bézier曲面片光滑拼接条件的一个推导
白鸿武
【期刊名称】《咸阳师范学院学报》
【年(卷),期】2004(19)6
【摘要】对双三次Bézier曲面片的光滑拼接条件给出了新的推导.
【总页数】2页(P6-7)
【作者】白鸿武
【作者单位】咸阳师范学院数学系,陕西,咸阳,712000
【正文语种】中文
【中图分类】TP391
【相关文献】
1.有理Bézier曲面片的光滑拼接条件 [J], 康宝生
2.双三次Bézier曲面片光滑拼接的实现 [J], 邱曹勇;贾红丽;汤正诠;张娟
3.5×5片双三次Bézier曲面片的一类C2光滑拼接方案 [J], 陈炼;汤正诠;贾红丽
4.双三次Bézier曲面片的光滑拼接 [J], 贾红丽;汤正诠
5.高次Bézier曲面片GC^2光滑拼接的一般条件 [J], 周西军;杨海成;杨彭基因版权原因,仅展示原文概要,查看原文内容请购买。
中国地质大学(北京)
《计算机图形学(新)》在线作业二
参考答案
地大《计算机图形学(新)》在线作业二
1. 在多边形的Sutherland-Hodgman逐边裁剪算法中,对于某多边形的边(方向为从端点S 到端点P)与某裁剪线(窗口的某一边)的比较结果共有以下四种情况,分别输出一些顶点。
在哪种情况下输出的顶点是错误的( )。
【选项】:
A S和P均在可见一侧,则输出S、P
B S和P均在不可见一侧,则输出0个顶点
C S在可见一侧,P在不可见一侧,则输出线段SP与裁剪线的交点
D S在不可见一侧,P在可见一侧,则输出线段SP与裁剪线的交点和P
【答案】:A
2. 用一个n位的整数表示一个位串,用它控制线型时,可以n个像素为周期进行重复显示.若Patten=11100101, 而i表示画线程序中的第i个像素,则画线程序中的
SETPIXEL(X,Y,COLOR)可改写为( )
【选项】:
A if(pattern[i%4])setixel(x,y,color)
B if(pattern[i%6])setixel(x,y,color)
C if(pattern[i%8])setixel(x,y,color)
D if(pattern[i%12])setixel(x,y,color);。
bezier曲面方程
贝塞尔曲面方程可以使用多项式来表示。
给定 n+1 个控制点P00,P01,..., P0n,P10,P11,..., P1n,..., Pn0,Pn1,..., Pnn,贝塞尔曲面方程可以表示为:
B(u, v) = ∑(i=0 to n) ∑(j=0 to n) Bn,i(u)Bn,j(v)Pi,j
其中,Bn,i(u)表示 u 方向上的贝塞尔基函数,Bn,j(v)表示 v 方向上的贝塞尔基函数。
这些贝塞尔基函数可以使用递归的方法计算。
对于二次贝塞尔曲面,基函数如下:
B2,0(t) = (1 - t)^2
B2,1(t) = 2t(1 - t)
B2,2(t) = t^2
对于三次贝塞尔曲面,基函数如下:
B3,0(t) = (1 - t)^3
B3,1(t) = 3t(1 - t)^2
B3,2(t) = 3t^2(1 - t)
B3,3(t) = t^3
在这些基函数中,t 可以是 u 或 v。
对于更高次的贝塞尔曲面,基函数的计算方法类似。
通过将基函数和控制点的权重相乘,然后求和,可以得到给定参数 u 和v 的曲面点的坐标。
双三次参数曲面
双三次参数曲面是三维空间中的一个重要数学概念,它描述了一个具有高度平滑性的曲面。
双三次参数曲面在计算机图形学和计算机辅助设计等领域有着广泛的应用。
双三次参数曲面的定义是通过一组参数函数来表示。
通常情况下,我们使用两个参数函数u(t,v)和v(t,v)来描述曲面上的每个点。
这两个参数函数分别控制了曲面的形状和变化。
通过调整参数函数的值,我们可以得到各种不同形状的曲面。
双三次参数曲面的平滑性是其最大的特点之一。
它可以通过控制点来定义,这些控制点可以在曲面上自由移动。
通过调整控制点的位置,我们可以改变曲面的形状,并使其具有高度的平滑性。
这一特性使得双三次参数曲面在计算机图形学中被广泛应用于曲面建模和渲染。
在计算机辅助设计中,双三次参数曲面也被广泛应用于三维建模。
通过使用双三次参数曲面,设计师可以更加灵活地创建各种复杂的
曲面形状,如汽车外壳、家具设计等。
双三次参数曲面可以通过简单的控制点调整来实现形状的变化,使得设计师可以更加直观地进行设计和修改。
除了在计算机图形学和计算机辅助设计中的应用,双三次参数曲面还有一些其他的应用领域。
在工程领域中,它可以用于模拟物体表面的形状和变化。
在医学领域中,它可以用于建立人体器官的三维模型,以便进行手术模拟和虚拟手术等。
总之,双三次参数曲面是一种非常有用的数学工具,在计算机图形学、计算机辅助设计和其他领域有着广泛的应用。
它通过一组参数函数来描述曲面的形状和变化,并具有高度的平滑性。
通过调整参数函数和控制点,我们可以灵活地创建各种复杂的曲面形状,为我们的工作和生活带来便利。
实验六 双三次Bezier 曲面一、实验目的根据Bizer 曲面的基础知识和数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲面数学模型的理解。
二、实验任务(2学时)Bezier 曲面算法及其程序设计。
三、实验内容和实验步骤1、算法描述Bezier 曲面是由Bezier 曲线拓广而来,以两组正交的Bezier 曲线控制点构造空间网格来生成曲面。
m×n 次张量积形式的 Bezier 曲面的定义如下(参照教材P200式7-20): (u ,v )∈〔0,1〕×〔0,1〕双三次Bezier 曲面定义如下(参照教材P201式7-21):(u ,v )∈〔0,1〕×〔0,1〕展开上式,有代入得到: )()(),(m 0i ,,0,∑∑===v B u B P v u p n j m i nj j i 33,,3,3i 00(,)()() i j i j j p u v P B u B v ===∑∑0,30,00,10,20,31,31,01,11,21,30,31,32,33,32,02,12,22,32,33,03,13,23,33,3()()(,)()()()()()()B v P P P P B v P P P P p u v B u B u B u B u P P P P B v P P P P B v ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤=⋅⋅⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦320,3321,3322,333,3()331()363()33()B u u u u B u u u u B u u u B u u ⎧=-+-+⎪=-+⎪⎨=-+⎪⎪=⎩320,3321,3322,333,3()331()363()33()B v v v v B v v v v B v v vB v v ⎧=-+-+⎪=-+⎪⎨=-+⎪⎪=⎩0,00,10,20,31,01,11,21,3322,02,12,22,33,03,13,23,313313630(,)133001000P P P P P P P P p u v u u u P P P P P P P P --⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎡⎤=⋅⋅⎣⎦⎢⎥⎢⎥-⎢⎥⎢⎥⎣⎦⎣⎦3213313630330010001v v v ⎡⎤--⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⋅⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦令则有: 生成曲面时可以通过先固定u, 变化v 得到一簇Bezier 曲线;然后固定v ,变化u 得到另一簇Bezier 曲线,两簇曲线交织生成Bezier 曲面。
2、要求:根据给定的16个控制顶点:P00(200,20,0),P01(150,0,100),P02(50,-130,100),P03(0,-250,50);P10(150,100,100),P11(100,30,100),P12(50,-40,100),P13(0,-110,100);P20(140,280,90),P21(80,110,120),P22(30,30,130),P23(-50,-100,150);P30(150,350,30),P31(50,200,150),P32(0,50,200),P33(-70,0,100);使用斜等测投影绘制双三次Bizer 网格曲面。
3、程序实现步骤:(工程名:BezierCurve2)步骤1:创建“BezierCurve2”工程文件;步骤2:创建类class :“ P2”及“P3”;注意:P2 为二维点,含有两个成员变量“x ,y”,P3含有三个成员变量“x ,y ,z”。
单击右键-→“new class”-→选择类型“Generic Class”名称为“ P2”及“P3”,添加成员变量(添加至“class EACH_ENTRY { public:”之内):class P2{public:P2();virtual ~P2(); double x;double y;};class P3{public:P3();virtual ~P3();321U u u u ⎡⎤=⎣⎦321V v v v ⎡⎤=⎣⎦1331363033001000be M --⎡⎤⎢⎥-⎢⎥=⎢⎥-⎢⎥⎣⎦0,00,10,20,31,01,11,21,32,02,12,22,33,03,13,23,3P P P P P P P P P P P P P P P P P ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦(,)T T be be p u v UM PM V=double x;double y;double z;};步骤3:包含头文件并定义顶点对象。
1)在“class CBezierCurve2View : public Cview……”之前添加代码“#include "P3.h"”及“#include "P2.h"”;#include "P3.h"//包含三维坐标点类#include "P2.h"//包含二维坐标点类2)在“class CBezierCurve2View : public CView……”内添加代码:P3 P3[4][4];//三维顶点P2 P2[4][4];//二维顶点步骤4:添加成员函数。
1)C m n的函数实现,定义成员函数,命名为Multiply_n。
方法及过程参照“实验六曲线及曲面生成算法(一)”;2)伯恩斯坦多项式B m,n(t)的函数实现,添加CBezierCurve2View::bernstein。
方法及过程参照“实验六曲线及曲面生成算法(一)”;步骤5:在OnDraw()中添加代码:注意:添加头文件#include "math.h"//数学头文件#define Round(d) int(floor(d+0.5))//四舍五入宏定义上述两行代码添加至:类CBezierCurve2View的所有成员函数代码之前。
1)窗口坐标变换,设置客户区中心为原点CBezierCurve2Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义客户区矩形GetClientRect(&rect);//获得客户区的大小pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y 轴垂直向上pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);2)初始化16个控制顶点P3[0][0].x=20; P3[0][0].y=0; P3[0][0].z=200;//P00P3[0][1].x=0; P3[0][1].y=100;P3[0][1].z=150;//P01P3[0][2].x=-130;P3[0][2].y=100;P3[0][2].z=50; //P02P3[0][3].x=-250;P3[0][3].y=50; P3[0][3].z=0; //P03P3[1][0].x=100; P3[1][0].y=100;P3[1][0].z=150;//P10P3[1][1].x=30; P3[1][1].y=100;P3[1][1].z=100;//p11P3[1][2].x=-40; P3[1][2].y=100;P3[1][2].z=50; //p12P3[1][3].x=-110;P3[1][3].y=100;P3[1][3].z=0; //p13P3[2][0].x=280; P3[2][0].y=90; P3[2][0].z=140;//P20P3[2][1].x=110; P3[2][1].y=120;P3[2][1].z=80; //P21P3[2][2].x=30; P3[2][2].y=130;P3[2][2].z=30; //P22P3[2][3].x=-100;P3[2][3].y=150;P3[2][3].z=-50;//P23P3[3][0].x=350; P3[3][0].y=30; P3[3][0].z=150;//P30P3[3][1].x=200; P3[3][1].y=150;P3[3][1].z=50; //P31P3[3][2].x=50; P3[3][2].y=200;P3[3][2].z=0; //P32P3[3][3].x=0; P3[3][3].y=100;P3[3][3].z=-70;//P333) 三维控制顶点投影(采用斜等测法)至二维点:for(int i=0;i<4;i++)for(int j=0;j<4;j++){P2[i][j].x=P3[i][j].x-P3[i][j].z/sqrt(2);P2[i][j].y=P3[i][j].y-P3[i][j].z/sqrt(2);}// 以上代码实现:从三维到二维的斜等测投影(参照教材P173:式6-42)4)绘制控制多边形CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,0));pOldPen=pDC->SelectObject(&NewPen);for(int i1=0;i1<4;i1++){pDC->MoveTo(Round(P2[i1][0].x),Round(P2[i1][0].y));for(int j1=1;j1<4;j1++)pDC->LineTo(Round(P2[i1][j1].x),Round(P2[i1][j1].y));}for(int j2=0;j2<4;j2++){pDC->MoveTo(Round(P2[0][j2].x),Round(P2[0][j2].y));for(int i2=1;i2<4;i2++)pDC->LineTo(Round(P2[i2][j2].x),Round(P2[i2][j2].y));}pDC->SelectObject(pOldPen);NewPen.DeleteObject();// 以上代码绘制控制多边形5)控制顶点标注序号CString str;pDC->SetTextColor(RGB(0,0,255));for(int i3=0;i3<4;i3++){for(int j3=0;j3<4;j3++){str.Format("P%d,%d",i3,j3);pDC->TextOut(Round(P2[i3][j3].x+10),Round(P2[i3][j3].y+2),str);}}// 以上代码实现“控制顶点标注序号”6)“曲面”生成CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔pDC->SelectObject(&PenRed);//选择红色笔绘制曲面double dt1=0.01,dt2=0.01;double x,y,u,v;double BU03,BU13,BU23,BU33;double BV03,BV13,BV23,BV33;//U,V两个方向,三次曲面,共8个基函数for(u=0;u<=1;u=u+dt1)for(v=0;v<=1;v=v+dt2)//对每一个u,v从0~1循环1/dt2+1次后,//生成一条由1/dt2+1个点用直线串起来的“曲线”//u从0~1循环1/dt2+1次后,生成1/dt1+1条“曲线”{BU03 = bernstein(0,3,u);//计算B0,3(u)BV03 = bernstein(0,3,v);//计算B0,3(v)BU13 = bernstein(1,3,u);//计算B1,3(u)BV13 = bernstein(1,3,v);//计算B1,3(v)BU23 = bernstein(2,3,u);//计算B2,3(u)BV23 = bernstein(2,3,v);//计算B2,3(v)BU33 = bernstein(3,3,u);//计算B3,3(u)BV33 = bernstein(3,3,v);//计算B3,3(v)//严格按照教材P201页,式7-21,为了简单起见,没有使用复杂的循环x=(BU03*P2[0][0].x+BU13*P2[1][0].x+BU23*P2[2][0].x+BU33*P2[3][0].x)*BV03+ (BU03*P2[0][1].x+BU13*P2[1][1].x+BU23*P2[2][1].x+BU33*P2[3][1].x)*BV13+ (BU03*P2[0][2].x+BU13*P2[1][2].x+BU23*P2[2][2].x+BU33*P2[3][2].x)*BV23+ (BU03*P2[0][3].x+BU13*P2[1][3].x+BU23*P2[2][3].x+BU33*P2[3][3].x)*BV33;y=(BU03*P2[0][0].y+BU13*P2[1][0].y+BU23*P2[2][0].y+BU33*P2[3][0].y)*BV03+ (BU03*P2[0][1].x+BU13*P2[1][1].y+BU23*P2[2][1].y+BU33*P2[3][1].y)*BV13+ (BU03*P2[0][2].y+BU13*P2[1][2].y+BU23*P2[2][2].y+BU33*P2[3][2].y)*BV23+ (BU03*P2[0][3].y+BU13*P2[1][3].y+BU23*P2[2][3].y+BU33*P2[3][3].y)*BV33;if(v==0)pDC->MoveTo(Round(x),Round(y));elsepDC->LineTo(Round(x),Round(y));}//以上双重循环程序u=0、u=dt、u=2dt……u=1的共1/dt+1条“纵向”曲线段for(v=0;v<=1;v=v+dt2)for(u=0;u<=1;u=u+dt1){BU03 = bernstein(0,3,u);BV03 = bernstein(0,3,v);BU13 = bernstein(1,3,u);BV13 = bernstein(1,3,v);BU23 = bernstein(2,3,u);BV23 = bernstein(2,3,v);BU33 = bernstein(3,3,u);BV33 = bernstein(3,3,v);x=(BU03*P2[0][0].x+BU13*P2[1][0].x+BU23*P2[2][0].x+BU33*P2[3][0].x)*BV03+(BU03*P2[0][1].x+BU13*P2[1][1].x+BU23*P2[2][1].x+BU33*P2[3][1].x)*BV13+(BU03*P2[0][2].x+BU13*P2[1][2].x+BU23*P2[2][2].x+BU33*P2[3][2].x)*BV23+(BU03*P2[0][3].x+BU13*P2[1][3].x+BU23*P2[2][3].x+BU33*P2[3][3].x)*BV33;y=(BU03*P2[0][0].y+BU13*P2[1][0].y+BU23*P2[2][0].y+BU33*P2[3][0].y)*BV03+(BU03*P2[0][1].x+BU13*P2[1][1].y+BU23*P2[2][1].y+BU33*P2[3][1].y)*BV13+(BU03*P2[0][2].y+BU13*P2[1][2].y+BU23*P2[2][2].y+BU33*P2[3][2].y)*BV23+(BU03*P2[0][3].y+BU13*P2[1][3].y+BU23*P2[2][3].y+BU33*P2[3][3].y)*BV33;if(u==0)pDC->MoveTo(Round(x),Round(y));elsepDC->LineTo(Round(x),Round(y));}//此双重循环程序v=0、v=dt、v=2dt……v=1的共1/dt+1条“横向”曲线段//上述两批“纵向”及“横向”曲线段,犹如“织布”般“纵横交错”,dt取值越小,“布”越密实。