正文

[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)点画一条绿色直线。

阅读(10065) | 评论(0)


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

评论

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