Graphics-PA0

代码逻辑

直线

设直线斜率为,先考虑的情况。定义误差项。不考虑纵坐标的变化,有
当前纵坐标为时,只可能是
1. 时,,则
2. 时,,则
3. 时,,则

在计算k和与0.5的比较时用到了浮点数。令,则规则改为:
1. 时,,则
2. 时,,则
3. 时,,则

时,将直线关于y=x做对称即可,实现上,交换以及,在SetPixel时再次交换y与x即可。
需要注意交换后需要满足,所以可能需要交换以及

只考虑从(0,R)顺时针旋转的八分之一圆,其余可以对称得到。
定义判别式,当前坐标为时,下一个点的判别式
1. ,下一个点为,下一个判别式为
2. ,下一个点为,下一个判别式为

第一个点的判别式为1.25-R,为了避免浮点数运算,将判别式改为e=4*d。

区域填充

使用扫描线算法
1. 将队列置空,初始点作为种子点入栈。
2. 在队列空则结束,否则进行一次出队,取出一个种子点q。
3. 填充q所在那一行的像素,确定被填充区段的左右端点,记为xl和xr。
4. 在区间[xl,xr]中检查与当前扫描线上下相邻的两条扫描线,若存在非边界、未填充的像素,则将每一区间的最右端作为种子点入队。返回第二步。

讨论与问题

未借鉴网上代码。
实现中发现segment fault问题,与宋嘉玺讨论得知为边界条件没有注意。
在区域填充的第三步中,要注意填充区段是否超出了图像边界,在第四步中,也要注意上下扫描线是否超出图像边界。