如何调整中点画线算法适配x1>x2或y1>y2的情况?
中点画线算法适配x1>x2场景的问题修复
你的问题出在坐标交换时机、初始误差项计算、以及dy>dx时的循环逻辑这几个地方,以下是具体分析和修复方案:
问题分析
- dx/dy计算时机错误:你先计算了dx和dy,再交换坐标,导致dx/dy还是基于原坐标的绝对值,和交换后的坐标不匹配。
- dy>dx分支逻辑错误:这个分支里你依然在执行
x1++,但此时应该以y为步进方向,同时初始误差项d的公式也不对(当dy>dx时,初始d应该是dx - dy/2)。 - 循环终止条件问题:dy>dx时的循环条件
y1 !== y2不够严谨,且逻辑中没有对应y方向的步进逻辑,导致线条走形。
修正后的代码
{ let x1 = 12, y1 = 3; let x2 = 9, y2 = 16; // 定义x、y方向的步进方向,无需交换坐标 let sx = x1 < x2 ? 1 : -1; let sy = y1 < y2 ? 1 : -1; let dx = Math.abs(x2 - x1); let dy = Math.abs(y2 - y1); let d; // 根据dx和dy的大小选择步进逻辑 if (dx > dy) { d = dy - dx / 2; while (x1 !== x2) { console.log(`${x1},${y1}`); // 先输出当前点,避免漏画起点 if (d >= 0) { y1 += sy; d += dy - dx; } else { d += dy; } x1 += sx; } console.log(`${x1},${y1}`); // 输出终点 } else { d = dx - dy / 2; while (y1 !== y2) { console.log(`${x1},${y1}`); // 先输出当前点 if (d >= 0) { x1 += sx; d += dx - dy; } else { d += dx; } y1 += sy; } console.log(`${x1},${y1}`); // 输出终点 } }
关键修改说明
- 新增步进变量sx:直接用sx控制x的增减方向,不需要交换坐标,避免逻辑混乱。
- 区分初始误差项d:dx>dy时用
dy - dx/2,dy>dx时用dx - dy/2,严格遵循中点画线算法的误差项推导逻辑。 - 修正循环步进逻辑:dx>dy时以x为步进方向,dy>dx时以y为步进方向,确保线条沿正确方向延伸。
- 调整输出时机:先输出当前点再执行步进,避免漏画起点,最后补充输出终点。
内容的提问来源于stack exchange,提问作者quiccode
相关产品推荐
相关产品推荐

