Bresenham算法

  1 /*************************************************************
  2      pb-图形学题2
  3      Bresenham算法
  4      用Bresenham算法画出0<k<1区间的直线,再对称到其它所有k
  5      斜率的直线
  6
  7 *************************************************************/
  8
  9
 10 #include <GL/glut.h>
 11 #include<cstdio>
 12 #include<cmath>
 13
 14 int x,y,endx,endy,p;
 15
 16 void init()
 17 {
 18     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //什么单缓存的东西,现在不懂什么意思,就当通用条件
 19     glutInitWindowPosition(100, 100);                            //图片出现的位置
 20     glutInitWindowSize(400, 300);                                //图片的长和宽
 21     glutCreateWindow("pb-图形学题1");                            //图片的名字
 22
 23     glClearColor(0.0, 0.0, 0.0, 0.0);
 24     glMatrixMode(GL_PROJECTION);
 25     gluOrtho2D(-10000, 10000, -10000, 10000);
 26
 27     glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
 28     glClear(GL_COLOR_BUFFER_BIT);
 29     glColor3f(1.0, 0.0, 0.0);                                    //线的颜色
 30 }
 31
 32
 33 void setPixel (GLint x,GLint y,GLint nx,GLint ny)               //描点函数,表示从x,y到nx,ny的矩形全部涂色
 34 {
 35     glBegin(GL_LINES);
 36        glVertex2i(x, y);
 37        glVertex2i(nx,ny);
 38     glEnd();
 39 }
 40
 41 //交换坐标。
 42 void swap(int &x,int &y)
 43 {
 44     x^=y;
 45     y^=x;
 46     x^=y;
 47 }
 48
 49
 50 //求k得范围,p=1表示 0<k<1; p=2表示 k>1; p=3 表示 -1<k<0; p=4表示 k<-1;
 51 //并把初始坐标映射的0<k<1。
 52 void Spoint()
 53 {
 54    if ((endx-x)*(endy-y)>0)
 55     {
 56         if (abs(endx-x)-abs(endy-y)>=0) p=1;
 57         else
 58         {
 59             p=2;
 60             swap(x,y);
 61             swap(endx,endy);
 62         }
 63     }
 64     else
 65     {
 66            if (abs(endx-x)-abs(endy-y)>=0)
 67            {
 68                p=3;
 69                y=-y;
 70                endy=-endy;
 71            }
 72            else
 73            {
 74                p=4;
 75                x=-x;
 76                endx=-endx;
 77                swap(x,y);
 78                swap(endx,endy);
 79            }
 80     }
 81 }
 82
 83
 84 //根据k判断对称范围,再描点。
 85 void setpoint(int x0,int y0,int x1,int y1)
 86 {
 87     if (p==1) setPixel (x0,y0,x1,y1);
 88     if (p==2) setPixel (y0,x0,y1,x1);
 89     if (p==3) setPixel (x0,-y0,x1,-y1);
 90     if (p==4) setPixel (-y0,x0,-y1,x1);
 91 }
 92
 93 //Bresenham算法。
 94 void myDisplay(void)
 95 {
 96
 97     int dx=abs(x-endx),dy=abs(y-endy);
 98     int d=2*dy-dx;
 99     int tdy=2*dy,tdx=2*(dy-dx);
100     if (x>endx)
101     {
102         swap(x,endx);
103         swap(y,endy);
104     }
105     int x0=x,y0=y;
106     while (x<endx)
107     {
108     //    printf("****%d***%d\n",x,y);
109         x0=x+1;
110         if (d<0)
111         {
112             y0=y;
113             d+=tdy;
114         }
115         else
116         {
117             y0=y+1;
118             d+=tdx;
119         }
120         setpoint(x,y,x0,y0);
121         x=x0;
122         y=y0;
123     }
124     glFlush();                                                   //不知道什么东西,一定要写。
125  }
126
127
128
129  int main(int argc, char *argv[])
130  {
131      glutInit(&argc, argv);
132      printf("请输入直线的起始点坐标,结束坐标:\n");
133      scanf("%d%d%d%d",&x,&y,&endx,&endy);
134      Spoint();
135      init();                                                     //初始化数据
136      glutDisplayFunc(&myDisplay);                                //调用函数
137      glutMainLoop();                                             //开始程序
138      return 0;
139  }
时间: 2024-08-24 23:19:08

Bresenham算法的相关文章

OpenGL光栅化作业:【bresenham算法】GL_POINTS为基础画线段

首先来看一下题目要求: 2.2 Draw a Line Implement your line rasterization algorithm in OpenGL. You can only use integer arithmetic in your code. Input: 2 2D points, that makes 4 integers, as a start point and an end point Output: A straight line in a window You

Bresenham算法画填充圆及SDL代码实现

画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯属浪费.下面介绍的Bresenham算法就是根据上文的原理设计.该算法原应用于直线的绘制,但由于圆的八分对称性,该算法也适用与圆(曲线图形)的绘制. 该算法主要是这样的原理:找出一个1/8的圆弧,用快速的增量计算找出下一个点.同时利用圆的八分对称性,找出8个点(包括该点),进行绘制. 这里给出示例的

中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!

中点Bresenham算法光栅化画直线,每次只位移一个像素,精度高!此源码借助直线 y=x 做了一些转换,简化了主位移的处理,每次移动只需要 加减操作, 不需要乘除!速度极快!! 原理在最后,下面先贴上核心代码~ void Bresenham_LineTo(CDC *pDC, int x1, int y1, int x2, int y2) //中点Bresenham算法光栅化画直线 { float k = 1.0*(y2 - y1) / (x2 - x1); //斜率 int flag = 0;

「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?

前言 博主目前在学习<计算机图形学基础>这本书,使用的是第二版. 此书第五章开始讲解基本图形生成算法. 在5.1.3 Bresenham算法中,如是写到: 虽然中点Bresenham算法是一种效率非常高的算法,但也还有改进的余地. 而后,开始介绍Bresenham算法. 思考 然而通过学习和理解,博主发现这两种算法的原理完全相同: 每次在最大位移方向上走一步,而另一个方向上走步还是不走步取决于误差项的判别. 于是博主产生了疑问: Bresenham算法真的改进了中点Bresenham算法吗?

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y

《图形学》实验七:中点Bresenham算法画椭圆

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: 1 #include <gl/glut.h> 2 3 #define WIDTH 500 4 #define HEIGHT 500 5 #define OFFSET 15 //偏移量,偏移到原点 6 #define A 6 7 #define B 5 8 9 void Init() //其它初始化 10 { 11 glClearColor(1.0f,1.0f,1.0f,1.0f);

《图形学》实验六:中点Bresenham算法画圆

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: 1 #include <gl/glut.h> 2 3 #define WIDTH 500 4 #define HEIGHT 500 5 #define OFFSET 15 6 #define R 8 7 8 void Init() //其它初始化 9 { 10 glClearColor(1.0f,1.0f,1.0f,1.0f); //设置背景颜色,完全不透明 11 glColor3f

《图形学》实验五:改进的Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE ProBresenham(100,100,400,400); //画直线 8 9 #pr

《图形学》实验四:中点Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线 8