前两天在校内上发了一篇bresenham画线算法超简单的日志,用了四句话概括了这个算法的核心思想,现在在这里重新叙述一遍,并加上这几天我新理解到的几点。
我用x(k+1)表示k+1是下标。
x(k+1) = x(k)+1时,按比例,y方向应增加△y/△x这么多。
其中,△y=|yEnd-y0|,△x=|xEnd-x0|
如果△y/△x超过了1/2,也就是位于y(k)和y(k+1)中较上的位置y(k+1),则选择y(k+1),否则选择y(k).
如果△y/△x超过了1/2可以转化为p0=2△y-△x。判断p0符号即可。
今天重新看了一下,发现了几个我忽略了的细节问题。我们首先要把x0,y0点画上,并且这个点的位置是绝对准确的。p0为什么有初值呢,是2△y-△x,是因为p0第一次用的时候就是在画下一个点了而不是初始点。pk确定以后,pk+1-pk就有两种情况了,绘制上面一点和下面一点的增量是不同的,最好理解的方法就是还原成用△y/△x表示的式子化简得到pk+1再计算差值,即增量。
同样的道理,并行画线算法也可以写成那样的式子再进行转化和推算,并不需要好几页纸的推导的。中点画圆算法也是的。在中点画圆算法的代码中,用到了class,加入了一点面向对象的思想,这个是我要着重学习和体会的。
关于透视投影,可算被折腾坏了,刚开始理解不了,后来理解错了,还是在shinji的热心帮助下才算真正明白了。现实中是不存在一点透视的,所谓的一点透视只是看起来与人眼观察比较相近。对于
一个三维笛卡尔坐标系中的
点,或者与z轴垂直的线或平面,可以理解为观察点与灭点关于过此点的垂直于z轴的平面对称。对于一个图形不同深度位置的部分,灭点位置是不同的。也就是说,观察点只有一个,灭点有无数多个。随着物体离观察点距离的增大,灭点以两倍速度向远处延伸。所以我们现实中观察的铁轨是延伸到很远处交于一点而不是止于某处。
关于多个灭点这个问题,这是我自己的理解,也不知道是否准确,如果哪里错了还请大家批评指正。谢谢