Bresenham算法实现

来源:互联网 发布:小学生近视数据 编辑:程序博客网 时间:2024/06/08 02:53

Bresenham算法的实现

记录Bresenham算法的实现。

</pre><p></p><p>实现的环境是windows7和VS2015。vs的opengl配置可以看这里:http://blog.csdn.net/baidu_27962861/article/details/52826829</p><p>没有调用绘点函数,所以每种情况都有绘点的部分。</p><p>一共有五种情况,分别是斜率0<k<1,k>1,-1<k<0,k<-1,k不存在。其中k>1和k<-1合并为一种情况,k的绝对值大于1,步长取y。0<k<1和-1<k<0合并为一种情况,k绝对值值在0和1之间;还有就是斜率不存在的情况,步长取y。</p><p>算法思路完全参照《计算机图形学及其实践教程》中Bresenham算法的伪代码实现。</p><p>display函数调用了Bresenham函数,Bresenham函数中实现了绘点和x,y的变化。没有输入;输出是在display中的Bresenham调用的参数输出的多条直线,斜率分别是0,1/2,1,2;-1,-1/2,-2;0和不存在的情况。</p><p>经过测试,程序可以在我的环境中正确运行。</p><p>代码如下:</p><p><pre name="code" class="cpp">#include "stdafx.h"#include "GL/glut.h"#include<cmath>int winWidth = 500, winHeight = 500;//窗口大小void init(){    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluOrtho2D(0, winWidth, 0, winHeight);}void Bresenham(int x1, int y1, int x2, int y2){    float dx, dy, h, x, y;    x = x1;  y = y1;//用于递增    glPointSize(2.0);    glBegin(GL_POINTS);    glVertex2f(x, y);    glEnd();    dx = abs(x1 - x2); dy = abs(y1 - y2);    bool isAbsluteSlopeBetweenZeroToOne = (dy <= dx && dy != 0) && (dx != 0);//斜率绝对值0->1    bool isAbsluteSlopeBiggerThanOne = (dy > dx) && ((dy != 0) && (dx != 0));//斜率绝对值 > 1    bool isSlopeIsZeroOrNoEixsts = (dx == 0) || (dy == 0);//斜率不存在或者为零    if (isAbsluteSlopeBetweenZeroToOne) {        h = 2 * dy - dx;        while ((x1 < x2 && x < x2) || (x1 > x2 && x > x2)) {            glPointSize(2.0);            glBegin(GL_POINTS);            if (h < 0) {                h += 2 * dy;            }else{                h += 2 * (dy - dx);                if (y1 < y2) {                    y++;                }else {                    y--;                }            }            glVertex2f(x, y);            glEnd();            //区分正负,步长取x            if (x1 < x2) {                x++;            }else {                x--;            }        }    }    else if (isAbsluteSlopeBiggerThanOne) {        h = 2 * dx - dy;        while ((x1 < x2 && x < x2) || (x1 > x2 && x > x2)) {            glPointSize(2.0);            glBegin(GL_POINTS);            if (h < 0) {                h += 2 * dx;            }else{                h += 2 * (dx - dy);                if (x1 < x2) {                    x++;                }else {                    x--;                }            }            glVertex2f(x, y);            glEnd();            //区分正负,步长取y            if (y1 < y2) {                y++;            }else {                y--;            }        }    }    else if(isSlopeIsZeroOrNoEixsts) {        x = x1;  y = y1;        if (dx == 0) {            if (y1 < y2) {                while (y < y2) {                    glPointSize(2.0);                    glBegin(GL_POINTS);                    glVertex2f(x, y);                    glEnd();                    y++;                }            }else {                while (y > y2) {                    glPointSize(2.0);                    glBegin(GL_POINTS);                    glVertex2f(x, y);                    glEnd();                    y--;                }            }        }        else {            if (x1 < x2) {                while (x < x2) {                    x++;                    glPointSize(2.0);                    glBegin(GL_POINTS);                    glVertex2f(x, y);                    glEnd();                }            }else {                while (x > x2) {                    x--;                    glPointSize(2.0);                    glBegin(GL_POINTS);                    glVertex2f(x, y);                    glEnd();                }            }        }        }    else {        //do nothing    }}void display(){    glClearColor(1.0, 1.0, 1.0, 0.0);    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(0.0, 0.0, 0.0);    Bresenham(0, 0, 500, 250);//k = 1 / 2    Bresenham(0, 0, 250, 500);//k = 2    Bresenham(0, 500, 250, 0);//k = -2    Bresenham(0, 500, 500, 250);//k = -1 / 2    Bresenham(250, 0, 250, 500);//k 不存在,y = 250    Bresenham(0, 250, 500, 250);//k = 0,x = 250    Bresenham(0, 0, 500, 500);//k = 1    Bresenham(0, 500, 500, 0);//k = -1        glFlush();}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitWindowPosition(100, 100);    glutInitWindowSize(winWidth, winHeight);    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    glutCreateWindow("Bresenham_Line");    init();    glutDisplayFunc(display);    glutMainLoop();    return 0;}


0 0
原创粉丝点击