好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

双三次Bezier曲面.doc

7页
  • 卖家[上传人]:夏**
  • 文档编号:527252226
  • 上传时间:2023-03-15
  • 文档格式:DOC
  • 文档大小:158KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实验六 双三次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〕展开上式,有代入得到:推荐精选令则有:生成曲面时可以通过先固定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(); 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)伯恩斯坦多项式Bm,n(t)的函数实现,添加CBezierCurve2View::bernstein方法及过程参照“实验六 曲线及曲面生成算法(一)”;步骤5:在OnDraw()中添加代码:注意:添加头文件#include "math.h"//数学头文件#define Round(d) int(floor(d+0.5))//四舍五入宏定义上述两行代码添加至:类CBezierCurve2View的所有成员函数代码之前1)窗口坐标变换,设置客户区中心为原点CBezierCurve2Doc* pDoc = GetDocument(); ASSERT_VALID(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+B。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.