当前位置:文档之家› 双三次Bezier曲面

双三次Bezier曲面

双三次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,3

33,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,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 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

P3[1][3].x=-110;P3[1][3].y=100;P3[1][3].z=0; //p13

P3[2][0].x=280; P3[2][0].y=90; P3[2][0].z=140;//P20

P3[2][1].x=110; P3[2][1].y=120;P3[2][1].z=80; //P21

P3[2][2].x=30; P3[2][2].y=130;P3[2][2].z=30; //P22

P3[2][3].x=-100;P3[2][3].y=150;P3[2][3].z=-50;//P23

P3[3][0].x=350; P3[3][0].y=30; P3[3][0].z=150;//P30

P3[3][1].x=200; P3[3][1].y=150;P3[3][1].z=50; //P31

P3[3][2].x=50; P3[3][2].y=200;P3[3][2].z=0; //P32

P3[3][3].x=0; P3[3][3].y=100;P3[3][3].z=-70;//P33

3) 三维控制顶点投影(采用斜等测法)至二维点:

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));

else

pDC->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));

else

pDC->LineTo(Round(x),Round(y));

}//此双重循环程序v=0、v=dt、v=2dt……v=1的共1/dt+1条“横向”曲线段

//上述两批“纵向”及“横向”曲线段,犹如“织布”般“纵横交错”,dt取值越小,“布”越密实。(3)编译、运行后查看结果,如图1所示。

图1 双三次Bezier曲面程序结果

四、总结和思考

1.查看实验结果,验证算法的正确性;

2.在程序中,修改参数dt(包括dt1和dt2)的增量值,分别取“0.001”、“0.02”、“0.04”

及“0.1”,观察并分析结果。

3.修改相关参数,增加顶点数目分别至5*5个或更多。考虑如何修改程序,并查看实验结果;

B样条和贝塞尔曲线曲面的拼接

实验二曲线曲面的拼接贝塞尔曲线的拼接 P=[-1 2 3.5 4 4.5 6 7;7 5 6 6.5 7 3 9;2 6 4 4.5 5 11 9]; plot3(P(1,1:4),P(2,1:4),P(3,1:4),'o') hold on plot3(P(1,4:7),P(2,4:7),P(3,4:7),'+'); hold on B=[-1 3 -3 1;3 -6 3 0;-3 3 0 0;1 0 0 0]; for t=0:0.05:1 T=[t^3 t^2 t 1]; P1=T*B*P(1,1:4)'; P2=T*B*P(2,1:4)'; P3=T*B*P(3,1:4)'; plot3(P1,P2,P3,'r.') hold on Q1=T*B*P(1,4:7)'; Q2=T*B*P(2,4:7)'; Q3=T*B*P(3,4:7)'; plot3(Q1,Q2,Q3,'b*') end title('贝塞尔曲线的拼接'); xlabel('x');ylabel('y');zlabel('z');

B样条曲线的拼接 P=[1 2 3 4 5;1.5 7 6 6.5 7;3 1.5 3.5 5.5 4.5]; plot3(P(1,1:4),P(2,1:4),P(3,1:4),'o') hold on plot3(P(1,2:5),P(2,2:5),P(3,2:5),'+') hold on B=[-1 3 -3 1;3 -6 3 0;-3 0 3 0;1 4 1 0]; for t=0:0.05:1 T=[t^3 t^2 t 1]; P1=1/6*T*B*P(1,1:4)'; P2=1/6*T*B*P(2,1:4)'; P3=1/6*T*B*P(3,1:4)'; plot3(P1,P2,P3,'r.') hold on Q1=1/6*T*B*P(1,2:5)'; Q2=1/6*T*B*P(2,2:5)'; Q3=1/6*T*B*P(3,2:5)'; plot3(Q1,Q2,Q3,'b*'); end title('B样条曲线的拼接'); xlabel('x');ylabel('y');zlabel('z');

B样条曲线曲面和NURBS曲线曲面C语言算法源程序

学习小结:前面学习了Bezier 曲线,B 样条基函数和B 样条曲线的一些基础知识。掌握关键问题是一条B 样条曲线间的多段曲线的光滑连接。因为现在是用多段Bezier 曲线来描绘一条B 样条曲线,所以问题变为两段Bezier 曲线间光滑连接。两段Bezier 曲线段(3次)B1和B2光滑连接的条件: (1).要求B1和B2有共同的连接点,即G 0 连续。 (2).要求B1和B2在连接点处有成比例的一阶导数,即G 1 连续。由端点处的一阶导数 )(3)0(2),(3)1(10123Q Q B P P B -='-=',为实现G 1连续,则有: )1(1)0(2B B '=' 即:2301P P Q Q -=- 这也表明,1032),(,Q Q P P 三点共线。如下图表示了一条3次B 样条曲线的所有控制多边形: 1 ) P 2 P 3 P 4 (P 11 12 ) P 5 P 10 0 P 6 P 9 7 P 8 图5.3次B 样条曲线和所有控制多边形 图5中,P0至P6为原始3次B 样条曲线控制多边形顶点,P 0至P 12 是计算后最终形成B 样条曲线控制多边形顶点。 图6.双二次(2x2)B 样条曲面 6.B 样条曲线曲面和NURBS 曲线曲面的C 语言实现算法源程序 #ifndef _mynurbs_h #ifndef _MYNURBS_H

#include "gl\gl.h" #include "math.h" //*-*-*-*-*-*-*-*-*-*-*-*-*-*-* B样条基函数计算部分 *-*-*-*-*-*-*-*-*-*-*-*-*-* //确定参数u所在的节点区间下标 //n=m-p-1 //m为节点矢量U[]的最大下标 //p为B样条函数次数 int FindSource(int n,int p,float u,float U[]) { int low,high,mid; if(u==U[n+1])//特殊情况 return n; //进行二分搜索 low=p; high=n+1; mid=(int)(low+high)/2; while(uU[mid]) { if(u=U[mid]&&u=i-k;di--) { if(u>=U[di]&&u

B样条曲线与曲面

四、B 样条曲线与曲面 Bezier 曲线具有很多优越性,但有二点不足: 1)特征多边形顶点数决定了它的阶次数,当n 较大时,不仅计算量增大,稳定性降低,且控制顶点对曲线的形状控制减弱; 2)不具有局部性,即修改一控制点对曲线产生全局性影响。 1972年Gordon 等用B 样条基代替Bernstein 基函数,从而改进上述缺点。 B样条曲线的数学表达式为: ∑=+?= n k n k k i n i u N P u P 0 ,,) ()( 在上式中,0 ≤ u ≤ 1; i= 0, 1, 2, …, m 所以可以看出:B样条曲线是分段定义的。如果给定 m+n+1 个顶点 Pi ( i=0, 1, 2,…, m+n),则可定义 m+1 段 n 次的参数曲线。 在以上表达式中: N k,n (u) 为 n 次B 样条基函数,也称B样条分段混合函数。其表达式为: ∑ -=+--+??-=k n j n j n j n k j k n u C n u N 0 1,)()1(!1)( 式中:0 ≤ u ≤1 k = 0, 1, 2, …, n 1.均匀B 样条曲线 1 一次均匀B 样条曲线的矩阵表示 空间n+1个顶点 i P (i = 0,1,…,n )定义n 段一次(k =0,1,n=1)均匀B 样条曲线,即每 相邻两个点可构造一曲线段P i (u ),其定义表达为: []10 ;,...,1 0111 1)(1≤≤=??? ?????????-=-u n i u u P i i i P P =(1-u )P i -1 + u P i = N 0,1(u )P i -1 + N 1,1(u )P i 第i 段曲线端点位置矢量:i i i i P P P P ==-)1(,)0(1,且一次均匀B 样条曲线就是控制多边 形。

三次非均匀B样条曲面的绘制

%%%%%%%%%%三次非均匀B样条曲面的绘制 clc clf clear A=input('请输入控制点:')%16个控制顶点要求以列向量表示点的坐标[2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5;2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5;1 2 3 1 3 4 6 2 7 5 6 2 9 1 3 4]; n=input('请输入所需绘制B样条曲线的次数:'); Vx=[A(1,1:4);A(1,5:8);A(1,9:12);A(1,13:16)];%将控制顶点的x坐标放到维数为4的方阵中 V y=[A(2,1:4);A(2,5:8);A(2,9:12);A(2,13:16)];%将控制顶点的y坐标放到维数为4的方阵中Vz=[A(3,1:4);A(3,5:8);A(3,9:12);A(3,13:16)];%将控制顶点的z坐标放到维数为4的方阵中plot3(A(1,:),A(2,:),A(3,:),'o');%输出控制顶点 hold on syms u syms w P_uwx=[0]; P_uwy=[0]; P_uwz=[0]; for i=1:1:4; for j=1:1:4 u0=0;u1=0;u2=0;u3=0;u4=1;u5=1;u6=1;u7=1;%给定4个控制顶点所取的节点矢量 B1=(u4-u3-u)^3/((u4-u3)*(u4-u2)*(u4-u1)); B2=((u3-u1+u)*(u4-u3-u)^2)/((u4-u3)*(u4-u2)*(u4-u1))+((u5-u3-u)*(u4-u3-u)*(u3-u2+u))/((u5-u 2)*(u4-u3)*(u4-u2))+((u5-u3-u)^2*u)/((u5-u3)*(u5-u2)*(u4-u2)); B3=((u4-u3-u)*(u3-u2+u)^2)/((u5-u2)*(u4-u3)*(u4-u2))+((u5-u3-u)*u*(u3-u2+u))/((u5-u3)*(u5-u2)*(u4-u3))+((u6-u3-u)*u^2)/((u6-u3)*(u5-u3)*(u4-u3)); B4=u^3/((u6-u3)*(u5-u3)*(u4-u3)); B=[B1;B2;B3;B4];%三次非均匀B样条基函数矩阵(自由曲线曲面造型技术139页) w0=0;w1=0;w2=0;w3=0;w4=1;w5=1;w6=1;w7=1;%给定4个控制顶点所取的节点矢量 C1=(w4-w3-w)^3/((w4-w3)*(w4-w2)*(w4-w1)); C2=((w3-w1+w)*(w4-w3-w)^2)/((w4-w3)*(w4-w2)*(w4-w1))+((w5-w3-w)*(w4-w3-w)*(w3-w2 +w))/((w5-w2)*(w4-w3)*(w4-w2))+((w5-w3-w)^2*w)/((w5-w3)*(w5-w2)*(w4-w2)); C3=((w4-w3-w)*(w3-w2+w)^2)/((w5-w2)*(w4-w3)*(w4-w2))+((w5-w3-w)*w*(w3-w2+w))/((w 5-w3)*(w5-w2)*(w4-w3))+((w6-w3-w)*w^2)/((w6-w3)*(w5-w3)*(w4-w3)); C4=w^3/((w6-w3)*(w5-w3)*(w4-w3)); C=[C1;C2;C3;C4];%三次非均匀B样条基函数矩阵 Puwx=Vx(i,j)* B(i)*C(j);%控制顶点的x坐标与两个方向的基函数做乘积 Puwy=V y(i,j)* B(i)*C(j); Puwz=Vz(i,j)* B(i)*C(j); P_uwx=P_uwx+Puwx;%得到曲面的x坐表关于u,w的表达式(自由曲线曲面造型技术146页) P_uwy=P_uwy+Puwy;%得到曲面的y坐表关于u,w的表达式 P_uwz=P_uwz+Puwz;%得到曲面的z坐表关于u,w的表达式 end end

双三次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 v B 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 ??--??????-?????????-????

B样条曲线曲面的性质及其生成算法的研究

B样条曲线曲面的性质及其生成算法的研究 XXX (XXX学院数学与信息科学学院05级信本(2)班) 摘要 从B样条曲线曲面的定义入手,阐述了B样条曲线曲面的性质,在生成算法中提出了一个扩展B样条曲线曲面的新方法.扩展B样条曲线曲面的关键是为新增加的点确定节点值.生成算法的基本思想是:首先,B样条曲线和扩展部分在连接点处满足2 GC连续,用能量极小化方法确定扩展部分的曲线形状,通过对曲线重新参数化使两部分曲线满足2 C连续,进而确定新增加点的节点值.文章还讨论了运用该方法进行B样条曲面扩展,且以实例对新方法与其它方法进行了比较. 关键词:B样条曲线; B样条曲面;参数化;曲线扩展 Research On The Nature Of B-spline Curves And Surfaces And Their Generation Algorithm Yongning Zhang College of Mathematics and Information Science , Xianyang Normal University , Information Class 05(2) Abstract First, the definitions of B-spline curves and surfaces are introduced, and then the nature of B-spline curves and surfaces are studied. On the final, a new generation algorithm on expansion of B-spline curves and surfaces is proposed. The key thought of expansion of B-spline curves and surfaces is to determine the value of the new points. The basic idea of generation algorithm is: First of all, B-spline curve and the extension of the connecting points in a row to meet with the energy minimization method to determine the extension of the curve shape of the curve through re-parameterized so that the two parts meet the continuous curve, and then determine the new value of the node points. The article also discussed the use of the method of B-spline surfaces expansion, and compared an example of the new method with other methods. Keywords: B-spline curve; B-spline surfaces; parameter; curve extension

双三次Bezier曲面的绘制

课程名称:《计算机图形学》 论文题目:双三次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 b b 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 =

b样条曲面

B样条曲面的算法生成及研究 本文由天空乐园大学生旅游网整理分享 摘要 本文主要介绍B样条曲面的性质、算法、以及应用,让我们对B样条曲面有一个全面的了解。B样条曲面不仅在保留了Bézier曲面的优点的同时克服了由于整体表示带来的不具有局部性质的特点,而且成功地解决了样条函数的局部控制问题,轻而易举地在参数连续性上解决了贝奇尔方法的连接问题,是最广泛流行的形状数学描述的主流方法之一。B样条曲面中均匀双三次B样条曲面又是各种B 样条曲面中应用最多的一种之一,它避免了B 样条递推定义的繁琐算法,只要给出的空间型值点大致均匀,即可生成空间任何形状的曲面。而非均匀有理B样条曲面( NU RBS ) 是曲面构造的常用工具, 是目前工业界曲面曲线表示的数学标准。B-样条曲面是一种特殊NU RBS , 在实际应用中是首选形式。在本文中我们主要介绍了均匀双三次B样条曲面。 关键词:B样条曲面非均匀B样条曲面双三次均匀B样条曲面 B样条基函数 1 引言 计算机运用技术的不断发展使得CAD/CAM技术日益提高和完善,为实现工业生产过程自动化展示了光明的前景。目前,利用程序系统对某一产品实现机辅设计和数控加工的自动化过程已经开始。然而在实际生产中,数控机床的使用还很不普遍,大部分数控机床仍靠手工编程来实现单一加工。这除了数控设备价格昂贵之外,控制程序系统的设计难度较大也是重要原因之一。譬如,对数控铣削加工控制程序系统的设计,尤其是在数控铣床上加工任意形状曲面的程序系统设计, 目前还处于探讨摸索之中。随着汽车、船舶、航空工业的发展,对于工业产品的形状描述也就提出了越来越高的要求。工业产品的形状大致可以分为两类:一类是仅有初等解析曲面,例如平面、圆柱面、圆锥面、球面以及它们组合而成的规则曲面;另一类是不能由任何解析表达的自由型曲面。汽车、船舶、飞机的外部零件基本上都是自由曲面。而自由曲面不能由画法几何与机械制图表达清楚,成为摆在工程师面前首要解决的问题。De Boor(德布尔)与1971年给出了关于B 样条的一套标准算法。美国通用公司的戈登和里森费尔德于1974年将B样条理论应用于形状描述,提出了B样条曲线曲面。它将成功地解决了样条函数的局部控制问题,又轻而易举地在参数连续性上解决了贝奇尔方法的连接问题,是最广泛流行的形状数学描述的主流方法之一。该算法能显著提高效率。现在提出了B 样条曲面等测投影的建立方法,讨论用高性能的动态数组和Excel 软件存储任意数量控制点的实现方法等关键技术。采用Visual C++6.0 为编程工具开发软件系统,实现了任意数量控制点的双三次B 样条曲面生成。B 样条曲面在保留了Bezier 曲面的优点的同时,又克服了由于整体表示带来的不具有局部性质的特点,是目前工程中应用最多的一种曲面,有人甚至称之为“统一当代的B 样条曲面”。而均匀双三次B 样条曲面又是各种B 样条曲面中应用最多的一种之一,它避免了B 样条递推定义的繁琐算法,只要给出的空间型值点大致均匀,即可生成空间任何形状的曲面。随着B 样条方法,NURBS,的产生和发展,曲面的样条表示形式逐渐被引入到曲面设计中,较早的有Bloor 等使用B 样条作为双调和方程的解. 后来, Terzopoulos 等[提出了一种动态NURBS方法,其用一个二阶微分方 程来决定DNURBS 的演化,但该方程不是几何内蕴的,且无法获得NURBS片的 G1光滑拼接.最近,徐国良[12 ] 提出一种新的方法,通过整合B样条曲面和一般形

b样条曲面

实验四:B 样条曲面 一.实验目的 用多个B 样条曲线画出一个曲面,并能实现鼠标球滚动。 二.算法思想 B 样条曲面是B 样条曲线的拓广。一块m ?n 次B 样条曲面片的数学表示式:)()(),(,,00 w F u F P w u P n j m i m i n j ij ∑∑=== w u , ∈[0,1] 式中,ij P (i =0,1,2,…..,m; j =0,1,2,…..n )是定义此曲面片的顶点位置向量矩阵,共计(m+1) (n+1)个顶点。)()(,,w F u F n j m i 为B 样条基底函数,w u ,为参数。显然,m 与n 不一定相等,如m=n=3,则由4?4个顶点构成特征多面体,其相应的B 样条曲面片称为双三次 B 样条曲面片。其中: m i m i m k k m i k i m u c m u F )()1(!1 )(10 ,--+-= +-=∑ )! 1(!)!1(1i m i m C i m -++= +其中: 展开三次B 样条曲面数学表达式并写成矩阵 ()()( ) () T T s T s W M w w w w F w F w F w F UM u u u u F u F u F u F w F w F w F w F p p p p p p p p p p p p p p p p u F u F u F u F w u Q =?????? ? ??????????????----= =????? ???????----=????????????????????? ???=100 1 13334063133161)() ()() (01 4 1 03030 3631331611 )() ()() ()()()()()() ()() (),(2343212 3 432143213332 31 30 2322212013121110 030201004321其中: 三.程序主要代码 #include #include #include "ggltools.h" #include "gmatrix3d.h" #include "gvector3d.h" GMatrix3d gRotMatrix ; bool gIsLBtnDown =false ; int gMouseX =0; int gMouseY =0; //控制点网络 GPoint3d **gCtrlGrid =NULL ; //

第八章 B样条曲线曲面(Ⅱ)

第八章 B样条曲线曲面 (Ⅱ)

第一节 反算B样条插值曲线 的控制顶点 2

3 问题: 设计一条 设计一条k k 次 次B B 样条曲线,插值给定的数据点, 如何确定 如何确定节点矢量、控制顶点的个数和位置 节点矢量、控制顶点的个数和位置? 解决方案: 一般地,将曲线的首末端点分别与首末数据点对 应起来,为实现这一目的,需要将首末节点都取作 应起来,为实现这一目的,需要将首末节点都取作k + +1 1重。另外,将曲线的分段连接点和内数据点(除 首末数据点以外的数据点依次对应,根据上一章节点 矢量的确定方法,曲线分段连接点和定义域内的内部 节点也一一对应起来,所以: 节点也一一对应起来,所以:

分 分 段 段 连 连接 接 点 定 定 义 义 域 域 内 内 节 节 点 内数据点 建立了这种对应关系后,曲线的 段数以及节点矢量的大小就可以 确定了。 确定了。 n,0,1,, i p i n = r L 设有个待插值的数据点 k1 首节点为 +重,即: 01 k u u u === L p r 它们与第一个待插值点 对应。 4

5 内部数据点与定义域内的节点一一对应,所以: ,0,1, i k i p u i n + = r L 与节点值 一一对应。 [ ] , k n k u u + 这样,插值曲线的定义域就是 [ ] 1 m 1k B , k m u u + 因为,一般情况下,对于 +个控制顶点的 次 样条曲线,它的定义域为: 所以,插值曲线应有n+k个控制顶点,记作: 011 ,, n k d d d +- r r r L

相关主题
文本预览
相关文档 最新文档