You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整中点画线算法适配x1>x2或y1>y2的情况?

中点画线算法适配x1>x2场景的问题修复

你的问题出在坐标交换时机、初始误差项计算、以及dy>dx时的循环逻辑这几个地方,以下是具体分析和修复方案:

问题分析

  1. dx/dy计算时机错误:你先计算了dx和dy,再交换坐标,导致dx/dy还是基于原坐标的绝对值,和交换后的坐标不匹配。
  2. dy>dx分支逻辑错误:这个分支里你依然在执行x1++,但此时应该以y为步进方向,同时初始误差项d的公式也不对(当dy>dx时,初始d应该是dx - dy/2)。
  3. 循环终止条件问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:51:35