2024年2月19日发(作者:)
昆 明 理 工 大 学 理 学 院
信息与计算科学专业 操作性实验报告
年级: 10级 姓名: 刘陈 学号: 2 指导教师:
胡杰
实验课程名称: 计算机图形学程序设计 开课实验室: 理学院机房216
实验成绩:
学风(5) 观察能力(15) 操作能力(30) 调试能力(50) 其它 总分
实验内容:
1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制
2.实验/作业课时:2学时
3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):
实验环境:(1)硬件:每人一 台PC机
(2)软件:windows OS,VC++6.0或以上版本。
试验内容及步骤:
(1)在VC++环境下创建MFC应用程序工程(单文档)
(2)编辑菜单资源
(3)添加菜单命令消息处理函数
(4)添加成员函数
(5)编写函数内容
试验要求:
(1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。
(2)实现对Bezier曲线、Bezier曲面、及另一个曲面。
(3)试验中调试、完善所编程序,能正确运行出设计要求结果。
(4)书写试验报告上交。
4.程序结构(程序中的函数调用关系图)
第1页
添加消息处添加Bezier曲理函数
线、及曲面算法源码
实现绘画
.算法描述、流程图或操作步骤:
在文件中添加如下头文件及变量
int flag_2=0;
int n_change;
#define M 30
#define PI 3.14159 //圆周率
#include "math.h" //数学头文件
在lab4iew.h文件中的public内添加变量 :
int move;
int graflag;
void Tiso(float p0[3],float x0, float y0, float p[3]);
第2页
5
void OnBezierface();
在lab4iew.h文件中的protected内添加变量:
int n;//控制点数
const int N;//控制点数的上限
CPoint* a;//控制点存放的数组
double result[4][2];
在文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码:
int i,j;
for(i=0;i {pDC->FillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255)); } pDC->MoveTo(a[0]); for(j=0;j { pDC->LineTo(a[j]); } if(n<2) return;//如果控制点数少于2,则不用画 CPen pen(0,2,RGB(255,0,255)),*p1; p1=pDC->SelectObject(&pen); …… 第3页 在文件中添加如下的各个消息处理函数及代码: void CLab4View::OnLButtonDown(UINT nFlags, CPoint point) { if(flag_2==0) //flag_2等于0,此时是输入控制点状态 { CClientDC dc(this); //实时输入一个控制点,在屏幕上显示此点 lidRect(point.x-2,point.y-2,4,4,RGB(0,0,255)); if(n else {MessageBox("控制点太多!","waring",MB_OK|MB_ICONINFORMATION);} } else if(flag_2==1) //flag_2等于1,此时是修改控制点状态 { int i; for(i=0;i if((abs(point.x-a[i].x)<10)&&(abs(point.y-a[i].y)<10)) //给定一个范围,如果在范围内,则选中该控制点 } CClientDC dc(this); //如果选中该点,则该点的颜色发生变化 { n_change=i; } lidRect(a[n_change].x-2,a[n_change].y-2,4,4,RGB(255,255,0)); } 第4页 } CView::OnLButtonDown(nFlags, point); void CLab4View::OnLButtonUp(UINT nFlags, CPoint point) { if(flag_2==1) { a[n_change]=point; //给变换的点赋值 Invalidate(true); //调用OnDraw函数,重新画控制多边形 } CView::OnLButtonUp(nFlags, point); } void CLab4View::OnMouseMove(UINT nFlags, CPoint point) { if(flag_2==1) { } CView::OnMouseMove(nFlags, point); if(nFlags==MK_LBUTTON) { a[n_change]=point; Invalidate(true); } 第5页 } void CLab4View::Ondrawbezier() { } void CLab4View::OnRButtonDown(UINT nFlags, CPoint point) { CRect rc; //点右键,刷新屏幕,使控制定点数归零,并且所有开关变量变为初试值 GetClientRect(&rc); CClientDC dc(this); gle(0,0,,); //清屏 n=0; //控制点数归零 flag_2=0; //开关变量变为初试值 move=0; graflag=1; Invalidate(true); flag_2=1; CView::OnRButtonDown(nFlags, point); } void CLab4View::OnMove() { move=1; flag_2=1; CClientDC dc(this); int i=0; while (i { a[i].y=a[i].y+50; i++; } 第6页 Invalidate(true); } void CLab4View::OnBezierface() { Invalidate(true); UpdateWindow(); CClientDC dc(this); tColor(RGB(0,0,255)); t(160,160,"Bezier曲面"); CPen pen1,pen2; Pen(PS_SOLID,1,RGB(255,0,0)); Pen(PS_SOLID,3,RGB(0,0,255)); int a[24][2]={{100,400},{110,300},{130,250},{150,350}, {200,300},{210,280},{250,200},{280,250}, {300,320},{300,280},{330,180},{360,250}, {400,400},{380,320},{410,200},{480,280}}; int i,j; Object(&pen2); for(i=0;i<16;i=i+4) { (a[i][0],a[i][1]); 第7页 for(j=0;j<4;j++) { (a[i+j][0],a[i+j][1]); } } for(i=0;i<4;i++) { (a[i][0],a[i][1]); for(j=0;j<16;j=j+4) { (a[i+j][0],a[i+j][1]); } Object(&pen2); } double x,y; x=a[0][0]; y=a[0][1]; (x,y); Object(&pen1); double u,w; for(u=0;u<1;u=u+0.01) { double U0=-u*u*u+3*u*u-3*u+1; double U1=3*u*u*u-6*u*u+3*u; double U2=-3*u*u*u+3*u*u; double U3=u*u*u; x=U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0]; y=U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1]; 第8页 (x,y); for(w=0;w<1;w=w+0.01) { double W0=-w*w*w+3*w*w-3*w+1; double W1=3*w*w*w-6*w*w+3*w; double W2=-3*w*w*w+3*w*w; double W3=w*w*w; x=((U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0])*W0 +(U0*a[1][0]+U1*a[5][0]+U2*a[9][0]+U3*a[13][0])*W1 +(U0*a[2][0]+U1*a[6][0]+U2*a[10][0]+U3*a[14][0])*W2 +(U0*a[3][0]+U1*a[7][0]+U2*a[11][0]+U3*a[15][0])*W3); y=((U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1])*W0 +(U0*a[1][1]+U1*a[5][1]+U2*a[9][1]+U3*a[13][1])*W1 +(U0*a[2][1]+U1*a[6][1]+U2*a[10][1]+U3*a[14][1])*W2 +(U0*a[3][1]+U1*a[7][1]+U2*a[11][1]+U3*a[15][1])*W3); (x,y); Sleep(1); } } for(w=0;w<1;w=w+0.01) 第9页 { double W0=-w*w*w+3*w*w-3*w+1; double W1=3*w*w*w-6*w*w+3*w; double W2=-3*w*w*w+3*w*w; double W3=w*w*w; x=W0*a[0][0]+W1*a[1][0]+W2*a[2][0]+W3*a[3][0]; y=W0*a[0][1]+W1*a[1][1]+W2*a[2][1]+W3*a[3][1]; (x,y); for(u=0;u<1;u=u+0.01) { double U0=-u*u*u+3*u*u-3*u+1; double U1=3*u*u*u-6*u*u+3*u; double U2=-3*u*u*u+3*u*u; double U3=u*u*u; x=((U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0])*W0 +(U0*a[1][0]+U1*a[5][0]+U2*a[9][0]+U3*a[13][0])*W1 +(U0*a[2][0]+U1*a[6][0]+U2*a[10][0]+U3*a[14][0])*W2 +(U0*a[3][0]+U1*a[7][0]+U2*a[11][0]+U3*a[15][0])*W3); y=((U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1])*W0 +(U0*a[1][1]+U1*a[5][1]+U2*a[9][1]+U3*a[13][1])*W1 +(U0*a[2][1]+U1*a[6][1]+U2*a[10][1]+U3*a[14][1])*W2 第10页
发布评论