[计算机图形学]Bresenham画线算法的C语言代码
教材上Bresenham画线算法的推导详细,这里不再赘述,直接贴出C语言代码:
#include <stdio.h>
#include <stdlib.h>
void vline(int x, int y1, int y2, FILE* f){
/*竖直的线*/
int s = y1 > y2 ? -1 : 1; // 迭代方向
for (int i = y1; i != y2; i += s) {
fprintf(f, "(%d,%d)\n", x, i);
}
fprintf(f, "(%d,%d)\n", x, y2);
}
void hline(int x1, int x2, int y, FILE* f){
/*水平的线*/
int s = x1 > x2 ? -1 : 1; // 迭代方向
for (int i = x1; i != x2; i += s){
fprintf(f, "(%d,%d)\n", i, y);
}
fprintf(f, "(%d,%d)\n", x2, y);
}
void BresenhamLine(int x1, int y1, int x2, int y2, FILE* f){
/* 使用Bresenham画线算法绘制起点为(x1,y1),终点为(x2,y2)的直线 */
if (x1 == x2) { // 直线为竖直线
vline(x1, y1, y2, f);
return;
}
if (y1 == y2) { // 直线为水平线
hline(x1, x2, y1, f);
return;
}
int dx, dy; // 起终点之间的横、纵距离
dx = (x1 > x2) ? (x1 - x2) : (x2 - x1);
dy = (y1 > y2) ? (y1 - y2) : (y2 - y1);
int sx, sy; // 起点到终点的迭代方向
sx = (x1 > x2) ? -1 : 1;
sy = (y1 > y2) ? -1 : 1;
int x, y, e; // 迭代参数
x = x1;
y = y1;
e = (dy > dx) ? (2 * dx - 2 * dy) : (2 * dy - 2 * dx);
fprintf(f, "(%d,%d)\n", x1, y1);
if (dy > dx) {
while (x != x2){
if (e < 0){
y += sy; e += 2 * dx;
fprintf(f, "(%d,%d)\n", x, y);
} else {
x += sx; y += sy; e += 2 * dx - 2 * dy;
fprintf(f, "(%d,%d)\n", x, y);
}
} return;
} else {
while (x != x2){
if (e < 0) {
x += sx; e += 2 * dy;
fprintf(f, "(%d,%d)\n", x, y);
} else {
x += sx; y += sy; e += 2 * dy - 2 * dx;
fprintf(f, "(%d,%d)\n", x, y);
}
} return;
}
}
int main() {
int x1,y1,x2,y2;
printf("请输入点(x1 y1): ");
scanf("%d %d", &x1, &y1);
printf("请输入点(x2 y2): ");
scanf("%d %d", &x2, &y2);
FILE* f;
f = fopen("BresenhamLine.txt","w");
if (f == NULL) {
printf("无法建立输出文件,程序错误。");
return 0;
}
BresenhamLine(x1, y1, x2, y2, f);
fclose(f);
return 0;
}