正文

[077] DDA画线算法2007-01-15 22:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/22597.html

分享到:

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

阅读(16654) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册