一种光栅绘制直线的方法

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

最近《图形学》已经学习了光栅绘制直线的两种算法: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 }

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

原文地址:https://www.cnblogs.com/iPeterRex/p/1312914.html