代码实现
void Canvas::drawLine(intV2 pt1, intV2 pt2, RGBA _color)
{
int disY = abs(pt2.y - pt1.y); // △y
int disX = abs(pt2.x - pt1.x); // △x
// 直线的斜率 k = △y / △x
int xNow = pt1.x;
int yNow = pt1.y;
int stepX = 0;
int stepY = 0;
//判断2个方向步进的正负
pt1.x < pt2.x ? stepX = 1 : stepX = -1;
pt1.y < pt2.y ? stepY = 1 : stepY = -1;
//对比xy偏移量,决定步进的方向选取x or y
int sumStep = disX; //默认步进方向为x方向,步进总数为 △x
bool useXStep = true;
//斜率与1进行对比,如果斜率大于1,则使用y方向进行步进
if (disX < disY) {
sumStep = disY;
useXStep = false;
SWAP_INT(disX, disY)
}
/*
Bresenham 算法结论:
0、P_1 = 2△y - △x
1、P_i >= 0
y_(i+1) = y_i + 1
P_(i+1) = P_i + 2(△y - △x)
2、P_i < 0
y_(i+1) = y_i
P_(i+1) = P_i + 2△y
*/
//初始化P值
int p = 2 * disY - disX;
//算法
for (int i = 0; i < sumStep; i++) {
drawPoint(xNow, yNow, _color);
if (p >= 0) {
if (useXStep) {
yNow += stepY;
}
else {
xNow += stepX;
}
p = p /*+ 2* disY*/ - 2 * disX;
}
//步进主坐标
useXStep ? xNow += stepX : yNow += stepY;
//计算下一点的判别式
p = p + 2 * disY;
}
}