The Space of Bona

 客服热线:020-87861456

收藏本站
Project2# Draw Circles and Lines

一、实验要求
  此实验的要求是,利用Bresenham算法从底层实现画屏幕上任意两点之间的连线,以及给定圆心坐标和半径,画出圆。不能使用openGL等已有的图形函数库,从底层实现。


二、实验内容

实验要求看似很简单,但是Bresenham算法有很大的不足之处,就是画线的时候只能画出斜率在0到1之间,并且起点的横纵坐标一定要小于终点的横纵坐标。不能画没有斜率的直线。在画圆的时候只能画出右下角八分之一的圆。圆的上下左右四个边缘点画不出来。

  1)画圆

  解决的方法,首先圆很简单,假设用Bresenham算法可以直接画出的是圆的第4部分(以上面边第一个八分之一为第一部分),第四部分经过轴对称可以画出第五部分,第四五部分经过轴对称可以画出第一盒第八部分,然后第一五六八部分经过轴对称可以画出剩下的部分。




如图代码所示,我找出了各个部分和第四部分的点的坐标之间的关系,这样就同时画出了八个部分。另外再画出圆上缺失的四个点,一个圆就完成了。



  2)画线

      之后比较麻烦一点的是画线。首先解决的是没有斜率的线的画法,首先判断起点和终点的坐标是不是在同一条竖直线或者一条水平线上,如果是,就直接画出两点之间所有的点。其他的也将类似圆将画线分为八个部分。可以直接画出的是第二部分。


再将这八个部分分成四类,一五部分,二六部分,三七部分和四八部分。

每一类都可以用相同的算法画出。比如一五部分,第五部分的线可以将起始和终点的坐标互换之后按第一部分的算法画出。以此类推。


第一部分可以先按y=x轴对称变换到第二部分用算法算出对应的点然后再按轴对称变换到第一部分画出线。以此类推,最终八个部分的线都可以这样画出。竖直和水平的线也可以这样画出。




三、实验总结

   经过这次实验,我深刻地体会到速度快和代码量少是不可兼得的。Bresenham算法只使用了加法就算出了一条线上各个点应处的位置,这肯定比乘法算起来的时间复杂度低得多。但是由于这个算法的局限性,需要考虑许许多多的情况,但是总的来说,画图的效率很高。最终基本实现了实验要求。但是美中不足的是,调用了windows的画点方法,直接在屏幕上画点,所以一刷新就没有了。解决这个问题的办法是写了一个死循环,让它不停地画。这样会导致画面比较混乱。最好的解决办法还是创建一个窗口,并且在这个窗口里面作图。这也是这次实验需要改进的地方。