《计算机图形学》 整理一下计算机图形学上机时做过的一些小程序,某些部分参考了网上资源,由于时间已久,已经忘记出处。 所有程序均在TC环境编写测试,主要是因为在TC的图形系统下,分辨率较低,单个像素比较大,观察结果直观。另外,在TC下代码编写容易,可以把精力放在算法上。关于TC的图形系统参见: [056] Turbo C的图形系统 。 DDA画线算法原理每本图形学的书里都有,这里将画线函数加了一个ms参数,用于延时,每画完一个点后用delay(ms)延时,这样就可以看到画线的过程了。由于TC里delay的定义有点老,所以在现在的机器上默认都不是按真正多少毫秒来执行的。 TC在我机器上默认识别的分辨率是640×480,即X方向为0~639,Y方向为0~479。所以定义X_MAX为639,Y_MAX为479。另外由于CRT显示器的原点在左上角,而我们习惯上将原点定义在左下角,所以在输出Y方向的坐标时要用高度最大值减去实际值,具体在程序中的Y_MAX - ((int) y)一句。主程序测试时画了一条由左下角到右上角的直线。#include <math.h>#include <stdio.h>#include <graphics.h> #define X_MAX 639 /* X方向最大值 */#define Y_MAX 479 /* Y方向最大值 */ void initgr();int LineDDA(int x1, int y1, int x2, int y2, int color, long ms); int main(void){ long ms = 5000; /* 两点之间延持时间,便于观察画线过程 */ int color = 10; /* 设定颜色为绿色 */ initgr(); /* 初始化 */ getch(); /* 按任意键开始 */ LineDDA(0, 0, X_MAX, Y_MAX, color, ms); /* (0,0)点画到(639,479) */ getch(); /* 按任意键退出 */ } void initgr(void) /* BGI初始化 */{ int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver); /* 注册BGI驱动后可以不需要.BGI文件的支持运行*/ initgraph(&gd, &gm, "");} /*----------------------------------------------------------------------------- DDA画线算法: 起点(x1,y1),终点(x2,y2), 颜色color, 画点间隔时间ms -----------------------------------------------------------------------------*/int LineDDA(int x1, int y1, int x2, int y2, int color, long ms){ int dx, dy; /* dx,dy为起点与终点横坐标,纵坐标差量 */ int i, steps; /* steps为计长方向上的步长总量,作为控制数 */ float x_inc, y_inc; /* 坐标方向上的增量 */ float x, y; x = x1; y = y1; dx = x2 - x1; dy = y2 - y1; if (abs(dx) > abs(dy)) /* 判断步长1的方向 */ { steps = abs ( dx ); y += 0.5; } else { steps = abs(dy); x += 0.5; } x_inc = (float) dx / (float) steps ; /* 值为±1或±1/m */ y_inc = (float) dy / (float) steps ; /* 值为±1或±m */ for (i = 0; i <= steps; i ++) /* 循环画点成直线 */ { putpixel((int) x , Y_MAX - ((int) y), color); delay(ms); x += x_inc; y += y_inc; } return 1;}运行结果(TC):由左下角(0,0)点到右上角(639,479)点画一条绿色直线。

评论