计算机图形学上机报告Word文件下载.docx
- 文档编号:13684881
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:17
- 大小:121.81KB
计算机图形学上机报告Word文件下载.docx
《计算机图形学上机报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学上机报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 上机 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)