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

如何基于三个输入点生成适配倾斜校正的正方形XY坐标网格?

生成倾斜正方形的XY坐标网格函数实现

嘿,这个需求挺典型的——要适配非轴对齐的倾斜正方形,肯定不能用普通轴对齐网格的那套逻辑,得靠向量插值来搞定。下面给你拆解思路+完整实现:

核心思路

因为正方形是倾斜的,我们得先从给定的三个顶点里定义出正方形的两条边向量,再通过线性插值来生成每一个网格点:

  • 从btmLeft(左下角)到topLeft(左上角)的向量,代表正方形的垂直边方向
  • 从btmLeft到btmRight(右下角)的向量,代表正方形的水平边方向
  • 对每一行/列计算比例,用起始点+向量*比例的方式,精准算出每个网格点的坐标

完整函数代码

function genGrid(topLeft, btmRight, btmLeft, rows, cols) {
  const grid = [];
  
  // 计算两条边的方向向量
  const leftEdgeVec = {
    x: topLeft.x - btmLeft.x,
    y: topLeft.y - btmLeft.y
  };
  const bottomEdgeVec = {
    x: btmRight.x - btmLeft.x,
    y: btmRight.y - btmLeft.y
  };

  // 按行优先遍历生成网格点(从下到上,从左到右)
  for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
    // 计算当前行在垂直边上的比例:0=最底部,1=最顶部
    const rowRatio = rowIdx / (rows - 1);
    
    for (let colIdx = 0; colIdx < cols; colIdx++) {
      // 计算当前列在水平边上的比例:0=最左侧,1=最右侧
      const colRatio = colIdx / (cols - 1);
      
      // 线性插值计算当前点坐标
      const x = btmLeft.x + leftEdgeVec.x * rowRatio + bottomEdgeVec.x * colRatio;
      const y = btmLeft.y + leftEdgeVec.y * rowRatio + bottomEdgeVec.y * colRatio;
      
      // 保留4位小数避免浮点数精度问题,适配3D打印机需求
      grid.push({
        x: parseFloat(x.toFixed(4)),
        y: parseFloat(y.toFixed(4))
      });
    }
  }

  return grid;
}

用法示例

假设你有三个倾斜正方形的顶点,调用方式如下:

// 定义三个顶点:左下、左上、右下
const btmLeft = {x: 10, y: 10};
const topLeft = {x: 12, y: 20};
const btmRight = {x: 22, y: 12};

// 生成3行3列的网格(包含所有顶点)
const printerGrid = genGrid(topLeft, btmRight, btmLeft, 3, 3);
console.log(printerGrid);

输出的9个坐标会完美覆盖这个倾斜正方形的区域,完全适配它的非轴对齐状态。

小提示

  • 要确保输入的三个点是正方形的相邻三个顶点(左下、左上、右下),顺序错了会导致网格变形
  • 如果需要按列优先的顺序生成点,调换两个for循环的顺序即可
  • 小数位数可以根据你的3D打印机精度调整,一般2-4位就足够了

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:21