看了几篇博客,用的都是DDA算法,但是结果都不对,因为如果去最大步长的话,那么较小步长就小于1,直接导致加到x,y之后会被自动约掉小数(因为x,y为整数类型),因此对DDA算法做了以下改进。
参考文章:https://www.cnblogs.com/fx-blog/p/9055101.html
//获取x、y方向的变化最小的方向
int minstep;
if(abs(delta_x)>abs(delta_y)){
minstep = abs(delta_y);
}
else{
minstep = abs(delta_x);
}
//获取变化较小的方向的1个步长和变化较大方向的对应的步长单位
double xUnitstep = abs(delta_x) /minstep;
double yUnitstep = abs(delta_y) /minstep;
cout<< "xUnitstep: " << xUnitstep<<endl;
cout<< "yUnitstep: " << yUnitstep<<endl;
//plines[0]、plines[1]是直线的开始端点的坐标
int x = plines[0];
int y = plines[1];
//遍历最小变化的方向,较大变化方向的变化上边代码已经算出,x,y分别加上他们的变化(注意理解j*)
for(int j=0; j<minstep; ++j){
x = x + j * xUnitstep;
y = y + j * yUnitstep;
//对直线上的点x,y做输出或者其他操作
cout<< pic.at<uchar>(y,x) <<endl;
//操作完之后x,y要相应减去变化,变回到直线的开始端点坐标
//(注意理解int的使用,上边的x,y加上j*xUnitstep, j*yUnitstep之后,
//会自动变成整数类型,因为x,y位整型,xUnitstep,yUnitstep为double型)
x = x - int(j * xUnitstep);
y = y - int(j * yUnitstep);
}