如何基于三个输入点生成适配倾斜校正的正方形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
相关产品推荐
相关产品推荐

