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页