您的位置:首页 > 其它

Bresenham算法画直线

2017-02-28 20:30 686 查看
本博客仅限于斜率在0~1之间的直线

原算法

设直线起始点坐标为(xs,ys),均为整数,即

x1 = xs, y1 = ys

e(x2) = y2 - y1 - 0.5 = m - 0.5

终点坐标为(xe,ye)

dx = xe-xs,dy = ye-ys;

m = (double)dy/(double)dx;
e = m-0.5;
for(int i = 0;i<dx;i++){
gl_Point(x,y);
if(e>=0){
y = y+1;e=e-1;
}
x = x+1;e=e+m;


为了去掉算法中的除法,提高算法的效率和减少算法的复杂性,可以令f = 2*e*dx;

f = 2 * dy - dx;
for (int i = 0; i<dx; i++) {
gl_Point(x,y);
if (f >= 0) {
y = y + 1;
f = f - 2*dx;
}
x = x + 1;
f = f + 2 * dy;
}


用openGL实现如下:

#include<iostream>
#include "gl\glut.h"
using namespace std;

int xx, yy, x2, y2;
void bresenham(int xs, int ys, int xe, int ye);
void lineSegment()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);//设置点的颜色为红色
glBegin(GL_POINTS);
bresenham(xx, yy, x2, y2);
glEnd();
glFlush();//必须得加
}

void bresenham(int xs, int ys, int xe, int ye) {
int x = xs, y = ys, dx, dy;
dx = xe - xs;
dy = ye - ys;
int f = 2 * dy - dx;
for (int i = 0; i<dx; i++) {
glVertex2d(x, y);
if (f >= 0) {
printf("f=%d>=0  ", f);
}
else {
printf("f=%d<0   ", f);
}
if (f >= 0) {
y = y + 1;
f = f - 2*dx;
}
x = x + 1;
f = f + 2 * dy;
printf("(%d,%d)\n", x, y);
}
}

int main(int argc, char * argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
printf("输入起始坐标和终点坐标:\n");
scanf("%d,%d,%d,%d", &xx, &yy, &x2, &y2);
glutInitWindowPosition(50, 100);
glutInitWindowSize(500, 500);
glutCreateWindow("Bresenham画线算法");
glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景为黑色
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glutDisplayFunc(lineSegment);
glutMainLoop();

}


输入1,1,400,300结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Bresenham