《计算机图形学》
整理一下计算机图形学上机时做过的一些小程序,某些部分参考了网上资源,由于时间已久,已经忘记出处。
所有程序均在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)点画一条绿色直线。
评论