Bresenham画线算法简介
只介绍当直线的斜率小于1大于0时的算法:
- 输入线段的两个端点
- 计算,得到,
- 从开始,对于每个,检测的符号:
:下一个要绘制的点为,并且
否则:下一个要绘制的点为,并且 - 重复步骤3,共次
效果
代码
#include <GL/glut.h>
#include <cmath>
template<typename T>T Max(T x, T y) {
return (x > y ? x : y);
}
void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 800, 0.0, 600);
}
void Drawline(int x0, int y0, int xEnd, int yEnd)
{
int dx = (xEnd >= x0 ? xEnd - x0 : x0 - xEnd), dy = (xEnd >= x0 ? yEnd - y0 : y0 - yEnd); //线从左往右画
int x = (xEnd >= x0 ? x0 : xEnd), y = (xEnd >= x0 ? y0 : yEnd);
if (fabs(dy) <= dx) { //斜率小于1
int _2dy_dx = 2 * (fabs(dy) - dx);
int _2dy = 2 * fabs(dy);
int p = _2dy - dx; //决策参数初始值
glVertex2i(x, y);
while (x < Max(xEnd, x0))
{
x++; //因为斜率小于1,横座标每次进1
if (p < 0)
p += _2dy;
else
{
y += (dy >= 0 ? 1 : -1);
p += _2dy_dx;
}
glVertex2i(x, y);
}
}
else { //斜率大于1, dx和dy地位互换
int _2dx = 2 * dx;
int _2dx_dy = 2 * (dx - fabs(dy));
int ddy = (dy >= 0 ? 1 : -1);
int p = 2 * dx - fabs(dy);
glVertex2i(x, y);
while (x < Max(xEnd, x0))
{
y += ddy; //因为斜率大于1,纵座标每次进1
if (p < 0)
p += _2dx;
else
{
x++;
p += _2dx_dy;
}
glVertex2i(x, y);
}
}
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glPointSize(3);
glBegin(GL_POINTS);
Drawline(10, 10, 700, 600);
Drawline(10, 10, 300, 700);
Drawline(700, 10, 10, 600);
Drawline(700, 10, 300, 700);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("Bresenham");
init();
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}