计算机图形学上机报告Word文件下载.docx

上传人:b****2 文档编号:13684881 上传时间:2022-10-12 格式:DOCX 页数:17 大小:121.81KB
下载 相关 举报
计算机图形学上机报告Word文件下载.docx_第1页
第1页 / 共17页
计算机图形学上机报告Word文件下载.docx_第2页
第2页 / 共17页
计算机图形学上机报告Word文件下载.docx_第3页
第3页 / 共17页
计算机图形学上机报告Word文件下载.docx_第4页
第4页 / 共17页
计算机图形学上机报告Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

计算机图形学上机报告Word文件下载.docx

《计算机图形学上机报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学上机报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

计算机图形学上机报告Word文件下载.docx

1.DDA算法画直线

2.中点Bresenham算法画直线

3.改进Bresenham算法画直线

4.Bresenham算法画圆

四.源程序

#include<

windows.h>

gl/glut.h>

#include"

stdio.h"

intm_PointNumber=0;

//动画时绘制点的数目

intm_DrawMode=4;

//绘制模式1DDA算法画直线

//2中点Bresenham算法画直线

//3改进Bresenham算法画直线

//4八分法绘制圆

//5四分法绘制椭圆

//绘制坐标线

voidDrawCordinateLine(void)

{

inti=0;

//坐标线为黑色

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

glBegin(GL_LINES);

for(i=10;

i<

=250;

i=i+10)

{

glVertex2f((float)(i),0.0f);

glVertex2f((float)(i),250.0f);

glVertex2f(0.0f,(float)(i));

glVertex2f(250.0f,(float)(i));

}

glEnd();

}

//绘制一个点,这里用一个正方形表示一个点。

voidputpixel(GLsizeix,GLsizeiy)

glRectf(10*x,10*y,10*x+10,10*y+10);

voidDDACreateLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum)

//设置颜色

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

//对画线动画进行控制

if(num==1)

printf("

DDA画线算法:

各点坐标\n"

);

elseif(num==0)

return;

//画线算法的实现

GLsizeidx,dy,epsl,k;

GLfloatx,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/epsl;

yIncre=(float)dy/epsl;

for(k=0;

k<

=epsl;

k++){

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

if(k>

=num-1){

printf("

x=%f,y=%f,取整后x=%d,y=%d\n"

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

break;

x+=xIncre;

y+=yIncre;

if(x>

=25||y>

=25)break;

}

voidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum)

中点Bresenham算法画直线:

各点坐标及判别式的值\n"

GLsizeidx,dy,d,UpIncre,DownIncre,x,y,xend=0;

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){

putpixel(x,y);

if(x>

x++;

if(d<

0){

y++;

d+=UpIncre;

elsed+=DownIncre;

=50||y>

=50)break;

voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum)

改进的Bresenham算法画直线:

GLsizeix,y,dx,dy,e;

dy=y1-y0;

e=-dx;

x=x0;

}

e=e+2*dy;

if(e>

e=e-2*dx;

voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeir,GLsizeinum)

Bresenham算法画圆:

x=0,y=r;

GLsizeid=1-r;

y){

=num){

putpixel(y,x);

putpixel(-y,x);

putpixel(-x,y);

putpixel(-x,-y);

putpixel(-y,-x);

putpixel(y,-x);

putpixel(x,-y);

0)d+=2*x+3;

else{

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

y--;

//初始化窗口

voidInitial(void)

//设置窗口颜色为蓝色

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

//窗口大小改变时调用的登记函数

voidChangeSize(GLsizeiw,GLsizeih)

if(h==0)h=1;

//设置视区尺寸

glViewport(0,0,w,h);

//重置坐标系统

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//建立修剪空间的范围

if(w<

=h)

glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.0);

else

glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0,-1.0);

//在窗口中绘制图形

voidReDraw(void)

//用当前背景色填充窗口

glClear(GL_COLOR_BUFFER_BIT);

//画出坐标线

DrawCordinateLine();

switch(m_DrawMode)

{

case1:

DDACreateLine(0,0,20,15,m_PointNumber);

break;

case2:

BresenhamLine(0,0,20,15,m_PointNumber);

case3:

Bresenham2Line(1,1,8,6,m_PointNumber);

case4:

BresenhamCircle(5,5,18,m_PointNumber);

default:

glFlush();

//设置时间回调函数

voidTimerFunc(intvalue)

if(m_PointNumber==0)

value=1;

m_PointNumber=value;

glutPostRedisplay();

glutTimerFunc(500,TimerFunc,value+1);

//设置键盘回调函数

voidKeyboard(unsignedcharkey,intx,inty)

if(key=='

1'

)m_DrawMode=1;

2'

)m_DrawMode=2;

3'

)m_DrawMode=3;

4'

)m_DrawMode=4;

m_PointNumber=0;

//voidmain(void)

intmain(intargc,char*argv[])

glutInit(&

argc,argv);

//初始化GLUT库OpenGL窗口的显示模式

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(800,600);

glutInitWindowPosition(100,100);

glutCreateWindow("

基本图元绘制程序"

glutDisplayFunc(ReDraw);

glutReshapeFunc(ChangeSize);

glutKeyboardFunc(Ke

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1