算法核心思路
1. 输入标准化
支持两种点格式:
[[x, y, z], [x, y, z], ...]
// 或
[{x, y, z}, {x, y, z}, ...]
自动补全缺失的 值为 0。
z
2. 地形平面拟合(关键!)
由于无人机无法沿任意曲面飞行,我们采用最小二乘法拟合一个最佳平面:
z=A⋅x+B⋅y+C
💡 技巧:为避免大坐标(如 ECEF,量级 1e6)导致数值不稳定,先对点集进行中心化处理,再解线性方程组,最后还原参数。这极大提升了算法鲁棒性。
若点共线或共面退化,则回退到平均高程 。
C
3. 坐标系旋转 + 扫描线填充
将多边形按指定航向角 旋转,使扫描方向对齐 X 轴在 Y 方向以
headingDegrees 为步长,逐行计算与多边形边的交点成对交点构成有效线段(需用射线法判断中点是否在多边形内)对凹多边形,自动跳过外部“空洞”区域
spacing
4. 路径拼接与坐标还原
奇数行正向,偶数行反向,形成“之”字形将旋转后的 2D 路径反变换回原始坐标系每个 (x, y) 点代入拟合平面,得到对应
z
5. 起终点优化
可选插入起飞点 自动在路径末尾添加多边形质心点(便于返航或悬停)
homePoint
代码解析
✅ 高精度数值处理
const det = sxx * syy - sxy * sxy;
if (Math.abs(det) < 1e-14 * scale * scale) { /* 退化处理 */ }
使用相对阈值判断矩阵奇异,适应不同坐标尺度(WGS84 vs ECEF)。
✅ 凹多边形支持
通过射线交叉法(Ray Casting)严格判断线段中点是否在多边形内部,确保只保留有效覆盖段。
✅ 无依赖、纯函数
整个算法不依赖任何 GIS 库(如 Turf.js),仅用基础数学,可轻松移植到 Web、Node.js、甚至嵌入式设备。
Cesium 可视化集成
配套提供 函数,自动识别输入坐标类型:
drawLawnmowerPathCesium
若 (经度、纬度、高程)→ 调用
[lon, lat, height]若
Cesium.Cartesian3.fromDegrees(ECEF 笛卡尔)→ 直接构造
[x, y, z]
Cartesian3
支持绘制航线折线 + 控制点,便于调试与展示:
const points = generateLawnmowerPathXYZ(polygon, 45, 10);
drawLawnmowerPathCesium(viewer, points, { drawPoints: true });
🌍 提示:在 Cesium 中,建议关闭
以真实反映高程变化。
clampToGround







