一种光栅绘制直线的方法

声明:本篇文章不得转载,如需转载必须经过作者同意。否则,将予追究。

最近《图形学》已经学习了光栅绘制直线的两种算法:DDA算法和中点画线算法。

在老师刚刚介绍光栅绘制直线算法时,我在课堂上就想着一个问题,这个问题使我无法好好听课,因此走了神。但还好,DDA算法很容易理解,回家自己看看书就明白了,其实就是用增量来绘制直线的。我想的这个问题就是:通过确定一条直线的起始点A(xs,ys)和终止点B(xe,ye),可以算出其中点M(xm,ym),绘制中点M。然后再通过同样的过程将AM和MB分别作为一条直线,并计算出其中点并绘制,如图:
一种光栅绘制直线的方法
1.绘制起始点A,B;
2.计算出AB中点M,绘制M;
3.计算出AM中点M1和MB中点M1,并绘制M1;
4.重复这个过程,知道当直线两点相减为1.

实现这个算法有一个问题:如此多的中点似乎是成2的次方增长,如何确定计算并绘制这些中点呢?
曾经看过一本C语言抽象思想的书籍,介绍的是递归算法,虽然当时有些不通,但此时不妨试一试。一试,成了。
经过测试,在增量x和增量y相等的时候,可以绘制出非常完美的直线;其他情况有两种但并未深入研究,只能在此说明一下直线的情况。一种直线成散点状态,一种直线并不十分直。源代码如下:

 1  /*
 2      Title: Another Method for Drawing Line
 3      Author: Wulei
 4      Date: 2008-10-16
 5  */
 6  #include < graphics.h >
 7 
 8  void  Method( int  xs,  int  ys,  int  xe,  int  ye);
 9 
10  main()
11  {
12       int  gd = DETECT,gm;
13      initgraph( & gd, & gm, "" );
14 
15      Method( 0 , 0 , 100 , 100 );
16      getch();
17      closegraph();
18  }
19 
20  /*  Wulei's Method for Drawing Line  */
21  void  Method( int  xs,  int  ys,  int  xe,  int  ye)
22  {
23      int  xm, ym;
24     xm  =  (xs  +  xe)  /   2 ;
25     ym  =  (ys  +  ye)  /   2 ;
26      if ( xm  ==  xs  &&  xe  -  xs  >  ye  -  ys )
27         return ;
28      if ( ym  ==  ys  &&  xe  -  xs  <=  ye  -  ys )
29         return ;
30     putpixel( xm, ym, WHITE );
31     Method( xs, ys, xm, ym );
32     Method( xm, ym, xe, ye );
33  }

 

 声明:本篇文章不得转载,如需转载必须经过作者同意。否则,将予追究。

你可能感兴趣的:(方法)