当前位置:文档之家› 计算机图形学实验程序

计算机图形学实验程序

计算机图形学实验程序
计算机图形学实验程序

计算机图形学实验程序

DDA算法

#include

#include

#include

void Initial(void)

{

glClearColor(1.0f,0.0f,0.0f,1.0f);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0,300.0,0.0,400.0); }

voidDDALine(int x0,int y0,int x1,int y1,int color)

{

intdx,dy,epsl,k;

floatx,y,xIncre,yIncre;

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

x=x0;y=y0;

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

epsl=abs(dx);

elseepsl=abs(dy);

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

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

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

{

glBegin(GL_POINTS);

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

glEnd();

x+=xIncre;

y+=yIncre;

}

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

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

DDALine(0,0,600,700,23);

glFlush();

}

int main(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT _RGB); //使用双缓存及RGB模型

glutInitWindowSize(600,500);

//指定窗口的尺寸

glutInitWindowPosition(400,120); //指定窗口在屏幕的位置glutCreateWindow("DDA算法"); glutDisplayFunc(Display);

Initial();

glutMainLoop();

//启动主GLUT事件处理循环

return 0;

}

奥运五环

#include GLuintOlympicRings;

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0,400.0,0.0,300.0); }

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

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

OlympicRings=glGenLists(1);//获得一个显示列表标识

glNewList(OlympicRings,GL_COMPILE);//创建显示列表

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

glTranslatef(142.0,150.0,0.0);//沿x轴负向平移

glutSolidTorus(1,20.0,15,50);//绘制黄色环glColor3f(0.0f,1.0f,0.0f);

glTranslatef(44.0,0.0,0.0);//沿x轴正向平移

glutSolidTorus(1,20.0,15,50);//绘制绿色环

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

glTranslatef(-22.0,30.0,0.0);//沿x轴负向和y轴正向平移

glutSolidTorus(1,20.0,15,50);//绘制黑色环

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

glTranslatef(-42.0,0.0,0.0);//沿x轴负向平移

glutSolidTorus(1,20.0,15,50);//绘制蓝色环

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

glTranslatef(84.0,0.0,0.0);//沿x轴正向平移

glutSolidTorus(1,20.0,15,50);//绘制红色环

glEndList();

glCallList(OlympicRings);//调用显示列表

glFlush();

}

int main(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT _RGB);//初始化窗口的显示模式

glutInitWindowSize(400,300);

glutInitWindowPosition(100,120);

glutCreateWindow("奥运五环");

glutDisplayFunc(Display);

Initial();

glutMainLoop();

return 0;

}

多视区显示

#include

void initial(void)

{

glClearColor(1.0,1.0,1.0,1.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-10.0,10.0,-10.0,10.0);//指定二维剪裁窗口

}

void triangle(GLsizei mode)

{

if(mode==1)

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//多边形模式为线框

else

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//多边形模式为填充多边形

glBegin(GL_TRIANGLES);

glVertex2f(0.0,5.0);

glVertex2f(5.0,-5.0);

glVertex2f(-5.0,-5.0);

glEnd();

} void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,0.0,0.0);

glViewport(0,0,200,200);//指定从0,0开始,长宽均为200的视区

triangle(1);

glColor3f(0.0,0.0,1.0);

glViewport(200,0,200,200);//指定从200,0开始,长宽均为200的视区

triangle(2);glFlush();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT _RGB);

glutInitWindowPosition(100,100);

glutInitWindowSize(400,200);

glutCreateWindow("多视区");

initial();

glutDisplayFunc(Display);

glutMainLoop();

}

分子模型#include

void Initial()

{

glEnable(GL_DEPTH_TEST);

glClearColor(0.0f,0.0f,1.0f,1.0f);

}

voidChangeSize(intw,int h)

{

if(h==0) h=1;

glViewport(0,0,w,h); //设置视区尺寸

glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈

glLoadIdentity(); //重置投影矩阵

GLfloatfAspect;

fAspect=(float)w/(float)h; //计算视区的宽高比

gluPerspective(45.0,fAspect,1.0,500.0);//指定透视投影的观察空间

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void Display(void)

{

static float fElect1=0.0f; //绕原子旋转的角度

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色和深度缓冲区glMatrixMode(GL_MODELVIEW); //指定当前操作模型视图矩阵堆栈glLoadIdentity(); //重置模型视图矩阵

glTranslatef(0.0f,0.0f,-250.0f); //将图形沿Z轴负向移动

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

glutSolidSphere(12.0f,15,15); //绘制蓝色原子

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

glPushMatrix(); //保存当前的模型视图矩阵

glRotatef(fElect1,0.0f,1.0f,0.0f); //绕Y轴旋转一定的角度

glTranslatef(90.0f,0.0f,0.0f); //平移一段距离

glutSolidSphere(6.0f,15,15); //画出第一个电子

glPopMatrix(); //恢复模型视图矩阵

glPushMatrix(); //保存当前的模型视图矩阵

glRotatef(45.0f,0.0f,0.0f,1.0f);//绕Z轴旋转45度

glRotatef(fElect1,0.0f,1.0f,0.0f); //绕Y轴旋转一定的角度

glTranslatef(-70.0f,0.0f,0.0f); //平移一段距离

glutSolidSphere(6.0f,15,15); //画出第二个电子

glPopMatrix(); //恢复模型视图矩阵

glPushMatrix(); //保存当前的模型视图矩阵

glRotatef(-45.0f,0.0f,0.0f,1.0f);//绕Z轴旋转-45度

glRotatef(fElect1,0.0f,1.0f,0.0f); //绕Y轴旋转一定的角度

glTranslatef(0.0f,0.0f,60.0f); //平移一段距离

glutSolidSphere(6.0f,15,15); //画出第三个电子

glPopMatrix(); //恢复模型视图矩阵

fElect1+=10.0f;//增长旋转步长,产生动画效果

if(fElect1>360.0f) fElect1=10.0f;

glutSwapBuffers();

}

voidTimerFunc(int value)

{

glutPostRedisplay();

glutTimerFunc(100,TimerFunc,1);//100毫秒后调用定时器回调函数}

int main(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

//窗口使用RGB颜色,双缓存和深度缓存

glutInitWindowPosition(100,100);

glutInitWindowSize(400,300);

glutCreateWindow("分子动画示例");

glutReshapeFunc(ChangeSize);

glutDisplayFunc(Display);

glutTimerFunc(500,TimerFunc,1);//指定定时器回调函数

Initial();

glutMainLoop();

return 0;

}

行星运动模型

#include

staticint day = 0;

void Initial()

{

glEnable(GL_DEPTH_TEST);

glClearColor(0.0f,0.0f,0.0f,1.0f); }

void display()

{

glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75,1,1,6000); glMatrixMode(GL_MODELVIEW); glLoadIdentity();

gluLookAt(0,-2000,2000, 0,0,0, 0,0,1);

glColor3f(1,0,0);

glutSolidSphere(369,20,20);//红色太阳

glColor3f(0,0,1);//蓝色地球glRotatef(day,0,0,1);

glTranslatef(1540,0,0); glutSolidSphere(75,20,20);

glColor3f(1,1,0);//黄色月亮glRotatef(day/30.0*360 - day, 0,0,1); glTranslatef(178,0,0); glutSolidSphere(24,20,20);

glutSwapBuffers();

}

voidTimerFunc(int p)

{

day ++;

if(day >360)day = 0; glutTimerFunc(100,TimerFunc,0); glutPostRedisplay();

}

int main(intargc,char **argv) {

glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_R GB|GLUT_DEPTH);

//窗口使用RGB颜色,双缓存和深度缓存

glutInitWindowPosition(150,100); glutInitWindowSize(500,500); glutCreateWindow("行星运动模型"); glutDisplayFunc(display);

glutTimerFunc(50,TimerFunc,0);//指定定时器回调函数

Initial();

glutMainLoop();

return 0;

}

绘制简单多面体、二次及三次曲线#include

static GLsizeiiMode=1; //选定的菜单项

static GLfloatxRot=0.0f; //x方向旋转参数

static GLfloatyRot=0.0f; //y方向旋转参数

GLUquadricObj *obj; //二次曲线对象

void Initial(void)

{

glClearColor(1.0f,0.0f,0.0f,1.0f);

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

obj=gluNewQuadric(); //激活二次曲面绘制器

gluQuadricDrawStyle(obj,GLU_LINE); //以线框方式绘制二次曲面对象}

voidChangeSize(intw,int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-1.5f,1.5f,-1.5f,1.5f);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);//指定设置模型视图变换参数

glLoadIdentity();//消除以前的变换

glRotatef(xRot,1.0f,0.0f,0.0f);//绕x轴旋转图形

glRotatef(yRot,0.0f,1.0f,0.0f);//绕y轴旋转图形

switch(iMode)

{

case 1:

glutWireTetrahedron();break; //绘制线框正四面体

case 2:

glutSolidTetrahedron();break; //绘制实体正四面体

case 3:

glutWireOctahedron();break; //绘制线框正八面体

case 4:

glutSolidOctahedron();break; //绘制实体正八面体

case 5:

glutWireSphere(1.0f,15,15);break; //绘制线框球case 6:

glutSolidSphere(1.0f,15,15);break; //绘制实体球case 7:

glutWireTeapot(1.0f);break; //绘制线框茶壶case 8:

glutSolidTeapot(1.0f);break; //绘制实体茶壶case 9:

gluSphere(obj,1.0f,15,15);break; //绘制二次曲面(球) case 10:

gluCylinder(obj,1.0f,0.0f,1.0f,15,15);break;//绘制二次曲面(圆锥) case 11:

gluPartialDisk(obj,0.3f,0.8f,15,15,30.0f,260.0f);break;//绘制二次曲面(圆环) default:break;

}

glFlush();

} //处理菜单响应

voidProcessMenu(int value)

{

iMode=value;

glutPostRedisplay();

}

voidSpecialKeys(intkey,intx,int y)

{

//光标键控制图形的旋转

if(key==GLUT_KEY_UP) xRot-=5.0f;

if(key==GLUT_KEY_DOWN) xRot+=5.0f;

if(key==GLUT_KEY_LEFT) yRot-=5.0f;

if(key==GLUT_KEY_RIGHT) yRot+=5.0f;

if(xRot>356.0f) xRot=0.0f;

if(xRot<-1.0f) xRot=355.0f;

if(yRot>356.0f) yRot=0.0f;

if(yRot<-1.0f) yRot=355.0f;

glutPostRedisplay(); //窗口执行重绘操作

}

int main(intargc,char *argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //窗口使用RGB颜色和单缓存glutInitWindowSize(400,400);

glutInitWindowPosition(100,100);

glutCreateWindow("OpenGL模型绘制函数实例");

//创建菜单并定义菜单回调函数

intnGlutPolyMenu=glutCreateMenu(ProcessMenu);

glutAddMenuEntry("线框正四面体",1); //创建GLUT多面体绘制菜单

glutAddMenuEntry("实体正四面体",2);

glutAddMenuEntry("线框正八面体",3);

glutAddMenuEntry("实体正八面体",4);

intnGlutCurveMenu=glutCreateMenu(ProcessMenu);

glutAddMenuEntry("线框球体",5); //创建GLUT曲面菜单

glutAddMenuEntry("实体球体",6);

glutAddMenuEntry("线框茶壶",7);

glutAddMenuEntry("实体茶壶",8);

intnGluCurveMenu=glutCreateMenu(ProcessMenu);

glutAddMenuEntry("线框球面",9); //创建GLU曲面绘制菜单

glutAddMenuEntry("线框锥面",10);

glutAddMenuEntry("线框圆环面",11);

intnMainMenu=glutCreateMenu(ProcessMenu);//创建主菜单

glutAddSubMenu("GLUt多面体",nGlutPolyMenu);

glutAddSubMenu("GLUT曲面",nGlutCurveMenu);

glutAddSubMenu("GLU曲面",nGluCurveMenu);

glutAttachMenu(GLUT_RIGHT_BUTTON); //将主菜单与右键关联

glutDisplayFunc(Display);

glutReshapeFunc(ChangeSize);

glutSpecialFunc(SpecialKeys);

Initial();

glutMainLoop();

return 0;

矩形

#include

void Initial(void)

{

glClearColor(0.0f,0.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,1.0f); //设置当前的绘图颜色为紫色

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

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

int main(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式

glutInitWindowSize(400,300); //设置窗口的尺寸

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

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

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

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

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

return 0;

}

橡皮筋技术

#include

intiPointNum=0; //已确定点的数目

int x1=0,y1=0,x2=0,y2=0; //确定点的坐标

intwinWidth=400,winHeight=300; //窗口的宽度和高度

void Initial(void)

{

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

}

voidChangeSize(intw,int h)

{

winWidth=w; winHeight=h; //保存当前窗口的大小

glViewport(0,0,w,h); //指定窗口显示区域

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

glLoadIdentity(); //调用单位矩阵,去掉以前的投影参数设置gluOrtho2D(0.0,winWidth,0.0,winHeight); //设置投影参数

}

void Display(void)

{

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

glColor3f(0.0f,0.0f,1.0f); //指定当前的绘制颜色

if(iPointNum>=1)

{

glBegin(GL_LINES); //绘制直线段

glVertex2i(x1,y1);

glVertex2i(x2,y2);

glEnd();

}

glutSwapBuffers(); //交换缓冲区

}

voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse)

{

if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)

{

if(iPointNum==0||iPointNum==2)

{

iPointNum=1;

x1=xMouse;y1=winHeight-yMouse; //确定直线段的第一个端点

}

else

{

iPointNum=2;

x2=xMouse; y2=winHeight-yMouse; //确定直线段的第二个端点

glutPostRedisplay(); //指定窗口重新绘制

}

}

if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)

{

iPointNum=0;

glutPostRedisplay();

}

}

voidPassiveMouseMove(GLintxMouse,GLintyMouse)

{

if(iPointNum==1)

{

x2=xMouse;

y2=winHeight-yMouse; //将当前鼠标位置指定为直线的未固定端点glutPostRedisplay();

}

}

int main(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); //使用双缓存及RGB模型

glutInitWindowSize(600,500); //指定窗口的尺寸

glutInitWindowPosition(400,120); //指定窗口在屏幕的位置

glutCreateWindow("橡皮筋技术");

glutDisplayFunc(Display);

glutReshapeFunc(ChangeSize); //指定窗口再整形回调函数

glutMouseFunc(MousePlot); //指定鼠标响应函数

glutPassiveMotionFunc(PassiveMouseMove); //指定鼠标移动响应函数

Initial();

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

return 0;

}

右菜单绘制技术

#include staticGLsizeiiMode=1;

intwinWidth=400,winHeight=300; intnum=0,a[100],b[100],w1,h1,w2,h2; intiPointNum=0,x1,x2,y1,y2;

void Initial(void)

{

glClearColor(1.0f,0.0f,0.0f,1.0f);

}

voidChangeSize(intw,int h)

{

winWidth=w,winHeight=h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight); }

void Display(void)

{

GLint i;

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

if(iMode==1)

{

glBegin(GL_LINE_STRIP);

for(i=0;i

glVertex2i(a[i],b[i]);

glEnd();

glBegin(GL_LINES);

glVertex2i(w1,h1);

glVertex2i(w2,h2);

glEnd();

}

else if(iMode==2)

{

glBegin(GL_LINES);

glVertex2i(x1,y1);

glVertex2i(x2,y1);

glEnd();

glBegin(GL_LINES);

glVertex2i(x1,y1);

glVertex2i(x1,y2);

glEnd();

glBegin(GL_LINES);

glVertex2i(x2,y1);

glVertex2i(x2,y2);

glEnd();

glBegin(GL_LINES);

glVertex2i(x1,y2);

glVertex2i(x2,y2);

glEnd();

}

glutSwapBuffers();

}

voidMousePlot(GLintbutton,GLintaction,GLint xMouse,GLintyMouse)

{

if(iMode==1)

{

if(button==GLUT_LEFT_BUTTON&&action==G LUT_DOWN)

{

if(num==0)

{

w1=xMouse;h1=winHeight-yMouse;

a[num]=w1;b[num]=h1;num++;

}

else

{

w2=xMouse;h2=winHeight-yMouse;

a[num]=w2;b[num]=h2;num++;

w1=w2;h1=h2; glutPostRedisplay();

}

}

if(button==GLUT_RIGHT_BUTTON&&action== GLUT_DOWN)

{

num=0;

glutPostRedisplay();

}

}

else if(iMode==2)

{

if(button==GLUT_LEFT_BUTTON&&action==G LUT_DOWN)

{

if(iPointNum==0||iPointNum==2)

{

iPointNum=1;

x1=xMouse;y1=winHeight-yMouse;

}

else

{

iPointNum=2;

x2=xMouse;y2=winHeight-yMouse; glutPostRedisplay();

}

}

if(button==GLUT_RIGHT_BUTTON&&action== GLUT_DOWN)

{

iPointNum=0;

glutPostRedisplay();

}

}

}

voidPassiveMouseMove(GLintxMouse,GLinty Mouse)

{

if(iMode==1)

{

if(num)

{

w2=xMouse;

h2=winHeight-yMouse; glutPostRedisplay();

}

}

else if(iMode==2)

{

if(iPointNum==1)

{

x2=xMouse;

y2=winHeight-yMouse; glutPostRedisplay();

}

}

}

voidProcessMenu(int value)

{

iMode=value; glutPostRedisplay();

}

int main(intargc,char* argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_R

GB);

glutInitWindowSize(400,300);

glutInitWindowPosition(100,100);

glutCreateWindow("橡皮筋技术");

glutCreateMenu(ProcessMenu);

glutAddMenuEntry("折线",1);

glutAddMenuEntry("矩形",2);

glutAttachMenu(GLUT_RIGHT_BUTTON);

glutDisplayFunc(Display);

glutReshapeFunc(ChangeSize);

glutMouseFunc(MousePlot);

glutPassiveMotionFunc(PassiveMouseMove);

Initial();

glutMainLoop();

return 0;

}

直线反走样

#include

GLuintlineList;//指定显示列表ID

void Initial()

{

glClearColor(1.0f,0.0f,0.0f,0.0f);

glLineWidth(12.0f);//指定当前的线宽属性值

glColor4f(0.0,0.0,1.0,1.0);//用RGB模式指定当前绘图颜色lineList=glGenLists(1);//获得一个显示列表标识

glNewList(lineList,GL_COMPILE);//定义显示列表

glBegin(GL_LINE_LOOP);

glVertex2f(1.0f,1.0f);

glVertex2f(4.0f,2.0f);

glVertex2f(2.0f,5.0f);

glEnd();

glEndList();

}

voidChangeSize(GLsizeiw,GLsizei h)

{

if(h==0) h=1;

glViewport(0,0,w,h);

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

glLoadIdentity();

if(w<=h)

gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w);

else

gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,0.6);

glMatrixMode(GL_MODELVIEW);//指定设置模型视图变换参数

glLoadIdentity();

}

voidDisplayt(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glCallList(lineList);//调用显示列表

glFlush();

}

voidDisplayw(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_LINE_SMOOTH);//使用反走样

glEnable(GL_BLEND);//启用混合函数

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定混合函数

glCallList(lineList);//调用显示列表

glFlush();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(400,400);

glutCreateWindow("原始图形");//创建第一个窗口,显示原始图形

glutDisplayFunc(Displayt);

glutReshapeFunc(ChangeSize);

Initial();

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowPosition(400,100);

glutInitWindowSize(400,400);

glutCreateWindow("反走样图形");//创建第二个窗口,显示反走样处理后的图形glutDisplayFunc(Displayw);

glutReshapeFunc(ChangeSize);

Initial();

glutMainLoop();

}

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验报告 (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、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { 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++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

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

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (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

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计

《计算机图形学》课程设计报告 VC++扫雷游戏的程序设计 专业班级: 小组成员:

指导老师: 日期:2012年12月24日 1、需求分析 本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。 通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。 2.总体设计 2.1 功能概述 扫雷游戏的游戏界面如图1所示。在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。

图1 游戏开始时,系统会在雷区中随机布下若干个地雷。安放地雷的小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块 中有多少雷方块。玩家可以根据这些信息去判断是否可以鼠标点击方块, 并把认为是地雷的方块打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。 游戏规则总结: ●开始:按左键开始游戏,按按钮或菜单重新开始。 ●左键:按下时,是雷则结束,非雷则显示数字。 ●数字:代表此数字周围一圈八格中雷的个数。 ●右键:奇次按下表示雷,偶数按下表示对上次的否定。 ●结束:左键按到雷结束,找出全部雷结束。 在游戏开始后,雷区上方有两个计数器。右边的计数器显示用户扫

计算机图形学实验指导书1

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

计算机图形学基础教程实验报告

湖北民族学院信息工程学院实验报告 (数字媒体技术专业用) 班级:0312413姓名:谌敦斌学号:031241318实验成绩: 实验时间:2013年10 月14 日9、10 节实验地点:数媒实验室课程名称:计算机图形学基础教程实验类型:设计型 实验题目:直线与圆的绘制 一、实验目的 通过本次实验,熟练掌握DDA、中点、Bresenham直线绘制方法和中点、Bresenham圆的画法,能够在vc环境下独立完成实验内容,逐渐熟悉opengl的语法特点,提高程序基本绘图的能力。 二、实验环境(软件、硬件及条件) Microsoft vc++6.0 多媒体计算机 三、实验内容 1.从DDA、中点、Bresenham画线法中任选一种,完成直线的绘制。 2.从中点、Bresenham画圆法中任选一种,完成圆的绘制。 四、实验方法与步骤 打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。

程序如下 bresenham画线法: #include #include int bresenham(int x0,int y0,int x1,int y1,int color) { int x,y,dx,dy,e,i; dx=x1-x0; dy=y1-y0; e=-dx; y=y0; for(x=x0;x<=x1;x++) { putpixel(x,y,color); e+=2*dy; if(e>=0) { y++; e-=2*dx; } } return 0; } int main() { initgraph(640,480); bresenham(0,0,500,200,255); while(!kbhit()) { } closegraph(); return 0; } Bresenham画圆法: #include #include int circlepoints(int x,int y,int color) { putpixel(255+x,255+y,color); putpixel(255+y,255+x,color); putpixel(255-x,255+y,color);

计算机图形学实验三报告

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

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

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

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 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

计算机图形学课设(含所有程序图文)

计算机图形学课程设计报告 系(院):计算机科学学院 专业班级:信计11102 姓名:吴家兴 学号:201106262 指导教师:严圣华 设计时间:2014.6.16 - 2014.6.26 设计地点:10教机房

(此处目录根据自己情况可以调整改动) 一、课程设计目的 ................................................. 错误!未定义书签。 二、课程设计具体要求..................................... 错误!未定义书签。 三、需求分析与总体设计 ..................................... 错误!未定义书签。 四、详细设计与实现[含关键代码和实现界面] ... 错误!未定义书签。 五、小结......................................................................................... 错误!未定义书签。 一、课程设计目的 计算机图形学课程设计是验证、巩固和补充课堂讲授的理论知识的必要环节,通过上机实验,培养学生的自学能力、动手能力、综合运用知识解决实际问题的能力。要求学生运用计算机图形学理论与技术设计、编写、调试程序并撰写课程设计报告。 二、课程设计具体要求 1.独立完成设计并撰写课程设计报告。 2.在规定时间将程序和设计报告用附件(信计111X班XXX 图形学课设报告.RAR)发送到274548837@https://www.doczj.com/doc/b715515575.html,,并上交纸质打印稿(A4纸10页左右)。 3. 课程设计报告内容包括: (1)列出设计者姓名及本人详细信息、所用开发工具; (2)程序的基本功能介绍; (3)程序实现步骤和关键算法的理论介绍; (4)关键源代码实现说明。(不要打印全部源程序!) (5)程序运行界面截图(3幅左右) (6)课设总结和自我评价。 4.《计算机图形学》课程的知识结构体系: (1)课设为期两周:总学时为40学时,2学分 (2)学生必须完成二维线画图元和二维填充图元两个大功能。二维裁剪和二维图形变换至少实现两个内容。总共不少于10个算法。 (3)程序应做到:通用性、交互性、界面友好性!

计算机图形学 图形的几何变换的实现算法教程文件

计算机图形学图形的几何变换的实现算 法

实验二 图形的几何变换的实现算法 班级 08信计 学号 59 姓名 分数 一、实验目的和要求: 1、掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;。 2、掌握OpenGL 中模型变换函数,实现简单的动画技术。 3、学习使用OpenGL 生成基本图形。 4、巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可由简单图形得到复杂图形。加深对变换矩阵算法的理解。 编制利用旋转变换绘制齿轮的程序。编程实现变换矩阵算法,绘制给出形体的三视图。调试程序及分析运行结果。要求每位学生独立完成该实验,并上传实验报告。 二、实验原理和内容: . 原理: 图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。 图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。 图像几何变换的一般表达式:[,][(,),(,)]u v X x y Y x y = ,其中,[,]u v 为变换后图像像素的笛卡尔坐标, [,]x y 为原始图像中像素的笛卡尔坐标。这样就得到了原始图像与变换后图像的像素的对应关系。 平移变换:若图像像素点 (,)x y 平移到 00(,)x x y y ++,则变换函数为 0(,)u X x y x x ==+, 0(,)v Y x y y y ==+,写成矩阵表达式为: 00x u x y v y ??????=+???????????? 其中,x 0和y 0分别为x 和y 的坐标平移量。 比例缩放:若图像坐标 (,)x y 缩放到( ,x y s s )倍,则变换函数为:

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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; }

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号: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;

计算机图形学

1、名词解释:直接设备、间接设备、绝对坐标设备、相对坐标设备、离散设备、连续设备、 回显、约束、网格、引力域、橡皮筋技术、草拟技术、拖动、旋转、形变。 1)直接设备:直接设备指诸如触摸屏一类用户可直接用手指指点屏幕进行操作从而实 现定位的设备。 2)间接设备:指诸如鼠标、操纵杆等用户通过移动屏幕上的光标实现定位的设备。 3)绝对坐标设备:绝对坐标设备包括数字化仪和触摸屏,它们都有绝对原点,定位坐标 相对原点来确定。绝对坐标设备可以改成相对坐标设备,如数字化仪,只要记录当前点位置与前一点位置的坐标差(增量),并将前一点看成是坐标原点,则数字化仪的定位范围也可变成无限大。 4)相对坐标设备:相对坐标设备可指定的范围可以任意大,然而只有绝对坐标设备才能 作为数字化绘图设备。 5)离散设备:键控光标则为离散设备。使用离散设备也难以实现精确定位。 6)连续设备:把手的连续运动变成光标的连续移动,鼠标、操纵杆、数字化仪等均为此 类设备。连续设备比离散设备更自然、更快、更容易用,且在不同方向上运动的自由度比离散设备大。使用离散设备也难以实现精确定位。 7)回显:回显作为一种最直接的辅助方式,大部分交互式绘图过程都要求回显。比如 在定位时,用户不仅要求所选的位置可在屏幕上显示出来,还希望其数据参数也在屏幕上显示,这样可以获得精确位置来调整定位坐标。在选择、拾取等过程中,用户也都希望能够直观地看到选择或拾取的对象以便确认。 8)约束:约束是在图形绘制过程中对图形的方向、对齐方式等进行规定和校准。约束 方式有多种,最常用的约束是水平或垂直直线约束,使用户可以轻松地绘制水平和垂直线而不必担心线的末端坐标的精度范围。另外,其他类型的约束技术用于产生

计算机图形学实验一_画直线

大学实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

如果 d<0,则M在理想直线下方,选右上方P1点; 如果 d=0,则M在理想直线上,选P1/ P2点。 由于d是xi和yi的线性函数,可采用增量计算提高运算效率。 1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为: d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a= d old-dy 2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为 d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a+b= d old-dy+dx 在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。 为了消除d的分数,重新定义 F(x,y)=2(ax+by+c) 则每一步需要计算的d new 是简单的整数加法 dy=y1-y0,dx=x1-x0 d0=-2dy+dx d new=d old-2*dy,当 d old>=0 d new=d old-2(dy-dx),当d old<0 Bresenham画线算法 算法原理: 与DDA算法 相似,Bresenham 画线算法也要在 每列象素中找到 与理想直线最逼 近的象素点。 根据直线的 斜率来确定变量 在x或y方向递 增一个单位。另 一个方向y或x

计算机图形学显示变换算法具体程序实现

数学与软件科学学院实验报告 学期:___2010 至_2011 第__一__ 学期2010年12月21日课程名称:____计算机图形学 _____ 专业:__信息与计算科学_ 2007级_5_班实验编号: 07 实验项目_____显示变换__ 指导教师__庞朝阳_ 姓名:学号: 20070605 __ 实验成绩:_____ 实验目的: (1) 了解掌握显示变换的相关知识,知道什么是平行投影和透视投影; 实验内容: (1) 知道显示变换是什么; (2) 掌握平行投影变换; (3) 掌握透视投影变换; (4) 编写并执行简单的Prolog程序,并熟悉测试或调试的方法。 实验步骤: (1)显示变换 三维空间中的物体要在二维的屏幕显示出来,必须通过投影的方式把三维物体转换成二维的平面图形。投影的方式有平行投影,透视投影。 平行投影变换 (2)平行投影变换 平行投影可根据投影方向与投影面的夹角分为:正投影和斜投影。当投影方向与投影面垂直时,为正投影;否则为斜投影。 A.正投影 1.假设投影平面垂直于Z轴,且位于Z=Z0外,则在视坐标系中任意一点 (X,Y,Z)的投影是过该点的投影线与投影平面的交点,如下图: P(x,y,z) p`(x`,y`,z`) Z0 Z 则空间点的坐标与投影坐标间关系为: x`=x , y`=y , z`=z 即 ` ` ` 1 x y z = 000 0100 0000 0001 Z . 1 x y z 2.

`` ` 1 x y z = 1000010000000001 . 1 x y z 即平面投影的变换矩阵为: Mz (平)= 10000 100 00000 1 同理可得: 在y0z 平面的投影变换矩阵为: Mx(平) = 00000 10000000001 在x0z 平面的投影变换矩阵为: My(平) = 10000 00000100 2.斜投影 如下图 求空间中任意一点D (x,y,z )在斜面ABC 上的投影。 Step1:确定一定Q,并过P 作斜面的法向量n 。 X Z Y A C B P

计算机图形学实验指导书

计算机图形学实验指导书 授课教师:臧辉 适用专业:计算机学院计算机科学技术 使用班级: 12软件工程 授课时间:2015春季 授课学时:40/30/10学时 使用教材:计算机图形学教程 王汝传编著 人民邮电出版社,2009年版 湖北理工学院计算机学院

实验教学进度表

实验一直线段的生成算法 一、实验目的及要求 1、掌握Bresenham算法的原理; 2、熟悉Bresenham算法的具体c语言实现; 3、掌握dda算法的原理; 4、熟悉dda算法的具体c语言实现。 二、实验学时 4学时 三、实验任务 1、Bresenham算法的c语言实现 2、DDA算法的c语言实现 四、实验重点、难点 对Bresenham算法的原理以及c语言程序的具体实现 (一)Bresenham算法的实现 #include #include #include #include void Bresenham_line(int x0,int y0,int x1,int y1,int color) { 具体代码根据书上算法2.1.6改写 } Void main() { int gdriver = DETECT, gmode, errorcode; char msg[80]; initgraph(&gdriver, &gmode, "");//初始化图形和局部变量Bresenham_line(100,100,300,300,5); Getch(); Closegraph(); } (二)DDA算法的实现 #include #include #include #include void DDAline(int x0,int y0,int x1,int y1,int color) { 根据书上算法2.1-2改写 } void main() { int gdriver = DETECT, gmode;

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