C++ OpenGL 直线绘制算法:DDA 和 Bresenham 实现
#include
typedef struct point { int x; int y; } POINT;
// 初始化 OpenGL 环境 void init() { glClearColor(1.0, 1.0, 1.0, 1.0); // 设置背景颜色为白色 glMatrixMode(GL_PROJECTION); // 设置投影矩阵 glLoadIdentity(); // 初始化投影矩阵 gluOrtho2D(0, 200, 0, 200); // 设置二维正交投影 }
// DDA 算法绘制直线 void DDA(POINT p0, POINT p1) { double k; // 直线斜率 k = (double)(p1.y - p0.y) / (p1.x - p0.x); int x, y; // 迭代变量 x = p0.x; y = p0.y;
glClear(GL_COLOR_BUFFER_BIT); // 清除屏幕
glColor3f(0.0, 0.0, 0.0); // 设置绘制颜色为黑色
glBegin(GL_POINTS); // 开始绘制点
if (abs(k) < 1) { // 斜率绝对值小于 1
glVertex2i(x, y); // 绘制起点
for (int i = 1; x < p1.x; i++) { // 沿 x 轴方向迭代
x++;
y = p0.y + (int)(k * i + 0.5); // 计算 y 坐标
glVertex2i(x, y); // 绘制点
}
} else { // 斜率绝对值大于等于 1
k = 1 / k; // 改变斜率为 1/k
glVertex2i(x, y); // 绘制起点
for (int i = 1; y < p1.y; i++) { // 沿 y 轴方向迭代
y++;
x = p0.x + (int)(k * i + 0.5); // 计算 x 坐标
glVertex2i(x, y); // 绘制点
}
}
glEnd(); // 结束绘制
glFlush(); // 刷新屏幕
}
// Bresenham 算法绘制直线 void Bresenham(POINT p0, POINT p1) { int p, dy, dx; // 决策参数和差值 dy = abs(p1.y - p0.y); dx = abs(p1.x - p0.x); int x, y; // 迭代变量 x = p0.x; y = p0.y; p = 2 * dy - dx; // 初始化决策参数
glClear(GL_COLOR_BUFFER_BIT); // 清除屏幕
glColor3f(0.0, 0.0, 0.0); // 设置绘制颜色为黑色
glBegin(GL_POINTS); // 开始绘制点
if (dx > dy) { // x 差值大于 y 差值
while (x < p1.x) { // 沿 x 轴方向迭代
x++;
if (p > 0) { // 决策参数大于 0,y 增加 1
y++;
p = p + (2 * dy - 2 * dx); // 更新决策参数
} else { // 决策参数小于等于 0,y 不变
p += 2 * dy; // 更新决策参数
}
glVertex2i(x, y); // 绘制点
}
} else { // y 差值大于等于 x 差值
// 同理,可以根据 y 轴方向迭代绘制
}
glEnd(); // 结束绘制
glFlush(); // 刷新屏幕
}
// 显示函数 void display() { POINT p0, p1; p0 = { 0, 0 }; // 起点 p1 = { 150, 120 }; // 终点 // DDA(p0, p1); Bresenham(p0, p1); // 使用 Bresenham 算法绘制直线 }
int main(int argc, char** argv) { glutInit(&argc, argv); // 初始化 OpenGL glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式 glutInitWindowPosition(100, 100); // 设置窗口位置 glutInitWindowSize(400, 400); // 设置窗口大小 glutCreateWindow('Lines'); // 创建窗口 init(); // 初始化 OpenGL 环境 glutDisplayFunc(display); // 设置显示函数
glutMainLoop(); // 进入主循环
return 0;
原文地址: https://www.cveoy.top/t/topic/n4m0 著作权归作者所有。请勿转载和采集!