作为数值微分法(DDA)的改进算法,中点画线法【采用了直线的一般式方程、增量思想,实现整数加法】
中点画线法
每次在最大位移方向上走一步,而另一个方向是走步还是不走步要取决于中点误差项的判断。
假定:0<=|k|<=1,每次在x方向上加1,y方向上加或不变需要判断。
d是x,y的线性函数采用增量计算是可行的,所以可以用增量计算的方法导出d的增量表达式,且增量计算提高运算效率:
可以用2d代替d来摆脱浮点运算——>能写出仅包含整数运算的算法——>中点生成直线的算法提升到整数加法——>优于DDA算法
实现如下:
#include <graphics.h>
#include <conio.h>
// 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Midpoint(int x1, int y1, int x2, int y2, int color)
{
int x = x1, y = y1;
int a = y1 - y2, b = x2 - x1;
int cx = (b >= 0 ? 1 : (b = -b, -1));
int cy = (a <= 0 ? 1 : (a = -a, -1));
putpixel(x, y, color);
int d, d1, d2;
if (-a <= b) // 斜率绝对值 <= 1
{
d = 2 * a + b;
d1 = 2 * a;
d2 = 2 * (a + b);
while (x != x2)
{
if (d < 0)
y += cy, d += d2;
else
d += d1;
x += cx;
putpixel(x, y, color);
}
}
else // 斜率绝对值 > 1
{
d = 2 * b + a;
d1 = 2 * b;
d2 = 2 * (a + b);
while (y != y2)
{
if (d < 0)
d += d1;
else
x += cx, d += d2;
y += cy;
putpixel(x, y, color);
}
}
}
// 主函数
int main()
{
initgraph(640, 480);
// 测试画线
Line_Midpoint(100, 1, 1, 478, GREEN);
Line_Midpoint(1, 478, 638, 1, GREEN);
// 按任意键退出
_getch();
closegraph();
return 0;
}
结果如下:
参考链接: