//经过适配处理的数值微分算法,可以绘制斜率为零、斜率不存在、斜率绝对值大于一等情况下的直线,只需输入两个点的横纵坐标即可
void DDA(const unsigned& x1, const unsigned& y1, const unsigned& x2, const unsigned& y2)
{
int dx(x2 - x1), dy(y2 - y1);//定义两个变量分别记录x和y的变化量
enum MainDirection { x, y };//定义一个枚举变量记录直线的主要变化方向(x方向或者y方向)(此处使用枚举变量更能体现取值约束)
MainDirection Direction;
if (abs(dx) >= abs(dy))//通过x变化量的绝对值和y变化量的绝对值进行比较确定主要变化方向
Direction = x;
else Direction = y;
//如果主要变化方向在x(y)上,但是两点的横(纵)坐标不满足递增排序,则递归调用自身
//(该操作相当于交换两个点的坐标)
if ((Direction == x && x1 > x2) || (Direction == y && y1 > y2))
{
DDA(x2, y2, x1, y1);
return;
}
initgraph(800, 640);//首先初始化绘图窗口备用
if (Direction == x)
{
double k = double(dy) / dx;//此处需要将dy转换成浮点型进行运算,否则得到的结果很可能是零(在此处出过错误,调试了很久)
double y = y1;
for (unsigned x = x1; x <= x2; ++x)
{
putpixel(x, int(y + 0.5), RED);
y += k;
}
_getch();
closegraph();
return;
}
else if (Direction == y)
{
double k = double(dx) / dy;//与上面一种情况同理需要转换成浮点型
double x = x1;
for (unsigned y = y1; y <= y2; ++y)
{
putpixel(int(x + 0.5), y, RED);
x += k;
}
_getch();
closegraph();
return;
}
}
注:运行该函数需要使用头文件<graphics.h>和<conio.h>,其中第一个头文件非系统库,可以到网上免费下载。