feat: 重构generatePoints方法,使用Cesium的3D坐标系统计算圆周点

改进算法以考虑地球曲率,使用ENU局部坐标系
This commit is contained in:
muxuming1 2025-08-14 16:51:48 +08:00
parent a8b7f2b46d
commit ab3aa61521

View File

@ -61,24 +61,86 @@ export default class Circle extends Base {
const radius = Utils.MathDistance(center, pnt2);
const res = this.generatePoints(center, radius);
const res = this.generatePoints(positions);
const temp = [].concat(...res);
const cartesianPoints = this.cesium.Cartesian3.fromDegreesArray(temp);
return cartesianPoints;
}
generatePoints(center, radius) {
let x, y, angle;
generatePoints(positions) {
const points = [];
const degreesPerRadian = 180.0 / Math.PI;
// 验证输入格式
if (!positions || positions.length !== 2) {
console.error('输入参数格式错误,需要包含两个世界坐标点');
return points;
}
// 提取中心点和第二点均为Cartesian3世界坐标
const centerCartesian = positions[0];
const secondPointCartesian = positions[1];
// 计算两点之间的距离作为半径(米)
const radius = this.cesium.Cartesian3.distance(centerCartesian, secondPointCartesian);
// 计算局部坐标系(东-北-上)
const localFrame = this.cesium.Transforms.eastNorthUpToFixedFrame(centerCartesian);
// 提取东向和北向单位向量
const eastVector = this.cesium.Cartesian3.fromElements(
localFrame[0],
localFrame[1],
localFrame[2],
new this.cesium.Cartesian3(),
);
const northVector = this.cesium.Cartesian3.fromElements(
localFrame[4],
localFrame[5],
localFrame[6],
new this.cesium.Cartesian3(),
);
// 归一化方向向量
this.cesium.Cartesian3.normalize(eastVector, eastVector);
this.cesium.Cartesian3.normalize(northVector, northVector);
// 生成圆周点
for (let i = 0; i <= 100; i++) {
angle = (Math.PI * 2 * i) / 100;
x = center[0] + radius * Math.cos(angle);
y = center[1] + radius * Math.sin(angle);
points.push([x, y]);
const angle = (Math.PI * 2 * i) / 100;
const cosAngle = Math.cos(angle);
const sinAngle = Math.sin(angle);
// 计算偏移量(基于米)
const eastOffset = this.cesium.Cartesian3.multiplyByScalar(
eastVector,
radius * cosAngle,
new this.cesium.Cartesian3(),
);
const northOffset = this.cesium.Cartesian3.multiplyByScalar(
northVector,
radius * sinAngle,
new this.cesium.Cartesian3(),
);
// 计算目标点
const targetPoint = this.cesium.Cartesian3.add(
centerCartesian,
this.cesium.Cartesian3.add(eastOffset, northOffset, new this.cesium.Cartesian3()),
new this.cesium.Cartesian3(),
);
// 投影到椭球表面
const surfacePoint = this.cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(
targetPoint,
new this.cesium.Cartesian3(),
);
// 转换回经纬度
const cartographic = this.cesium.Cartographic.fromCartesian(surfacePoint);
const longitude = cartographic.longitude * degreesPerRadian;
const latitude = cartographic.latitude * degreesPerRadian;
points.push([longitude, latitude]);
}
return points;
}
getPoints() {
return this.points;
}