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;
}