计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx

上传人:b****6 文档编号:19084609 上传时间:2023-01-03 格式:DOCX 页数:15 大小:17.34KB
下载 相关 举报
计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx_第1页
第1页 / 共15页
计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx_第2页
第2页 / 共15页
计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx_第3页
第3页 / 共15页
计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx_第4页
第4页 / 共15页
计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx

《计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

计算机图形学Bresenham完整算法画直线椭圆和圆Word下载.docx

}

glEnd();

}

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

voidputpixel(GLsizeix,GLsizeiy)

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

///////////////////////////////////////////////////////////////////

//DDA画线算法//

////

////

////

///////////////////////////////////////////////////////////////////

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;

}

//中点Bresenham算法画直线(0<

=k<

=1)//

////

////

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

中点Bresenham算法画直线各点坐标及判别式的值\n"

//画线算法的实现

GLsizeip=0;

GLfloatUpIncre,DownIncre,x,y,d,k,dx,dy;

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;

k=dy/dx;

if(k>

=0&

&

k<

=1){

d=dx-2*dy;

UpIncre=2*dx-2*dy;

DownIncre=-2*dy;

while(x<

=x1){

putpixel(x,y);

if(p>

x=%d,y=%d\n"

x,y);

p++;

x++;

if(d<

0){

y++;

d+=UpIncre;

elsed+=DownIncre;

1){

d=dy-2*dx;

UpIncre=2*dy-2*dx;

DownIncre=-2*dx;

while(y<

=y1){

break;

y++;

if(d<

x++;

elsed+=DownIncre;

if(k<

0&

k>

=-1){

UpIncre=-2*dy;

DownIncre=-2*dx-2*dy;

if(d>

y--;

d+=DownIncre;

elsed+=UpIncre;

-1){

d=-dy-2*dx;

UpIncre=-2*dx-2*dy;

while(y>

y--;

 

//改进的Bresenham算法画直线(0<

////

//x1,y1终点坐标//

////

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

GLsizeix,y,dx,dy,e,k;

改进的Bresenham算法画直线各点坐标及判别式的值\n"

=1){

e=-dx;

x=x0;

e=e+2*dy;

if(e>

e=e-2*dx;

1){

e=-dy;

e=e+2*dx;

0){

e=e-2*dy;

if(e<

/////////////////////////////////////////////////////////

//Bresenham算法画圆//

////

////

voidCirclePoint(GLsizeix,GLsizeiy)

{putpixel(x,y);

putpixel(x,-y);

putpixel(y,-x);

putpixel(-y,-x);

putpixel(-x,-y);

putpixel(-x,y);

putpixel(-y,x);

putpixel(y,x);

voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum)

GLsizeid;

x=0;

y=R;

d=1-R;

Bresenham算法画圆:

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

=y){

CirclePoint(x,y);

if(x>

printf("

x=%d,y=%d,d=%d\n"

x,y,d);

break;

0)d+=2*x+3;

else{

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

y--;

voidBresenham2Circle(GLsizeia,GLsizeib,GLsizeinum)

if(num==1)

Bresenham算法画椭圆:

GLsizeix,y;

floatd1,d2;

y=b;

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

putpixel(x,-y);

while(b*b*(x+1)<

a*a*(y-0.5)){

if(x>

x=%d,y=%d,d1=%d\n"

x,y,d1);

if(d1<

=0){

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

x++;

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

y--;

}//while上半部分

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

x=%d,y=%d,d2=%d\n"

x,y,d2);

if(d2<

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

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

//初始化窗口

voidInitial(void)

//设置窗口颜色为蓝色

glClearColor(0.0f,0.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(-250.0f,250.0f,-250.0f,250.0f*h/w,1.0,-1.0);

else

glOrtho(-250.0f,250.0f*w/h,-250.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);

case2:

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

case3:

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

case4:

BresenhamCircle(0,0,20,m_PointNumber);

case5:

Bresenham2Circle(10,8,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;

5'

)m_DrawMode=5;

m_PointNumber=0;

//voidmain(void)

intmain(intargc,char*argv[])

glutInit(&

argc,argv);

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

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(600,600);

glutInitWindowPosition(100,100);

glutCreateWindow("

基本图元绘制程序);

glutDisplayFunc(ReDraw);

glutReshapeFunc(ChangeSize);

glutKeyboardFunc(Keyboard);

//键盘响应回调函数

glutTimerFunc(500,TimerFunc,1);

//窗口初始化

Initial();

glutMainLoop();

//启动事件处理循环

return0;

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

当前位置:首页 > 自然科学

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

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