双三次Bezier曲面

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六 双三次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 v

B 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,0

3,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 here

CRect 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;//P00

P3[0][1].x=0; P3[0][1].y=100;P3[0][1].z=150;//P01

P3[0][2].x=-130;P3[0][2].y=100;P3[0][2].z=50; //P02

P3[0][3].x=-250;P3[0][3].y=50; P3[0][3].z=0; //P03

P3[1][0].x=100; P3[1][0].y=100;P3[1][0].z=150;//P10

P3[1][1].x=30; P3[1][1].y=100;P3[1][1].z=100;//p11

P3[1][2].x=-40; P3[1][2].y=100;P3[1][2].z=50; //p12

相关文档
最新文档