仍然可以看成是Bresenham算法的一个应用,书上叫它“中点法”(原因是当我们不能确定取哪个坐标的时候,就用两个待定的坐标的中点代入方程来帮助判断)。
Bresenham算法归根到底要解决的就是“下一个点怎么选更精确”这个问题,解决的套路是:
1)先给出一个判别函数,这个函数就是所要画的曲线的方程式;
2)求解这个判别函数的递推式;
2)总是从像素点更密集的方向开始选点(方便起见从x开始,每次加1);
3)判断下一个点x+1对应的理论坐标和实际坐标的差距,选差距小的作为y坐标;
4)不断重复3),直到达到临界条件(通常是斜率,一般只需要考虑斜率小于1的情形,其他对称解决)
椭圆的思路是一样的,只是方程更复杂,所以推导过程更繁琐一点:
注意这里是用斜率来确定临界点,隐函数求导可以得到k=-2x^2Ry/2y^2Rx。每次的分子分母也可以用增量的方式来计算。
最终的代码: