计算机图形学实验报告记录

计算机图形学实验报告记录
计算机图形学实验报告记录

计算机图形学实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

计算机图形学实验报告

姓名:___ __________

学号:_____ ________

班级:______ _______

时间:_____2016年12月_________

实验一OpenGL编程与图形绘制

1.实验目的

了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。学会配置OpenGL环境,并在该环境中编程绘图。

2.实验内容

OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。

OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。

OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。

OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。

了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。

3.实验代码及结果

3.1点的绘制:

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红

// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形

glPointSize(10); //三个点

glBegin(GL_POINTS);

glColor3f(1.0f,0.0f,0.0f);

glVertex2i(2,148);

glVertex2i(100,75);

glVertex2i(198,2);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环

return 0;

}

运行结果:

3.2直线的绘制:

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形

glBegin(GL_LINE_LOOP); //五角星

glVertex2i(10,10);

glVertex2i(30,35);

glVertex2i(50,10);

glVertex2i(5,25);

glVertex2i(55,25);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环

return 0;

}

运行结果:

3.3多边形面的绘制:

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形

glBegin(GL_TRIANGLES); //等边三角形

glVertex2f(0.0,0.0);

glVertex2f(15,25.95);

glVertex2f(30,0);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环

return 0;

}

运行结果:

实验二直线绘制实验

1.实验目的

为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。

2.实验内容

(一)数值微分法

数值微分法直接从直线的微分方程生成直线。给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),得到直线的微分方程dy/dx=△y/△x=(Y1-Y0)/(X1-X0)=k。

数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和△y是成比例的,因此通过在当前位置(Xi,Yi)分别加上两个小增量ε△x和ε△y(ε为无穷小的正数)来

求下一点(X(i+1),Y(i+1))的x,y坐标。

(二)中点画线算法

给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。

绘图过程如下:

○1.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。

○2.计算初始值△x, △y,d=△x-2△y,x=X0,y=Y0.

○3.绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。

○4.当直线没有画完时,重复步骤○3,否则结束。

(三)Bresenham算法

算法步骤如下:

○1.输入直线两端点P0(X0,Y0)和P1(X1,Y1)。

○2.计算初始值△x, △y,e=-△x,x=X0,y=Y0。

○3.绘制点(x,y)。

○4.e更新为e+2△y。判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e-2△x;否则(x,y)更新为(x+1,y)。

○5.当直线没有画完时,重复步骤○3和○4;否则结束。

3.实验代码及结果

3.1数值微分算法编程绘制直线代码:

#include

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

glBegin(GL_LINES);

int x0=10;int y0=20;int x1=30;int y1=40;int color=10;

int dx,dy,epsl,k;

float x,y,xIncre,yIncre;

dx=x1-x0;

dy=y1-y0;

x=x0;

y=y0; //

if(abs(dx)>abs(dy))

epsl=abs(dx);

else epsl=abs(dy);

xIncre=(float)dx/(float)epsl;

yIncre=(float)dy/(float)epsl;

for(k=0;k<=epsl;k++)

{

glVertex2i(int(x+0.5),(int)(y+0.5));

x+=xIncre;

y+=yIncre;

}

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环

return 0;

}

实验结果:

2.2中点画线算法编程绘制直线代码:

#include

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色glBegin(GL_POINTS);

int x0=50;int y0=20;int x1=100;int y1=120;int color=10;

int dx,dy,d,UpIncre,DownIncre,x,y;

if(x0>x1)

{

x=x1;x1=x0;x0=x;

y=y1;y1=y0;y0=y;

}

x=x0;y=y0;

dx=x1-x0;dy=y1-y0;

d=dx-2*dy;

UpIncre=2*dx-2*dy; DownIncre=2*dy;

while(x<=x1)

{

glVertex2i(x,y);

x++;

if(d<0)

{

y++;

d+=UpIncre;

}

else d+=DownIncre;

}

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环

return 0;

}

实验结果:

2.3Bresenham算法编程绘制直线代码:

#include

#include

void Initial(void){

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void Display(void){

glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

//Bresenham算法

glBegin(GL_POINTS);

int x0 = 10;int y0 = 20;int x1 = 90;int y1 = 90;int color=10;

int x,y,dx,dy,e;

dx = x1-x0;dy = y1-y0;

e=-dx;x=x0;y=y0;

while(x<=x1){

glVertex2i(x,y);

x++;

e=e+2*dy;

if(e>0){

y++;

e=e-2*dx;

}

}

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序

}

int main(int argc,char*argv[]){

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的现实模式glutInitWindowSize(400,300); //设置窗口的尺寸

glutInitWindowPosition(100,200); //设置窗口的位置

glutCreateWindow("点"); //创建一个名为矩形的窗口

glutDisplayFunc(Display); //设置当前窗口的显示函数

Initial(); //完成窗口的初始化

glutMainLoop(); //启动主GLUT事件处理循环

return 0;

}

实验结果:

实验三圆绘制实验

1.实验目的

2.实验内容

(一)八分法画圆

圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。

(二)中点Bresenham画圆算法

算法步骤如下:

○1输入圆的半径R

○2计算初始值d=1-R,x=0,y=R。

○3绘制点(x,y)及其在八分圆中的另外7个对称点。

○4判断d的符号。若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。

○5当x

(三)椭圆的中点Bresenham算法

算法步骤如下:

○1输入椭圆的长半轴a和短半轴b。

○2计算初始值d=b^2+a^2(-b+0.25),x=0,y=b。

○3绘制点(x,y)及其在四分象限上的另外三个对称点。

○4判断d的符号。若d<=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。

○5当b^2(x+1)

○6用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2

○7绘制点(x,y)及其在四分象限上的另外三个对称点。

○8判断d的符号。若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+1,y-1);否则先将d更新为d+a^2(-2y+3),再将(x,y)更新为(x,y-1)。

○9当y>=0时,重复步骤○7和○8;否则结束。

3.实验代码及结果

3.1八分法画圆程序代码:

#include

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void CirclePoint(int x,int y,int color){

glVertex2i(x+50,y+50);

glVertex2i(y+50,x+50);

glVertex2i(-y+50,x+50);

glVertex2i(-x+50,y+50);

glVertex2i(-x+50,-y+50);

glVertex2i(-y+50,-x+50);

glVertex2i(y+50,-x+50);

glVertex2i(x+50,-y+50);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

glPointSize(10);

glBegin(GL_POINTS);

CirclePoint(10,20,20);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;

}

实验结果:

3.2中点Bresenham 算法绘制圆代码

#include

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void CirclePoint(int x,int y,int color){

glVertex2i(x+50,y+50);

glVertex2i(y+50,x+50);

glVertex2i(-y+50,x+50);

glVertex2i(-x+50,y+50);

glVertex2i(-x+50,-y+50);

glVertex2i(-y+50,-x+50);

glVertex2i(y+50,-x+50);

glVertex2i(x+50,-y+50);

}

void MidBresenhamCircle(int r,int color)

{

int x,y,d;

x=0;y=r;d=1-r;

while(x<=y)

{

CirclePoint(x,y,color);

if(d<0)

d+=2*x+3;

else

{

d+=2*(x-y)+5;

y--;

}

x++;

}

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

glPointSize(3);

glBegin(GL_POINTS);

MidBresenhamCircle(20,10);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数

Initial(); //完成窗口初始化

glutMainLoop(); //完成窗口GLUT事件处理循环return 0;

}

实验结果:

3.3中点Bresenham 算法绘制椭圆代码:

#include

#include

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色

glMatrixMode(GL_PROJECTION); //指定设置投影参数

gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数

}

void MidBresenhamEllipse(int a,int b,int color)

{

int x,y;

float d1,d2;

x=0;y=b;

d1=b*b+a*a*(-b+0.25);

glVertex2i(x+50,y+50); glVertex2i(-x+50,-y+50);

glVertex2i(-x+50,y+50); glVertex2i(x+50,-y+50);

while(b*b*(x+1)

{

if(d1<=0)

{

d1+=b*b*(2*x+3);

x++;

}

else

{

d1+=b*b*(2*x+3)+a*a*(-2*y+2);

x++;y--;

}

glVertex2i(x+50,y+50); glVertex2i(-x+50,-y+50);

glVertex2i(-x+50,y+50); glVertex2i(x+50,-y+50);

}

d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)-a*a*b*b;

while(y>0)

{

if(d2<=0)

{

d2+=b*b*(2*x+2)+a*a*(-2*y+3);

x++;y--;

}

else{

d2+=a*a*(-2*y+3);

y--;

}

glVertex2i(x+50,y+50); glVertex2i(-x+50,-y+50);

glVertex2i(-x+50,y+50); glVertex2i(x+50,-y+50);

}

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口

glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色

glPointSize(3);

glBegin(GL_POINTS);

MidBresenhamEllipse(40,25,10);

glEnd();

glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置

glutCreateWindow("矩形"); //创建一个名为矩形的窗口

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

(完整版)计算机图形学发展综述

计算机图形学发展综述 报告 专业 班级 学生 学号

计算机图形学发展综述 一、计算机图形学历史 1950年,第一台图形显示器作为美国麻省理工学院(MIT)旋风I(Whirlwind I)计算机的附件诞生了。该显示器用一个类似于示波器的阴极射线管(CRT)来显示一些简单的图形。1958年美国Calcomp公司由联机的数字记录仪发展成滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。在整个50年代,只有电子管计算机,用机器语言编程,主要应用于科学计算,为这些计算机配置的图形设备仅具有输出功能。计算机图形学处于准备和酝酿时期,并称之为:“被动式”图形学。到50年代末期,MIT的林肯实验室在“旋风”计算机上开发SAGE空中防御体系,第一次使用了具有指挥和控制功能的CRT显示器,操作者可以用笔在屏幕上指出被确定的目标。与此同时,类似的技术在设计和生产过程中也陆续得到了应用,它预示着交互式计算机图形学的诞生。 1962年,MIT林肯实验室的Ivan E.Sutherland 发表了一篇题“Sketchpad:一个人机交互通信的图形系统”的博士论文,他在论文中首次使用了计算机图形学Computer Graphics”这个术语,证明了交互计算机图形学是一个可行的、有用的研究领域,从而确定了计算机图形学作为一个崭新的科学分支的独立地位。他在论文中所提出的一些基本概念和技术,如交互技术、分层存储符号的数据结构等至今还在广为应用。1964年MIT的教授Steven A. Coons提出了被后人称为超限插值的新思想,通过插值四条任意的边界曲线来构造曲面。同在60年代早期,法国雷诺汽车公司的工程师Pierre Bézier发展了一套被后人称为Bézier曲线、曲面的理论,成功地用于几何外形设计,并开发了用于汽车外形设计的

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学实验二报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目曲线拟合 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

曲线拟合 1. 实验内容 1. 绘制三次Bezier曲线 (1)给定四个已知点P1—P4,以此作为控制顶点绘制一段三次Bezier曲线。 (2)给定四个已知点P1—P4,以此作为曲线上的点绘制一段三次Bezier曲线。 2. 绘制三次B样条曲线 给定六个已知点P1—P6,以此作为控制顶点绘制一条三次B样条曲线。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析 1. 绘制三次Bezier曲线 Bezier曲线是用N+1个顶点(控制点)所构成的N根折线来定义一根N阶曲线。本次实验中的三次Bezier曲线有4个顶点,设它们分别为P0,P1,P2,P3,那么对于曲线上各个点Pi(x,y)满足下列关系: P(t)=[(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)]/6 X(t)=[(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)]/6 Y(t)=[(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6 其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。所以只要确定控制点的坐标,该曲线可通过编程即可绘制出来。 2. 绘制三次B样条曲线 三次B样条函数绘制曲线的光滑连接条件为:对于6个顶点,取P1、P2、P3、P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P5 这4个顶点绘制在第二段三次样条曲线,总计可绘制3段光滑连接的三次样条曲线。 4. 算法设计 程序框架 //DiamondView.h class CDiamondView : public CView { ……

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include #include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void)

{ glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学报告

中南大学 计算机图形学 实验报告 学生姓名谭淼 学号23 专业班级应数1102班 指导老师刘圣军 数学与统计学院 2013年12月 实验目的:设计并实现一个简单动画(二维或三维)。熟悉并应用画线的基本算法—Bresenham算法。 实验过程: 1、实验步骤: (1)打开Visual Studio 2010,新建一个MFC项目,取名为tuxingxue,设置为单文档。 (2)打开类视图,添加一个名为Cline2D的类,在该类中添加BresenhamLine(CDC* pDC, int xa,float ya,int xb,float yb) DrawPixel(CDC* pDC, int x, float y, unsigned int color, int size); BresenhamLine1(CDC* pDC, int xa,float ya,int xb,float yb);

BresenhamLine2(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine3(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine4(CDC* pDC, int xa,float ya,int xb,float yb); 以上函数的返回值类型均为void型。在中,分别在其中添加代码实现画线的功能,具体代码见附录中的源代码。 (3)画出基本图形。在中定义CLine2D 的一个对象为line1,以便调用CLine2D中的函数,此时在调用的函数中赋初始值即可画出最基本的图形,即为一颗大五角星以及三颗小的五角星。 (4)让画出的五角星动起来。从类视图中CtuxingxueView下添加名为OnTimer的消息处理函数,在中添加bool型变量m_flag,在OnTimer函数下添加代码,具体代码见附录。在添加变量int m_x1、int m_y1、int m_x2、int m_y2、int m_x3、int m_y3、int m_x4、int m_y4、int m_x5、int m_y5、int m_x6、int m_y6、int m_x7、int m_y7、int m_x8、int m_y8、int m_x9、int m_y9、int m_x10、int m_y10、 int m_x11、int m_y11、int m_x12、int m_y12。在中为这些变量赋初始值,将第三步中函数赋的初值用这些变量代替,这样变量的值可以改变,在资源视图中menu下IDR_MAINFRAME中添加名为绘图的菜单项,在绘图下添加名为运行的选项,其ID号为ID_run,添加事件处理程序,函数处理程序名称为Onrun,将其类选为C tuxingxueView,此时,在Onrun中添加代码,再运行就可以让图形动起来了。 2、实验中遇到的问题及处理方法

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

计算机图形学报告

数字媒体技术专业 计算机图形学课程设计报告 院系:印包学院 专业班级:媒体121 学生学号: 3120342001 学生姓名:孔祥倩 指导教师:吴学毅 2014年秋季学期

目录 一.课程设计的目的 (2) 二.课程系统描述实现及步骤 (2) 三.设计内容 (3) 四.源程序代码 (4) 五.总结 (19) 六.参考文献 (20) 七.附录 (20)

一、课程设计的目的 OpenGL即开放性图形库,它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。本文讨论了两种将常见三维模型转入OpenGL 中实现交互的方法,首先对文件进行分析,然后给出转化的思路。从而将三维建模软件产生的三维模型移植到三维场景中,实现仿真. 本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。在学期期末时按课程要求进行运动,提高学生对计算机图形学知识的了解与运用技巧同时通过此次课程设计提高动手实践能力与学习分析能力这就是本次的课 OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,因为其良好的可移植性和跨平台性,已逐渐成为高性能图形开发和交互式视景仿真的国际图形标准。它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。使用这些指令和函数可以构造出高质量的静止物体模型和动态图像,并且可以实现对模型的实时交互操作过程。但是OpenGL中并没有提供建模的高级命令,其实现过程也是通过基本的几何图元点、线和多边形来建立三维立体模型的,过程比较繁琐,编程量较大。 二.课程系统描述实现及步骤 此次课程设计的课题为利用VC++6.0和插件OPENGL制作三维模型。本设计主要通过建立MFC工程,在工程里建立一个三维模型,来建立一个动态的三维模型。设计一个小院子,其中有房子,树木,桌凳,月亮的一系列景物。运行程序,实现在这个小院子中的漫游。 主要步骤如下: 1:工程的建立 2:三维模型的建立和映射 3:三维模型的运动 一:工程的建立 1:系统配置。先对机子安装VC++6.0.在建立工程前,本实验需要添加OPENGL插件,故需要在Windows环境下安装GLUT 步骤如下: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。 3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。 4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32)然后建立

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

《计算机图形学基础》第三次大作业实验报告共3页文档

第三次实验 1. 实验目的 实现用 Phong 光照明模型显示网格模型(*.smf)。分别实现不使用/使用增量式光强/法 向插值算法,比较三种不同的显示效果和效率。 Phong模型中各参数可调,观察它们的作用。 与用户的交互方式为图形用户界面,操作简单,界面友好。 2. 算法描述 2.1. 基于扫描线算法的Phong 模型实现 上一次大作业中我没有完成扫描线 ZBuffer 算法,使得程序的效率很低,这次作业考虑 到各种计算对时间的消耗会更大,所以我首先完成了扫描线算法再进行这次作业代码的编写。 对扫描线Z-Buffer算法这里不作详细描述,主要介绍 Phong模型的实现。基于扫描线算 法的 Phong 模型实现是非常方便的,因为最基本的 Phong 模型中每个面的颜色是法向量的 函数,因此每个面的颜色是相同的,这样在扫描线算法之前我首先初始化了一个数组,将各 个面的颜色根据用户提供的参数以及 Phong 模型公式计算出来保存在这个数组里,每一项 对应一个面,这样在具体扫描线算法的执行过程中每一个点颜色的获取

都仅仅是对数组的读 取操作,是O(1)的复杂度,不会消耗太多时间。 算法如下: 1.对物体表面上的每个点P,均需计算光线L的反射方向R, R=2N(N·L)-L。 为了减少计算量,假设: 2.光源在无穷远处,L为常向量 3.视点在无穷远处,V为常向量 4.用(H?N)近似(R?V),H为L与V的平分向量 5.Phong光照明模型的RGB颜色模型形式 2.2. 双线性光强差值算法 考虑到双线性光强差值算法的核心思想是由顶点的光强插值计算各边的光强,然后由各 边的光强插值计算出多边形内部点的光强,结合之前实现的扫描线ZBuffer 算法,我使用了 增量的方式实现这个算法,也就是将它和扫描线算法结合起来,在扫描线算法每个面的边表 中多加几个个域来表示当前的光强、光强在X 方向的单位增量和光强在 Y 方向的单位增量, 这样在扫描到每个点的时候就可以根据前一个点的光强以及光强增量获得该点的光强,另外 在扫描线改变的时候光强也需要根据Y方向的增量来进行相应的修改。

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

计算机图形学报告

计算机图形学大作业报告 课程名称:计算机图形学 姓名: 学号: 组员: 任课教师: 成绩:

1引言 1.1 编写目的 本学期计算机图形学课程期末大作业主要的开发项目就是基于MFC的基本图形的绘制、填充、变换,以及直线的裁剪。实现语言VC++,编辑、调试环境VC++6.0。此次大作业的完成是对计算机图形学基础知识的检验和测试,在撰写报告的过程中我能够更深刻地了解计算机图形学算法的思想,通过这份文档来记录我们在开发此软件的过程中遇到的问题以及改善的方法。现在对整个开发过程加以认识、记录和总结,留下经验,汲取教训。为以后的其他工作留下经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础。 1.2任务分工 xx:实现直线,圆,扫描线填充的算法。 xx:椭圆,裁剪。 xx:四连通种子填充,变换算法。 2 程序框架 2.1 程序模块 本系统是一个基于MFC开发的实现能够进行人机交互的基本图形的绘制、填充、变换,以及直线的裁剪的系统。本系统中的功能模块主要分为以下几种: 基本图形绘制模块:实现直线、矩形、圆、椭圆的绘制及填充功能。 基本图形变换模块:实现直线、正三角形、矩形的平移、比例、旋转变换功能。基本图形裁剪模块:实现直线的裁剪功能。

程序框架如图2-1所示。 图2-1 程序框架图 2.2程序功能接口 接口名称:void CMyView::seed (int x,int y, int oldcolor,int newcolor) 功能说明:实现四连通种子填充。 参数说明:x,y:种子坐标; oldcolor:背景颜色; newcolor:线的颜色。 接口名称:void CMyView::OnPy() 功能说明:实现平移。 接口名称:void CMyView::OnXz() 功能说明:实现旋转。 接口名称:void CMyView::OnSf() 功能说明:实现缩放。

研究生计算机图形学课程室内场景OpenGL--实验报告

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.360docs.net/doc/1e829698.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREA TE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

《计算机图形学》大作业项目汇报

中国科学技术大学《计算机图形学》大作业项目汇报 扫地机器人 顾欣玮1葛子恒1冯睿蠡1 1中国科学技术大学2014级数学科学学院 【元件】 单片机×1 电机×2 超声波测距仪×1 红外信号接收器×1 遥控器×1 轮胎×2 万向轮×1

简易清洁装置(DIY) 【项目介绍】 我们通过超声波探测器,红外遥控接收装置和两个电机实现在不预先知道区域形状条件下的遍历多连通区域。考虑到现实的可操作性,我们设计了共计2种算法来实现这一功能。 【项目制作与设计】 算法1:蒙特卡洛式扫地 区域形状任意,初始位置任意,在碰到障碍物或者墙壁后,随机偏转一个角度,继续前进,直至给定时间。对于不是很复杂的区域尤其是单连通区域有很高的清扫效率。 算法2:按行遍历式扫地 区域形状在x方向上为凸的,初始位置在y方向上最低处,车的行进方向与x轴同向。 算法流程: (a) (1)检测左方是否有障碍物,无则左行直至遇到障碍物,有则进入(2) (2)检测右方是否有障碍物,无则右行直至遇到障碍物 (b)遇到障碍物后,执行: (1)右方遇到障碍物,且y方向上前方无障碍,则向y方向前进一小段距离, 左转回到(a)

(2)左方遇到障碍物,且y方向上前方无障碍,则向y方向前进一小段距离,右转回到(a) (3)左或右方有障碍物,且y方向上前方有障碍物,则左转90°,把x,y轴对调,回到(a)继续执行,直至第二次遇到左或右方有障碍物,且y方向上前方有障碍物时停止。 对于在x方向上凸的多连通区域,基本可以遍历,实际操作中,要求区域尽量简单,否则多次转向累计的误差可能很大。 【项目分工】 我们小组由三人组成 顾欣玮负责小车的拼装与电路连接 冯睿蠡及葛子恒负责算法设计,以及对算法的实验修正 【感想与不足】 由于时间和经验的不足,以下诸方面没有制作完善: ●缺少相关的经验,没有充分考虑到实际情况,初始设计的许多算法在实 际运行中效果极为不理想 ●小车有时会出现不走直线的现象,这时对整个算法的实现由巨大威胁 ●没有去实现一些更为复杂的算法,主要时间花费在调试小车的各种bug 上,对adiuno的编程语言存在许多疑惑 【致谢】

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

相关文档
最新文档