#include <graphics.h> // 使用 Bresenham 算法绘制直线 void Bresenham(int x0, int y0, int x1, int y1) { putpixel(x0, y0, WHITE); // 绘制起始点 int dx = x1 - x0; // 计算横坐标差值的绝对值 int dy = y1 - y0; // 计算纵坐标差值的绝对值 double k = (double)dy / (double)dx; double e = -0.5;//e=d-0.5 for (int i = 0; i <= dx; i++) { putpixel(x0, y0, WHITE); x0++; e += k; if (e >= 0) {y0++,e = e - 1;} } putpixel(x1, y1, WHITE); // 绘制最后一个像素点 } int main() { initgraph(640, 480); // 初始化图形环境,创建窗口大小为640x480的窗口 Bresenham(0, 0,640, 480); // 调用 Bresenham 函数绘制直线 system("pause"); // 暂停程序执行 closegraph(); // 关闭图形环境 return 0; }
运行结果:
改进后:以上代码在计算斜率(k)与误差项(e)时用到了小数和除法,可以用整数来避免除法。即e'=2*e*dx。
#include <graphics.h> // 使用 Bresenham 算法绘制直线 void Bresenham(int x0, int y0, int x1, int y1) { int dx, dy, e; dx = x1 - x0; dy = y1 - y0; e = -dx; for (int i = 0; i <= dx; i++) { putpixel(x0, y0, WHITE); x0++, e = e + 2 * dy; if (e >= 0) { y0++; e = e - 2 * dx; } } } int main() { initgraph(640, 480); // 初始化图形环境,创建窗口大小为640x480的窗口 Bresenham(0, 0,640, 480); // 调用 Bresenham 函数绘制直线 system("pause"); // 暂停程序执行 closegraph(); // 关闭图形环境 return 0; }