OpenGL绘制直线和圆(中点法)

来源:互联网 发布:js日期选择器插件 编辑:程序博客网 时间:2024/05/20 22:04
#include <gl/glut.h>#include <math.h>static  int i=1;void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f);      //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);    //指定设置投影参数gluOrtho2D(-200.0,200.0,-200.0,200.0); //设置投影参数  //指的是视图范围,如果(0,200,0,200)的话就只能在第一象限显示,就1/4圆,第1,3的参数是左下角坐标,第2,4的参数是右上角坐标}/*void Display(void){glClear(GL_COLOR_BUFFER_BIT);   //用当前背景色填充窗口glColor3f(1.0f, 0.0f, 0.0f);            //设置当前的绘图颜色为红色glRectf(50.0f, 100.0f, 150.0f, 50.0f);    //绘制一个矩形             glFlush();                         //处理所有的OpenGL程序}*/void DDALine(int x0,int y0,int x1,int y1){//glVertex2f(10,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);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;glPointSize(2);glBegin(GL_POINTS);for(k = 0;k <= epsl; k++){glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(int(x+0.5),int(y+0.5));x += xIncre;y += yIncre;}glEnd();}void Mid_B(int x0,int y0,int x1,int y1){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;glPointSize(2);glBegin(GL_POINTS);while(x <= x1){glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(x,y);x++;if(d < 0){y++;d += UpIncre;}elsed += DownIncre;}glEnd();}void G_B(int x0,int y0,int x1,int y1){int x,y,dx,dy,e;dx = x1 - x0;dy = y1 - y0;e =- dx;x=x0;y=y0;glPointSize(2);glBegin(GL_POINTS);while(x <= x1){glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(x,y);x++;e = e + 2*dy;if(e > 0){y++;e = e - 2*dx;}}glEnd();}void CirclePoint(int x, int y){glPointSize(2);glBegin(GL_POINTS);glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(x,y);glVertex2f(y,x);glVertex2f(-y,x);glVertex2f(-x,y);glVertex2f(-x,-y);glVertex2f(-y,-x);glVertex2f(y,-x);glVertex2f(x,-y);glEnd();}void MidBresenhamCircle(int r){int x = 0, y = r, d = 1-r;//glPointSize(2);//glBegin(GL_POINTS);while(x <= y){CirclePoint(x,y);if(d < 0)d += 2*x+3;else{d += 2*(x-y)+5;y--;}x++;}glEnd();}void ProcessMenu(int value){i = value;  glutPostRedisplay();}void Display(void){glClear(GL_COLOR_BUFFER_BIT);   //用当前背景色填充窗口glViewport(0,0,400,400); //前两个参数改变原点坐标,后两个参数改变图形长宽(放大缩小)switch(i){case 1:DDALine(2,3,55,83);break;case 2:Mid_B(2,3,55,83);break;case 3:G_B(2,3,55,83);break;case 4:MidBresenhamCircle(50);break;}glFlush(); }int main(int argc, char* argv[]){glutInit(&argc, argv); //初始化GLUT库,处理命令行参数 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口的显示模式glutInitWindowSize(400,400);              //设置窗口的尺寸glutInitWindowPosition(100,100);       //设置窗口的位置glutCreateWindow("直线");                 //创建一个名为矩形的窗口int MainMenu = glutCreateMenu(ProcessMenu);  //创建主菜单glutAddMenuEntry("DDA算法",1);glutAddMenuEntry("中点Bresenham算法",2);glutAddMenuEntry("改进的Bresenham算法",3);glutAddMenuEntry("中点bresenham画圆",4);glutAttachMenu(GLUT_RIGHT_BUTTON);glutDisplayFunc(Display);     //设置当前窗口的显示回调函数Initial();                                    //完成窗口初始化glutMainLoop();                     //启动主GLUT事件处理循环return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕六个月反胃酸怎么办 怀孕三个月胃酸吐酸水怎么办 孕六个月胃难受怎么办 孕6个月胃酸厉害怎么办 孕妇6个月胃酸怎么办 孕早期胎盘早剥怎么办 孕妇晕车怎么办最有效方法 怀孕了受凉胃疼怎么办 怀孕4个月胎位低怎么办 6个月胎位低怎么办 7个多月了胎位低怎么办 瑜伽按摩球破了怎么办 孕妇吐完胸口疼怎么办 孕25周胸口堵怎么办呢 孕期没做过产检怎么办 宝宝的泪囊堵塞怎么办 瑜伽球塞子丢了怎么办 瑜伽球塞子没了怎么办 练阴瑜伽是想睡怎么办 肠道引流拨断了怎么办 瑜伽动作做不到位怎么办 胃肠吸收不好一直长不胖怎么办 小孩把泡泡糖吞进肚子怎么办 练习瑜伽又?带硬怎么办 天气太热没有空调怎么办 腹股沟岔气怎么办才能快点好 瑜伽馆不给退卡怎么办 膝盖总是凉凉的怎么办 练阴瑜伽腿麻怎么办 瑜伽垫在地板滑怎么办 艾灸后后背发凉怎么办 床上老是有小蜈蚣怎么办 早晚出去胳膊脚觉得凉怎么办 腿凉感觉冒凉气怎么办 冬天腿被冻夏天发酸发凉怎么办 宿舍一楼虫子多怎么办 有虫子在咬床板怎么办 床板上的虫咬了怎么办 住的房间有臭虫怎么办 租的房子有臭虫怎么办 瑜伽垫放地上脏怎么办