声明:本篇文章不得转载,如需转载必须经过作者同意。否则,将予追究。
最近《图形学》已经学习了光栅绘制直线的两种算法: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 }
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 }
声明:本篇文章不得转载,如需转载必须经过作者同意。否则,将予追究。