deeptwins-engine-3d 0.1.63 → 0.1.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/Build/DeepTwins/Workers/MvtVector.worker.js +1 -0
- package/dist/esm/{plot/utils/Algorithm.js → drawer/algorithm.js} +1 -3
- package/dist/esm/drawer/common.d.ts +61 -0
- package/dist/esm/{plot/utils/PlotCommon.js → drawer/common.js} +104 -551
- package/dist/esm/{plot/utils/Coordinate.d.ts → drawer/coordinate.d.ts} +1 -1
- package/dist/esm/drawer/index.d.ts +11 -18
- package/dist/esm/drawer/index.js +329 -80
- package/dist/esm/{plot/utils → drawer}/plotUtil.js +1 -3
- package/dist/esm/drawer/shape/Assemble.d.ts +34 -0
- package/dist/esm/drawer/shape/Assemble.js +415 -0
- package/dist/esm/drawer/shape/AttackArrow.d.ts +32 -0
- package/dist/esm/drawer/shape/AttackArrow.js +442 -0
- package/dist/esm/drawer/shape/BaseShape.d.ts +14 -4
- package/dist/esm/drawer/shape/BaseShape.js +175 -20
- package/dist/esm/drawer/shape/Bow.d.ts +31 -0
- package/dist/esm/drawer/shape/Bow.js +375 -0
- package/dist/esm/drawer/shape/Circle.d.ts +37 -0
- package/dist/esm/drawer/shape/Circle.js +461 -0
- package/dist/esm/drawer/shape/Curve.d.ts +29 -0
- package/dist/esm/drawer/shape/Curve.js +386 -0
- package/dist/esm/drawer/shape/DragPoint.d.ts +32 -0
- package/dist/esm/drawer/shape/DragPoint.js +211 -0
- package/dist/esm/drawer/shape/Elliptic.d.ts +38 -0
- package/dist/esm/drawer/shape/Elliptic.js +491 -0
- package/dist/esm/drawer/shape/Formation.d.ts +33 -0
- package/dist/esm/drawer/shape/Formation.js +395 -0
- package/dist/esm/drawer/shape/PincerArrow.d.ts +32 -0
- package/dist/esm/drawer/shape/PincerArrow.js +445 -0
- package/dist/esm/drawer/shape/Point.d.ts +2 -31
- package/dist/esm/drawer/shape/Point.js +7 -201
- package/dist/esm/drawer/shape/Polygon.d.ts +1 -1
- package/dist/esm/drawer/shape/Polygon.js +10 -81
- package/dist/esm/drawer/shape/Polyline.d.ts +1 -1
- package/dist/esm/drawer/shape/Polyline.js +10 -81
- package/dist/esm/drawer/shape/RegularPolygon.d.ts +37 -0
- package/dist/esm/drawer/shape/RegularPolygon.js +468 -0
- package/dist/esm/drawer/shape/RightAngleArrow.d.ts +34 -0
- package/dist/esm/drawer/shape/RightAngleArrow.js +423 -0
- package/dist/esm/drawer/shape/Sector.d.ts +37 -0
- package/dist/esm/drawer/shape/Sector.js +568 -0
- package/dist/esm/drawer/shape/StraightArrow.d.ts +34 -0
- package/dist/esm/drawer/shape/StraightArrow.js +422 -0
- package/dist/esm/drawer/shape/SwallowtailArrow.d.ts +36 -0
- package/dist/esm/drawer/shape/SwallowtailArrow.js +438 -0
- package/dist/esm/drawer/types.d.ts +23 -0
- package/dist/esm/drawer/types.js +11 -0
- package/dist/esm/drawer/utils.d.ts +14 -0
- package/dist/esm/drawer/utils.js +320 -2
- package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +5 -3
- package/dist/esm/measure/Area.d.ts +17 -17
- package/dist/esm/measure/Area.js +95 -63
- package/dist/esm/measure/BaseDraw.d.ts +9 -4
- package/dist/esm/measure/BaseDraw.js +37 -2
- package/dist/esm/measure/Distance.d.ts +9 -9
- package/dist/esm/measure/Distance.js +52 -68
- package/dist/esm/measure/index.d.ts +16 -26
- package/dist/esm/measure/index.js +72 -84
- package/dist/esm/measure/types.d.ts +94 -0
- package/dist/esm/measure/types.js +17 -0
- package/dist/esm/measure/utils.d.ts +7 -7
- package/dist/esm/measure/utils.js +43 -24
- package/dist/esm/tileLayer/MvtVectorLoad.d.ts +241 -0
- package/dist/esm/tileLayer/MvtVectorLoad.js +1353 -0
- package/dist/esm/tileLayer/MvtVectorWorkerClient.d.ts +25 -0
- package/dist/esm/tileLayer/MvtVectorWorkerClient.js +126 -0
- package/dist/esm/tool/utils.js +1 -1
- package/dist/umd/deeptwins-engine-3d.min.js +1 -1
- package/package.json +2 -1
- package/dist/assets/Build/DeepTwins/Image/compass/pointer-white.png +0 -0
- package/dist/esm/plot/create/CreateAssemble.d.ts +0 -2
- package/dist/esm/plot/create/CreateAssemble.js +0 -63
- package/dist/esm/plot/create/CreateAttackArrow.d.ts +0 -5
- package/dist/esm/plot/create/CreateAttackArrow.js +0 -75
- package/dist/esm/plot/create/CreateBillboard.d.ts +0 -2
- package/dist/esm/plot/create/CreateBillboard.js +0 -47
- package/dist/esm/plot/create/CreateBow.d.ts +0 -2
- package/dist/esm/plot/create/CreateBow.js +0 -63
- package/dist/esm/plot/create/CreateCircle.d.ts +0 -2
- package/dist/esm/plot/create/CreateCircle.js +0 -68
- package/dist/esm/plot/create/CreateCurve.d.ts +0 -2
- package/dist/esm/plot/create/CreateCurve.js +0 -76
- package/dist/esm/plot/create/CreateElliptic.d.ts +0 -2
- package/dist/esm/plot/create/CreateElliptic.js +0 -69
- package/dist/esm/plot/create/CreateFlag.d.ts +0 -2
- package/dist/esm/plot/create/CreateFlag.js +0 -80
- package/dist/esm/plot/create/CreateFormation.d.ts +0 -2
- package/dist/esm/plot/create/CreateFormation.js +0 -65
- package/dist/esm/plot/create/CreateFreeLine.d.ts +0 -2
- package/dist/esm/plot/create/CreateFreeLine.js +0 -69
- package/dist/esm/plot/create/CreateFreePolygon.d.ts +0 -2
- package/dist/esm/plot/create/CreateFreePolygon.js +0 -65
- package/dist/esm/plot/create/CreateLabel.d.ts +0 -2
- package/dist/esm/plot/create/CreateLabel.js +0 -55
- package/dist/esm/plot/create/CreateLineArrow.d.ts +0 -2
- package/dist/esm/plot/create/CreateLineArrow.js +0 -79
- package/dist/esm/plot/create/CreatePincerArrow.d.ts +0 -5
- package/dist/esm/plot/create/CreatePincerArrow.js +0 -73
- package/dist/esm/plot/create/CreatePoint.d.ts +0 -2
- package/dist/esm/plot/create/CreatePoint.js +0 -47
- package/dist/esm/plot/create/CreatePolygon.d.ts +0 -2
- package/dist/esm/plot/create/CreatePolygon.js +0 -80
- package/dist/esm/plot/create/CreatePolyline.d.ts +0 -2
- package/dist/esm/plot/create/CreatePolyline.js +0 -70
- package/dist/esm/plot/create/CreateRectangle.d.ts +0 -2
- package/dist/esm/plot/create/CreateRectangle.js +0 -60
- package/dist/esm/plot/create/CreateRegularPolygon.d.ts +0 -2
- package/dist/esm/plot/create/CreateRegularPolygon.js +0 -75
- package/dist/esm/plot/create/CreateRightAngleArrow.d.ts +0 -5
- package/dist/esm/plot/create/CreateRightAngleArrow.js +0 -73
- package/dist/esm/plot/create/CreateRoundRectangle.d.ts +0 -2
- package/dist/esm/plot/create/CreateRoundRectangle.js +0 -63
- package/dist/esm/plot/create/CreateSector.d.ts +0 -2
- package/dist/esm/plot/create/CreateSector.js +0 -65
- package/dist/esm/plot/create/CreateStraightArrow.d.ts +0 -5
- package/dist/esm/plot/create/CreateStraightArrow.js +0 -65
- package/dist/esm/plot/create/CreateSwallowtailArrow.d.ts +0 -5
- package/dist/esm/plot/create/CreateSwallowtailArrow.js +0 -67
- package/dist/esm/plot/create/index.d.ts +0 -25
- package/dist/esm/plot/create/index.js +0 -25
- package/dist/esm/plot/edit/EditAssemble.d.ts +0 -8
- package/dist/esm/plot/edit/EditAssemble.js +0 -120
- package/dist/esm/plot/edit/EditAttackArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditAttackArrow.js +0 -182
- package/dist/esm/plot/edit/EditBillboard.d.ts +0 -7
- package/dist/esm/plot/edit/EditBillboard.js +0 -70
- package/dist/esm/plot/edit/EditBow.d.ts +0 -8
- package/dist/esm/plot/edit/EditBow.js +0 -119
- package/dist/esm/plot/edit/EditCircle.d.ts +0 -8
- package/dist/esm/plot/edit/EditCircle.js +0 -133
- package/dist/esm/plot/edit/EditCurve.d.ts +0 -8
- package/dist/esm/plot/edit/EditCurve.js +0 -180
- package/dist/esm/plot/edit/EditElliptic.d.ts +0 -8
- package/dist/esm/plot/edit/EditElliptic.js +0 -144
- package/dist/esm/plot/edit/EditFlag.d.ts +0 -8
- package/dist/esm/plot/edit/EditFlag.js +0 -121
- package/dist/esm/plot/edit/EditFormation.d.ts +0 -8
- package/dist/esm/plot/edit/EditFormation.js +0 -120
- package/dist/esm/plot/edit/EditLabel.d.ts +0 -7
- package/dist/esm/plot/edit/EditLabel.js +0 -100
- package/dist/esm/plot/edit/EditLineArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditLineArrow.js +0 -180
- package/dist/esm/plot/edit/EditPincerArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditPincerArrow.js +0 -121
- package/dist/esm/plot/edit/EditPoint.d.ts +0 -7
- package/dist/esm/plot/edit/EditPoint.js +0 -70
- package/dist/esm/plot/edit/EditPolygon.d.ts +0 -8
- package/dist/esm/plot/edit/EditPolygon.js +0 -181
- package/dist/esm/plot/edit/EditPolyline.d.ts +0 -8
- package/dist/esm/plot/edit/EditPolyline.js +0 -179
- package/dist/esm/plot/edit/EditRectangle.d.ts +0 -8
- package/dist/esm/plot/edit/EditRectangle.js +0 -119
- package/dist/esm/plot/edit/EditRegularPolygon.d.ts +0 -8
- package/dist/esm/plot/edit/EditRegularPolygon.js +0 -170
- package/dist/esm/plot/edit/EditRightAngleArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditRightAngleArrow.js +0 -143
- package/dist/esm/plot/edit/EditRoundRectangle.d.ts +0 -8
- package/dist/esm/plot/edit/EditRoundRectangle.js +0 -119
- package/dist/esm/plot/edit/EditSector.d.ts +0 -8
- package/dist/esm/plot/edit/EditSector.js +0 -120
- package/dist/esm/plot/edit/EditStraightArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditStraightArrow.js +0 -120
- package/dist/esm/plot/edit/EditSwallowtailArrow.d.ts +0 -8
- package/dist/esm/plot/edit/EditSwallowtailArrow.js +0 -121
- package/dist/esm/plot/edit/index.d.ts +0 -23
- package/dist/esm/plot/edit/index.js +0 -23
- package/dist/esm/plot/utils/DomUtil.d.ts +0 -34
- package/dist/esm/plot/utils/DomUtil.js +0 -100
- package/dist/esm/plot/utils/PlotCommon.d.ts +0 -101
- package/dist/esm/plot/utils/ReminderTip.d.ts +0 -10
- package/dist/esm/plot/utils/ReminderTip.js +0 -67
- package/dist/esm/plot/utils/Tooltip.d.ts +0 -3
- package/dist/esm/plot/utils/Tooltip.js +0 -97
- /package/dist/esm/{plot/utils/Algorithm.d.ts → drawer/algorithm.d.ts} +0 -0
- /package/dist/esm/{plot/utils/Coordinate.js → drawer/coordinate.js} +0 -0
- /package/dist/esm/{plot/utils → drawer}/plotUtil.d.ts +0 -0
|
@@ -1,58 +1,9 @@
|
|
|
1
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
5
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
6
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
-
/**
|
|
8
|
-
* 态势标绘通用方法
|
|
9
|
-
*/
|
|
10
1
|
import * as Cesium from 'deeptwins-cesium';
|
|
11
|
-
import xp from "./
|
|
12
|
-
import { calculateAngle, transformCartesianToWGS84, transformWGS84ToCartesian } from "./
|
|
13
|
-
/**
|
|
14
|
-
* 获取静态资源路径
|
|
15
|
-
* @param url 路径
|
|
16
|
-
* @returns
|
|
17
|
-
*/
|
|
18
|
-
// export const getAssetsData = (url: string) => {
|
|
19
|
-
// return new URL(`../assets/${url}`, import.meta.url).href;
|
|
20
|
-
// };
|
|
21
|
-
|
|
2
|
+
import xp from "./algorithm";
|
|
3
|
+
import { calculateAngle, transformCartesianToWGS84, transformWGS84ToCartesian } from "./coordinate";
|
|
22
4
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* @returns
|
|
26
|
-
*/
|
|
27
|
-
var newSessionid = function newSessionid(num) {
|
|
28
|
-
var len = num || 32;
|
|
29
|
-
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
30
|
-
var maxPos = chars.length;
|
|
31
|
-
var pwd = '';
|
|
32
|
-
for (var i = 0; i < len; i++) {
|
|
33
|
-
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
|
|
34
|
-
}
|
|
35
|
-
return pwd;
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* 锁定视图
|
|
39
|
-
* @param viewer - 三维场景
|
|
40
|
-
* @param bool - 是否锁定
|
|
41
|
-
*/
|
|
42
|
-
var lockingMap = function lockingMap(viewer, bool) {
|
|
43
|
-
// 如果为真,则允许用户旋转相机。如果为假,相机将锁定到当前标题。此标志仅适用于2D和3D。
|
|
44
|
-
viewer.scene.screenSpaceCameraController.enableRotate = bool;
|
|
45
|
-
// 如果为true,则允许用户平移地图。如果为假,相机将保持锁定在当前位置。此标志仅适用于2D和Columbus视图模式。
|
|
46
|
-
viewer.scene.screenSpaceCameraController.enableTranslate = bool;
|
|
47
|
-
// 如果为真,允许用户放大和缩小。如果为假,相机将锁定到距离椭圆体的当前距离
|
|
48
|
-
viewer.scene.screenSpaceCameraController.enableZoom = bool;
|
|
49
|
-
// 如果为真,则允许用户倾斜相机。如果为假,相机将锁定到当前标题。这个标志只适用于3D和哥伦布视图。
|
|
50
|
-
viewer.scene.screenSpaceCameraController.enableTilt = bool;
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* 创建贝塞尔点集
|
|
54
|
-
* @param anchorpoints
|
|
55
|
-
* @returns
|
|
5
|
+
* 根据控制点生成贝塞尔曲线点集。
|
|
6
|
+
* 输入为 Cesium.Cartesian3 控制点,输出同样为 Cartesian3 点集。
|
|
56
7
|
*/
|
|
57
8
|
var createBezierPoints = function createBezierPoints(anchorpoints) {
|
|
58
9
|
var degrees = [];
|
|
@@ -69,47 +20,9 @@ var createBezierPoints = function createBezierPoints(anchorpoints) {
|
|
|
69
20
|
}
|
|
70
21
|
return points;
|
|
71
22
|
};
|
|
23
|
+
|
|
72
24
|
/**
|
|
73
|
-
*
|
|
74
|
-
* @param centerPoint
|
|
75
|
-
* @param endCartesian
|
|
76
|
-
* @param num
|
|
77
|
-
* @returns
|
|
78
|
-
*/
|
|
79
|
-
var getRegularPoints = function getRegularPoints(centerPoint, endCartesian, num) {
|
|
80
|
-
var _geometry$attributes$;
|
|
81
|
-
var centerP = transformCartesianToWGS84(centerPoint);
|
|
82
|
-
var distance = 1;
|
|
83
|
-
if (endCartesian) {
|
|
84
|
-
var endDegree = transformCartesianToWGS84(endCartesian);
|
|
85
|
-
distance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(centerP.x, centerP.y, 0), Cesium.Cartesian3.fromDegrees(endDegree.x, endDegree.y, 0));
|
|
86
|
-
}
|
|
87
|
-
var ellipse = new Cesium.EllipseOutlineGeometry({
|
|
88
|
-
center: centerPoint,
|
|
89
|
-
semiMajorAxis: distance,
|
|
90
|
-
semiMinorAxis: distance,
|
|
91
|
-
granularity: 0.0001 //0~1 圆的弧度角,该值非常重要,默认值0.02,如果绘制性能下降,适当调高该值可以提高性能
|
|
92
|
-
});
|
|
93
|
-
var geometry = Cesium.EllipseOutlineGeometry.createGeometry(ellipse);
|
|
94
|
-
var circlePoints = [];
|
|
95
|
-
var values = geometry === null || geometry === void 0 || (_geometry$attributes$ = geometry.attributes.position) === null || _geometry$attributes$ === void 0 ? void 0 : _geometry$attributes$.values;
|
|
96
|
-
if (!values) return;
|
|
97
|
-
var posNum = values.length / 3; //数组中以笛卡尔坐标进行存储(每3个值一个坐标)
|
|
98
|
-
for (var i = 0; i < posNum; i++) {
|
|
99
|
-
var curPos = new Cesium.Cartesian3(values[i * 3], values[i * 3 + 1], values[i * 3 + 2]);
|
|
100
|
-
circlePoints.push(curPos);
|
|
101
|
-
}
|
|
102
|
-
var resultPoints = [];
|
|
103
|
-
var pointsapart = Math.floor(circlePoints.length / num);
|
|
104
|
-
for (var j = 0; j < num; j++) {
|
|
105
|
-
resultPoints.push(circlePoints[j * pointsapart]);
|
|
106
|
-
}
|
|
107
|
-
return resultPoints;
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* 创建攻击箭头节点
|
|
111
|
-
* @param positions
|
|
112
|
-
* @returns
|
|
25
|
+
* 根据控制点计算攻击箭头面顶点。
|
|
113
26
|
*/
|
|
114
27
|
var getAttackArrowPoints = function getAttackArrowPoints(positions) {
|
|
115
28
|
var lnglatArr = [];
|
|
@@ -125,9 +38,7 @@ var getAttackArrowPoints = function getAttackArrowPoints(positions) {
|
|
|
125
38
|
};
|
|
126
39
|
|
|
127
40
|
/**
|
|
128
|
-
*
|
|
129
|
-
* @param anchorpoints
|
|
130
|
-
* @returns
|
|
41
|
+
* 根据控制点计算直角箭头面顶点。
|
|
131
42
|
*/
|
|
132
43
|
var getRightAngleArrowPoints = function getRightAngleArrowPoints(anchorpoints) {
|
|
133
44
|
var degreePoints = [];
|
|
@@ -142,6 +53,10 @@ var getRightAngleArrowPoints = function getRightAngleArrowPoints(anchorpoints) {
|
|
|
142
53
|
});
|
|
143
54
|
return Cesium.Cartesian3.fromDegreesArray(degreesArray);
|
|
144
55
|
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 构建直角箭头多控制点情况下的左右边界与箭头头部。
|
|
59
|
+
*/
|
|
145
60
|
function calculateMorePoints(anchorpoints) {
|
|
146
61
|
var ratio = 6;
|
|
147
62
|
var pointsR;
|
|
@@ -150,27 +65,25 @@ function calculateMorePoints(anchorpoints) {
|
|
|
150
65
|
pointS,
|
|
151
66
|
pointE;
|
|
152
67
|
for (var i = 0; i < anchorpoints.length - 1; i++) {
|
|
153
|
-
pointS = anchorpoints[i];
|
|
68
|
+
pointS = anchorpoints[i];
|
|
154
69
|
pointE = anchorpoints[i + 1];
|
|
155
70
|
l += Math.sqrt((pointE.y - pointS.y) * (pointE.y - pointS.y) + (pointE.x - pointS.x) * (pointE.x - pointS.x));
|
|
156
71
|
}
|
|
157
72
|
var w = l / ratio;
|
|
158
|
-
var points_C_l = [];
|
|
73
|
+
var points_C_l = [];
|
|
159
74
|
var points_C_r = [];
|
|
160
75
|
var point_t_l = {
|
|
161
76
|
x: undefined,
|
|
162
77
|
y: undefined
|
|
163
|
-
};
|
|
78
|
+
};
|
|
164
79
|
var point_t_r = {
|
|
165
80
|
x: undefined,
|
|
166
81
|
y: undefined
|
|
167
82
|
};
|
|
168
|
-
//计算中间的所有交点
|
|
169
83
|
for (var j = 0; j < anchorpoints.length - 2; j++) {
|
|
170
|
-
var pointU_1 = anchorpoints[j];
|
|
171
|
-
var pointU_2 = anchorpoints[j + 1];
|
|
172
|
-
var pointU_3 = anchorpoints[j + 2];
|
|
173
|
-
//计算向量
|
|
84
|
+
var pointU_1 = anchorpoints[j];
|
|
85
|
+
var pointU_2 = anchorpoints[j + 1];
|
|
86
|
+
var pointU_3 = anchorpoints[j + 2];
|
|
174
87
|
var v_U_1_2 = {
|
|
175
88
|
x: pointU_2.x - pointU_1.x,
|
|
176
89
|
y: pointU_2.y - pointU_1.y
|
|
@@ -185,7 +98,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
185
98
|
var v_lr_2_3 = calculateVector(v_U_2_3, Math.PI / 2, w / 2);
|
|
186
99
|
var v_l_2_3 = v_lr_2_3[0];
|
|
187
100
|
var v_r_2_3 = v_lr_2_3[1];
|
|
188
|
-
//获取左右
|
|
189
101
|
var point_l_1 = {
|
|
190
102
|
x: pointU_1.x + (v_l_1_2 === null || v_l_1_2 === void 0 ? void 0 : v_l_1_2.x),
|
|
191
103
|
y: pointU_1.y + (v_l_1_2 === null || v_l_1_2 === void 0 ? void 0 : v_l_1_2.y)
|
|
@@ -202,21 +114,13 @@ function calculateMorePoints(anchorpoints) {
|
|
|
202
114
|
x: pointU_2.x + (v_r_2_3 === null || v_r_2_3 === void 0 ? void 0 : v_r_2_3.x),
|
|
203
115
|
y: pointU_2.y + (v_r_2_3 === null || v_r_2_3 === void 0 ? void 0 : v_r_2_3.y)
|
|
204
116
|
};
|
|
205
|
-
//向量v_U_1_2和向量v-point_l_1和point_r_1是平行的
|
|
206
|
-
//如果向量a=(x1,y1),b=(x2,y2),则a//b等价于x1y2-x2y1=0
|
|
207
|
-
//得到(x-point_l_1.x)*v_U_1_2.y=v_U_1_2.x*(y-point_l_1.y)
|
|
208
|
-
//得到(point_l_2.x-x)*v_U_2_3.y=v_U_2_3.x*(point_l_2.y-y)
|
|
209
|
-
//可以求出坐边的交点(x,y),即控制点
|
|
210
117
|
var point_C_l = calculateIntersection(v_U_1_2, v_U_2_3, point_l_1, point_l_2);
|
|
211
118
|
var point_C_r = calculateIntersection(v_U_1_2, v_U_2_3, point_r_1, point_r_2);
|
|
212
|
-
//定义中间的控制点
|
|
213
119
|
var point_C_l_c = void 0;
|
|
214
120
|
var point_C_r_c = void 0;
|
|
215
121
|
if (j == 0) {
|
|
216
|
-
//记录下箭头尾部的左右两个端点
|
|
217
122
|
point_t_l = point_l_1;
|
|
218
123
|
point_t_r = point_r_1;
|
|
219
|
-
//计算第一个曲线控制点
|
|
220
124
|
point_C_l_c = {
|
|
221
125
|
x: (point_t_l.x + point_C_l.x) / 2,
|
|
222
126
|
y: (point_t_l.y + point_C_l.y) / 2
|
|
@@ -225,14 +129,11 @@ function calculateMorePoints(anchorpoints) {
|
|
|
225
129
|
x: (point_t_r.x + point_C_r.x) / 2,
|
|
226
130
|
y: (point_t_r.y + point_C_r.y) / 2
|
|
227
131
|
};
|
|
228
|
-
//添加两个拐角控制点中间的中间控制点
|
|
229
132
|
points_C_l.push(point_C_l_c);
|
|
230
133
|
points_C_r.push(point_C_r_c);
|
|
231
134
|
} else {
|
|
232
|
-
//获取前一个拐角控制点
|
|
233
135
|
var point_C_l_q = points_C_l[points_C_l.length - 1];
|
|
234
136
|
var point_C_r_q = points_C_r[points_C_r.length - 1];
|
|
235
|
-
//计算两个拐角之间的中心控制点
|
|
236
137
|
point_C_l_c = {
|
|
237
138
|
x: (point_C_l_q.x + point_C_l.x) / 2,
|
|
238
139
|
y: (point_C_l_q.y + point_C_l.y) / 2
|
|
@@ -241,28 +142,21 @@ function calculateMorePoints(anchorpoints) {
|
|
|
241
142
|
x: (point_C_r_q.x + point_C_r.x) / 2,
|
|
242
143
|
y: (point_C_r_q.y + point_C_r.y) / 2
|
|
243
144
|
};
|
|
244
|
-
//添加两个拐角控制点中间的中间控制点
|
|
245
145
|
points_C_l.push(point_C_l_c);
|
|
246
146
|
points_C_r.push(point_C_r_c);
|
|
247
147
|
}
|
|
248
|
-
//添加后面的拐角控制点
|
|
249
148
|
points_C_l.push(point_C_l);
|
|
250
149
|
points_C_r.push(point_C_r);
|
|
251
150
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
//计算一下头部的长度
|
|
255
|
-
var pointU_E2 = anchorpoints[anchorpoints.length - 2]; //倒数第二个用户点
|
|
256
|
-
var pointU_E1 = anchorpoints[anchorpoints.length - 1]; //最后一个用户点
|
|
151
|
+
var pointU_E2 = anchorpoints[anchorpoints.length - 2];
|
|
152
|
+
var pointU_E1 = anchorpoints[anchorpoints.length - 1];
|
|
257
153
|
var v_U_E2_E1 = {
|
|
258
154
|
x: pointU_E1.x - pointU_E2.x,
|
|
259
155
|
y: pointU_E1.y - pointU_E2.y
|
|
260
156
|
};
|
|
261
157
|
var head_d = Math.sqrt(v_U_E2_E1.x * v_U_E2_E1.x + v_U_E2_E1.y * v_U_E2_E1.y);
|
|
262
|
-
//定义头部的左右两结束点
|
|
263
158
|
var point_h_l;
|
|
264
159
|
var point_h_r;
|
|
265
|
-
//头部左右两向量数组
|
|
266
160
|
var v_lr_h = [];
|
|
267
161
|
var v_l_h = {
|
|
268
162
|
x: undefined,
|
|
@@ -272,7 +166,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
272
166
|
x: undefined,
|
|
273
167
|
y: undefined
|
|
274
168
|
};
|
|
275
|
-
//定义曲线最后一个控制点,也就是头部结束点和最后一个拐角点的中点
|
|
276
169
|
var point_C_l_e = {
|
|
277
170
|
x: undefined,
|
|
278
171
|
y: undefined
|
|
@@ -281,7 +174,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
281
174
|
x: undefined,
|
|
282
175
|
y: undefined
|
|
283
176
|
};
|
|
284
|
-
//定义三角形的左右两个点
|
|
285
177
|
var point_triangle_l = {
|
|
286
178
|
x: undefined,
|
|
287
179
|
y: undefined
|
|
@@ -290,15 +182,12 @@ function calculateMorePoints(anchorpoints) {
|
|
|
290
182
|
x: undefined,
|
|
291
183
|
y: undefined
|
|
292
184
|
};
|
|
293
|
-
//获取当前的最后的控制点,也就是之前计算的拐角点
|
|
294
185
|
var point_C_l_eq = points_C_l[points_C_l.length - 1];
|
|
295
186
|
var point_C_r_eq = points_C_r[points_C_r.length - 1];
|
|
296
|
-
//三角的高度都不够
|
|
297
187
|
if (head_d <= w) {
|
|
298
188
|
v_lr_h = calculateVector(v_U_E2_E1, Math.PI / 2, w / 2);
|
|
299
189
|
v_l_h = v_lr_h[0];
|
|
300
190
|
v_r_h = v_lr_h[1];
|
|
301
|
-
//获取头部的左右两结束点
|
|
302
191
|
point_h_l = {
|
|
303
192
|
x: pointU_E2.x + v_l_h.x,
|
|
304
193
|
y: pointU_E2.y + v_l_h.y
|
|
@@ -307,7 +196,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
307
196
|
x: pointU_E2.x + v_r_h.x,
|
|
308
197
|
y: pointU_E2.y + v_r_h.y
|
|
309
198
|
};
|
|
310
|
-
//计算最后的控制点
|
|
311
199
|
point_C_l_e = {
|
|
312
200
|
x: (point_C_l_eq.x + point_h_l.x) / 2,
|
|
313
201
|
y: (point_C_l_eq.y + point_h_l.y) / 2
|
|
@@ -316,10 +204,8 @@ function calculateMorePoints(anchorpoints) {
|
|
|
316
204
|
x: (point_C_r_eq.x + point_h_r.x) / 2,
|
|
317
205
|
y: (point_C_r_eq.y + point_h_r.y) / 2
|
|
318
206
|
};
|
|
319
|
-
//添加最后的控制点(中心点)
|
|
320
207
|
points_C_l.push(point_C_l_e);
|
|
321
208
|
points_C_r.push(point_C_r_e);
|
|
322
|
-
//计算三角形的左右两点
|
|
323
209
|
point_triangle_l = {
|
|
324
210
|
x: 2 * point_h_l.x - pointU_E2.x,
|
|
325
211
|
y: 2 * point_h_l.y - pointU_E2.y
|
|
@@ -328,27 +214,19 @@ function calculateMorePoints(anchorpoints) {
|
|
|
328
214
|
x: 2 * point_h_r.x - pointU_E2.x,
|
|
329
215
|
y: 2 * point_h_r.y - pointU_E2.y
|
|
330
216
|
};
|
|
331
|
-
}
|
|
332
|
-
//足够三角的高度
|
|
333
|
-
else {
|
|
334
|
-
//由于够了三角的高度,所以首先去掉三角的高度
|
|
335
|
-
//计算向量
|
|
217
|
+
} else {
|
|
336
218
|
var v_E2_E1 = {
|
|
337
219
|
x: pointU_E1.x - pointU_E2.x,
|
|
338
220
|
y: pointU_E1.y - pointU_E2.y
|
|
339
221
|
};
|
|
340
|
-
//取模
|
|
341
222
|
var v_E2_E1_d = Math.sqrt(v_E2_E1.x * v_E2_E1.x + v_E2_E1.y * v_E2_E1.y);
|
|
342
|
-
//首先需要计算三角形的底部中心点
|
|
343
223
|
var point_c = {
|
|
344
224
|
x: pointU_E1.x - v_E2_E1.x * w / v_E2_E1_d,
|
|
345
225
|
y: pointU_E1.y - v_E2_E1.y * w / v_E2_E1_d
|
|
346
226
|
};
|
|
347
|
-
//计算出在三角形上底边上头部结束点
|
|
348
227
|
v_lr_h = calculateVector(v_U_E2_E1, Math.PI / 2, w / 2);
|
|
349
228
|
v_l_h = v_lr_h[0];
|
|
350
229
|
v_r_h = v_lr_h[1];
|
|
351
|
-
//获取头部的左右两结束点
|
|
352
230
|
point_h_l = {
|
|
353
231
|
x: point_c.x + v_l_h.x,
|
|
354
232
|
y: point_c.y + v_l_h.y
|
|
@@ -357,7 +235,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
357
235
|
x: point_c.x + v_r_h.x,
|
|
358
236
|
y: point_c.y + v_r_h.y
|
|
359
237
|
};
|
|
360
|
-
//计算最后的控制点
|
|
361
238
|
point_C_l_e = {
|
|
362
239
|
x: (point_C_l_eq.x + point_h_l.x) / 2,
|
|
363
240
|
y: (point_C_l_eq.y + point_h_l.y) / 2
|
|
@@ -366,10 +243,8 @@ function calculateMorePoints(anchorpoints) {
|
|
|
366
243
|
x: (point_C_r_eq.x + point_h_r.x) / 2,
|
|
367
244
|
y: (point_C_r_eq.y + point_h_r.y) / 2
|
|
368
245
|
};
|
|
369
|
-
//添加最后的控制点(中心点)
|
|
370
246
|
points_C_l.push(point_C_l_e);
|
|
371
247
|
points_C_r.push(point_C_r_e);
|
|
372
|
-
//计算三角形的左右点
|
|
373
248
|
point_triangle_l = {
|
|
374
249
|
x: 2 * point_h_l.x - point_c.x,
|
|
375
250
|
y: 2 * point_h_l.y - point_c.y
|
|
@@ -379,8 +254,6 @@ function calculateMorePoints(anchorpoints) {
|
|
|
379
254
|
y: 2 * point_h_r.y - point_c.y
|
|
380
255
|
};
|
|
381
256
|
}
|
|
382
|
-
//使用控制点计算差值
|
|
383
|
-
//计算贝塞尔的控制点
|
|
384
257
|
var points_BC_l = [],
|
|
385
258
|
points_BC_r = [];
|
|
386
259
|
for (var _i = 0; _i < points_C_l.length - 2; _i++) {
|
|
@@ -399,50 +272,39 @@ function calculateMorePoints(anchorpoints) {
|
|
|
399
272
|
points_BC_l = points_BC_l.concat(points_temp_l);
|
|
400
273
|
points_BC_r = points_BC_r.concat(points_temp_r);
|
|
401
274
|
}
|
|
402
|
-
//组合左右点集和三角形三个点
|
|
403
275
|
pointsR = [point_t_l];
|
|
404
|
-
//首先连接左边的差值曲线
|
|
405
276
|
pointsR = pointsR.concat(points_BC_l);
|
|
406
|
-
//添加左边头部结束点
|
|
407
277
|
pointsR.push(point_h_l);
|
|
408
|
-
//添加三角形左边点
|
|
409
278
|
pointsR.push(point_triangle_l);
|
|
410
|
-
//添加三角形顶点
|
|
411
279
|
pointsR.push(pointU_E1);
|
|
412
|
-
//添加三角形右边点
|
|
413
280
|
pointsR.push(point_triangle_r);
|
|
414
|
-
//添加右边头部结束点
|
|
415
281
|
pointsR.push(point_h_r);
|
|
416
|
-
//合并右边的所有点(先把右边的点倒序)
|
|
417
282
|
pointsR = pointsR.concat(points_BC_r.reverse());
|
|
418
|
-
|
|
419
|
-
//添加右边尾部起始点
|
|
420
283
|
pointsR.push(point_t_r);
|
|
421
284
|
} else {
|
|
422
285
|
pointsR = calculateTwoPoints(anchorpoints);
|
|
423
286
|
}
|
|
424
287
|
return pointsR;
|
|
425
288
|
}
|
|
289
|
+
|
|
426
290
|
/**
|
|
427
|
-
*
|
|
428
|
-
*
|
|
429
|
-
* @param type 1-平尾直角;2-燕尾直角
|
|
430
|
-
* @returns
|
|
291
|
+
* 构建双点控制下的基础箭头骨架。
|
|
292
|
+
* type: 1-平尾直角箭头,2-燕尾直角箭头。
|
|
431
293
|
*/
|
|
432
294
|
function calculateTwoPoints(anchorpoints) {
|
|
433
295
|
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
434
296
|
var ratio = 6;
|
|
435
|
-
var pointS = anchorpoints[0];
|
|
436
|
-
var pointE = anchorpoints[1];
|
|
297
|
+
var pointS = anchorpoints[0];
|
|
298
|
+
var pointE = anchorpoints[1];
|
|
437
299
|
var controlPois = [];
|
|
438
300
|
var v_based = {
|
|
439
301
|
x: pointE.x - pointS.x,
|
|
440
302
|
y: pointE.y - pointS.y
|
|
441
|
-
};
|
|
442
|
-
var l = Math.sqrt((pointE.x - pointS.x) * (pointE.x - pointS.x) + (pointE.y - pointS.y) * (pointE.y - pointS.y));
|
|
443
|
-
var w = l / ratio;
|
|
444
|
-
var x_ = pointS.x + 5 * (pointE.x - pointS.x) / ratio;
|
|
445
|
-
var y_ = pointS.y + 5 * (pointE.y - pointS.y) / ratio;
|
|
303
|
+
};
|
|
304
|
+
var l = Math.sqrt((pointE.x - pointS.x) * (pointE.x - pointS.x) + (pointE.y - pointS.y) * (pointE.y - pointS.y));
|
|
305
|
+
var w = l / ratio;
|
|
306
|
+
var x_ = pointS.x + 5 * (pointE.x - pointS.x) / ratio;
|
|
307
|
+
var y_ = pointS.y + 5 * (pointE.y - pointS.y) / ratio;
|
|
446
308
|
var v_lr = calculateVector(v_based, Math.PI / 2, w / 2);
|
|
447
309
|
var v_l = v_lr[0];
|
|
448
310
|
var v_r = v_lr[1];
|
|
@@ -490,6 +352,10 @@ function calculateTwoPoints(anchorpoints) {
|
|
|
490
352
|
}
|
|
491
353
|
return controlPois;
|
|
492
354
|
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* 计算向量左右两侧的偏移向量。
|
|
358
|
+
*/
|
|
493
359
|
function calculateVector(v, theta, d) {
|
|
494
360
|
if (!theta) theta = Math.PI / 2;
|
|
495
361
|
if (!d) d = 1;
|
|
@@ -549,6 +415,10 @@ function calculateVector(v, theta, d) {
|
|
|
549
415
|
}
|
|
550
416
|
return [v_l, v_r];
|
|
551
417
|
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* 计算两条方向线的交点。
|
|
421
|
+
*/
|
|
552
422
|
function calculateIntersection(v_1, v_2, point1, point2) {
|
|
553
423
|
var x;
|
|
554
424
|
var y;
|
|
@@ -561,7 +431,6 @@ function calculateIntersection(v_1, v_2, point1, point2) {
|
|
|
561
431
|
y = point2.y;
|
|
562
432
|
}
|
|
563
433
|
} else {
|
|
564
|
-
//
|
|
565
434
|
x = (v_1.x * v_2.x * (point2.y - point1.y) + point1.x * v_1.y * v_2.x - point2.x * v_2.y * v_1.x) / (v_1.y * v_2.x - v_1.x * v_2.y);
|
|
566
435
|
if (v_1.x != 0) {
|
|
567
436
|
y = (x - point1.x) * v_1.y / v_1.x + point1.y;
|
|
@@ -576,19 +445,15 @@ function calculateIntersection(v_1, v_2, point1, point2) {
|
|
|
576
445
|
}
|
|
577
446
|
|
|
578
447
|
/**
|
|
579
|
-
*
|
|
580
|
-
* @param anchorpoints
|
|
581
|
-
* @param t
|
|
582
|
-
* @returns - {{x: number, y: number}}
|
|
583
|
-
* @private
|
|
448
|
+
* 计算贝塞尔曲线参数点。
|
|
584
449
|
*/
|
|
585
450
|
var computeBezierPoints = function computeBezierPoints(anchorpoints, t) {
|
|
586
451
|
var x = 0,
|
|
587
452
|
y = 0;
|
|
588
|
-
var
|
|
453
|
+
var binomialCoefficient = computeBinomial(anchorpoints);
|
|
589
454
|
for (var j = 0; j < anchorpoints.length; j++) {
|
|
590
455
|
var tempPoint = anchorpoints[j];
|
|
591
|
-
var coefficient = Math.pow(1 - t, anchorpoints.length - 1 - j) * Math.pow(t, j) *
|
|
456
|
+
var coefficient = Math.pow(1 - t, anchorpoints.length - 1 - j) * Math.pow(t, j) * binomialCoefficient[j];
|
|
592
457
|
x += tempPoint.x * coefficient;
|
|
593
458
|
y += tempPoint.y * coefficient;
|
|
594
459
|
}
|
|
@@ -597,16 +462,14 @@ var computeBezierPoints = function computeBezierPoints(anchorpoints, t) {
|
|
|
597
462
|
y: y
|
|
598
463
|
};
|
|
599
464
|
};
|
|
465
|
+
|
|
600
466
|
/**
|
|
601
|
-
*
|
|
602
|
-
* @param anchorpoints
|
|
603
|
-
* @returns - {Array}
|
|
604
|
-
* @private
|
|
467
|
+
* 计算贝塞尔曲线的二项式系数。
|
|
605
468
|
*/
|
|
606
469
|
var computeBinomial = function computeBinomial(anchorpoints) {
|
|
607
470
|
var lens = anchorpoints.length;
|
|
608
|
-
var
|
|
609
|
-
|
|
471
|
+
var binomialCoefficient = [];
|
|
472
|
+
binomialCoefficient.push(1);
|
|
610
473
|
for (var k = 1; k < lens - 1; k++) {
|
|
611
474
|
var cs = 1,
|
|
612
475
|
bcs = 1;
|
|
@@ -614,24 +477,21 @@ var computeBinomial = function computeBinomial(anchorpoints) {
|
|
|
614
477
|
cs = cs * (lens - 1 - m);
|
|
615
478
|
bcs = bcs * (k - m);
|
|
616
479
|
}
|
|
617
|
-
|
|
480
|
+
binomialCoefficient.push(cs / bcs);
|
|
618
481
|
}
|
|
619
|
-
|
|
620
|
-
return
|
|
482
|
+
binomialCoefficient.push(1);
|
|
483
|
+
return binomialCoefficient;
|
|
621
484
|
};
|
|
622
485
|
|
|
623
486
|
/**
|
|
624
|
-
*
|
|
625
|
-
* @param points
|
|
626
|
-
* @returns
|
|
487
|
+
* 计算圆/椭圆的半长轴长度。
|
|
627
488
|
*/
|
|
628
489
|
var getSemiAxis = function getSemiAxis(points) {
|
|
629
490
|
return points.length === 2 ? Cesium.Cartesian3.distance(points[0], points[1]) : 0;
|
|
630
491
|
};
|
|
492
|
+
|
|
631
493
|
/**
|
|
632
|
-
*
|
|
633
|
-
* @param points
|
|
634
|
-
* @returns
|
|
494
|
+
* 计算椭圆长轴相对正北方向的旋转角。
|
|
635
495
|
*/
|
|
636
496
|
var getEllipticAngle = function getEllipticAngle(points) {
|
|
637
497
|
var p1 = transformCartesianToWGS84(points[0]);
|
|
@@ -641,21 +501,8 @@ var getEllipticAngle = function getEllipticAngle(points) {
|
|
|
641
501
|
};
|
|
642
502
|
|
|
643
503
|
/**
|
|
644
|
-
*
|
|
645
|
-
*
|
|
646
|
-
* @returns
|
|
647
|
-
*/
|
|
648
|
-
var calculateRectanglePoints = function calculateRectanglePoints(points) {
|
|
649
|
-
var p1 = transformCartesianToWGS84(points[0]);
|
|
650
|
-
var p2 = points[1] ? transformCartesianToWGS84(points[1]) : p1;
|
|
651
|
-
return Cesium.Cartesian3.fromDegreesArray([p1.x, p1.y, p2.x, p1.y, p2.x, p2.y, p1.x, p2.y]);
|
|
652
|
-
};
|
|
653
|
-
|
|
654
|
-
/**
|
|
655
|
-
* 计算集结地特征点
|
|
656
|
-
* @param anchorpoints
|
|
657
|
-
* @returns {Array}
|
|
658
|
-
* @private
|
|
504
|
+
* 计算集结地面的闭合曲线顶点。
|
|
505
|
+
* 返回值为经纬高扁平数组:[lng, lat, 0, ...]。
|
|
659
506
|
*/
|
|
660
507
|
var computeAssemblePoints = function computeAssemblePoints(anchorpoints) {
|
|
661
508
|
var points = [];
|
|
@@ -704,40 +551,26 @@ var computeAssemblePoints = function computeAssemblePoints(anchorpoints) {
|
|
|
704
551
|
}
|
|
705
552
|
return result;
|
|
706
553
|
};
|
|
554
|
+
|
|
707
555
|
/**
|
|
708
|
-
*
|
|
709
|
-
* @param points
|
|
710
|
-
* @returns {*}
|
|
556
|
+
* 为闭合形状生成 Cardinal 样条控制点。
|
|
711
557
|
*/
|
|
712
558
|
function createCloseCardinal(points) {
|
|
713
559
|
if (points == null || points.length < 3) {
|
|
714
560
|
return points;
|
|
715
561
|
}
|
|
716
|
-
//获取起点,作为终点,以闭合曲线。
|
|
717
562
|
var lastP = points[0];
|
|
718
563
|
points.push(lastP);
|
|
719
|
-
//定义传入的点数组,将在点数组中央(每两个点)插入两个控制点
|
|
720
564
|
var cPoints = points;
|
|
721
|
-
//包含输入点和控制点的数组
|
|
722
565
|
var cardinalPoints = [];
|
|
723
|
-
//至少三个点以上
|
|
724
|
-
//这些都是相关资料测出的经验数值
|
|
725
|
-
//定义张力系数,取值在0<t<0.5
|
|
726
566
|
var t = 0.4;
|
|
727
|
-
//为端点张力系数因子,取值在0<b<1
|
|
728
|
-
// let b = 0.5;
|
|
729
|
-
//误差控制,是一个大于等于0的数,用于三点非常趋近与一条直线时,减少计算量
|
|
730
567
|
var e = 0.005;
|
|
731
|
-
//传入的点数量,至少有三个,n至少为2
|
|
732
568
|
var n = cPoints.length - 1;
|
|
733
|
-
//从开始遍历到倒数第二个,其中倒数第二个用于计算起点(终点)的插值控制点
|
|
734
569
|
for (var k = 0; k <= n - 1; k++) {
|
|
735
570
|
var p0 = void 0,
|
|
736
571
|
p1 = void 0,
|
|
737
572
|
p2 = void 0;
|
|
738
|
-
//计算起点(终点)的左右控制点
|
|
739
573
|
if (k == n - 1) {
|
|
740
|
-
//三个基础输入点
|
|
741
574
|
p0 = cPoints[n - 1];
|
|
742
575
|
p1 = cPoints[0];
|
|
743
576
|
p2 = cPoints[1];
|
|
@@ -746,7 +579,6 @@ function createCloseCardinal(points) {
|
|
|
746
579
|
p1 = cPoints[k + 1];
|
|
747
580
|
p2 = cPoints[k + 2];
|
|
748
581
|
}
|
|
749
|
-
//定义p1的左控制点和右控制点
|
|
750
582
|
var p1l = {
|
|
751
583
|
x: undefined,
|
|
752
584
|
y: undefined
|
|
@@ -755,8 +587,6 @@ function createCloseCardinal(points) {
|
|
|
755
587
|
x: undefined,
|
|
756
588
|
y: undefined
|
|
757
589
|
};
|
|
758
|
-
//通过p0、p1、p2计算p1点的做控制点p1l和又控制点p1r
|
|
759
|
-
//计算向量p0_p1和p1_p2
|
|
760
590
|
var p0_p1 = {
|
|
761
591
|
x: p1.x - p0.x,
|
|
762
592
|
y: p1.y - p0.y
|
|
@@ -765,10 +595,8 @@ function createCloseCardinal(points) {
|
|
|
765
595
|
x: p2.x - p1.x,
|
|
766
596
|
y: p2.y - p1.y
|
|
767
597
|
};
|
|
768
|
-
//并计算模
|
|
769
598
|
var d01 = Math.sqrt(p0_p1.x * p0_p1.x + p0_p1.y * p0_p1.y);
|
|
770
599
|
var d12 = Math.sqrt(p1_p2.x * p1_p2.x + p1_p2.y * p1_p2.y);
|
|
771
|
-
//向量单位化
|
|
772
600
|
var p0_p1_1 = {
|
|
773
601
|
x: p0_p1.x / d01,
|
|
774
602
|
y: p0_p1.y / d01
|
|
@@ -777,46 +605,33 @@ function createCloseCardinal(points) {
|
|
|
777
605
|
x: p1_p2.x / d12,
|
|
778
606
|
y: p1_p2.y / d12
|
|
779
607
|
};
|
|
780
|
-
//计算向量p0_p1和p1_p2的夹角平分线向量
|
|
781
608
|
var p0_p1_p2 = {
|
|
782
609
|
x: p0_p1_1.x + p1_p2_1.x,
|
|
783
610
|
y: p0_p1_1.y + p1_p2_1.y
|
|
784
611
|
};
|
|
785
|
-
//计算向量 p0_p1_p2 的模
|
|
786
612
|
var d012 = Math.sqrt(p0_p1_p2.x * p0_p1_p2.x + p0_p1_p2.y * p0_p1_p2.y);
|
|
787
|
-
//单位化向量p0_p1_p2
|
|
788
613
|
var p0_p1_p2_1 = {
|
|
789
614
|
x: p0_p1_p2.x / d012,
|
|
790
615
|
y: p0_p1_p2.y / d012
|
|
791
616
|
};
|
|
792
|
-
//判断p0、p1、p2是否共线,这里判定向量p0_p1和p1_p2的夹角的余弦和1的差值小于e就认为三点共线
|
|
793
617
|
var cosE_p0p1p2 = (p0_p1_1.x * p1_p2_1.x + p0_p1_1.y * p1_p2_1.y) / 1;
|
|
794
|
-
//共线
|
|
795
618
|
if (Math.abs(1 - cosE_p0p1p2) < e) {
|
|
796
|
-
//计算p1l的坐标
|
|
797
619
|
p1l.x = p1.x - p1_p2_1.x * d01 * t;
|
|
798
620
|
p1l.y = p1.y - p1_p2_1.y * d01 * t;
|
|
799
|
-
//计算p1r的坐标
|
|
800
621
|
p1r.x = p1.x + p0_p1_1.x * d12 * t;
|
|
801
622
|
p1r.y = p1.y + p0_p1_1.y * d12 * t;
|
|
802
|
-
}
|
|
803
|
-
//非共线
|
|
804
|
-
else {
|
|
805
|
-
//计算p1l的坐标
|
|
623
|
+
} else {
|
|
806
624
|
p1l.x = p1.x - p0_p1_p2_1.x * d01 * t;
|
|
807
625
|
p1l.y = p1.y - p0_p1_p2_1.y * d01 * t;
|
|
808
|
-
//计算p1r的坐标
|
|
809
626
|
p1r.x = p1.x + p0_p1_p2_1.x * d12 * t;
|
|
810
627
|
p1r.y = p1.y + p0_p1_p2_1.y * d12 * t;
|
|
811
628
|
}
|
|
812
|
-
//记录起点(终点)的左右插值控制点及倒数第二个控制点
|
|
813
629
|
if (k == n - 1) {
|
|
814
630
|
cardinalPoints[0] = p1;
|
|
815
631
|
cardinalPoints[1] = p1r;
|
|
816
632
|
cardinalPoints[(n - 2) * 3 + 2 + 3] = p1l;
|
|
817
633
|
cardinalPoints[(n - 2) * 3 + 2 + 4] = cPoints[n];
|
|
818
634
|
} else {
|
|
819
|
-
//记录下这三个控制点
|
|
820
635
|
cardinalPoints[k * 3 + 2 + 0] = p1l;
|
|
821
636
|
cardinalPoints[k * 3 + 2 + 1] = p1;
|
|
822
637
|
cardinalPoints[k * 3 + 2 + 2] = p1r;
|
|
@@ -824,32 +639,24 @@ function createCloseCardinal(points) {
|
|
|
824
639
|
}
|
|
825
640
|
return cardinalPoints;
|
|
826
641
|
}
|
|
642
|
+
|
|
827
643
|
/**
|
|
828
|
-
*
|
|
829
|
-
* @param points
|
|
830
|
-
* @param part
|
|
831
|
-
* @returns {Array}
|
|
644
|
+
* 根据三次贝塞尔控制点插值生成闭合曲线点集。
|
|
832
645
|
*/
|
|
833
646
|
function calculatePointsFBZ3(points, part) {
|
|
834
647
|
if (!part) part = 20;
|
|
835
|
-
//获取待拆分的点
|
|
836
648
|
var bezierPts = [];
|
|
837
649
|
var scale = 0.05;
|
|
838
650
|
if (part > 0) {
|
|
839
651
|
scale = 1 / part;
|
|
840
652
|
}
|
|
841
653
|
for (var i = 0; i < points.length - 3;) {
|
|
842
|
-
//起始点
|
|
843
654
|
var pointS = points[i];
|
|
844
|
-
//第一个控制点
|
|
845
655
|
var pointC1 = points[i + 1];
|
|
846
|
-
//第二个控制点
|
|
847
656
|
var pointC2 = points[i + 2];
|
|
848
|
-
//结束点
|
|
849
657
|
var pointE = points[i + 3];
|
|
850
658
|
bezierPts.push(pointS);
|
|
851
659
|
for (var t = 0; t < 1;) {
|
|
852
|
-
//三次贝塞尔曲线公式
|
|
853
660
|
var x = (1 - t) * (1 - t) * (1 - t) * pointS.x + 3 * t * (1 - t) * (1 - t) * pointC1.x + 3 * t * t * (1 - t) * pointC2.x + t * t * t * pointE.x;
|
|
854
661
|
var y = (1 - t) * (1 - t) * (1 - t) * pointS.y + 3 * t * (1 - t) * (1 - t) * pointC1.y + 3 * t * t * (1 - t) * pointC2.y + t * t * t * pointE.y;
|
|
855
662
|
var point = {
|
|
@@ -866,6 +673,11 @@ function calculatePointsFBZ3(points, part) {
|
|
|
866
673
|
}
|
|
867
674
|
return bezierPts;
|
|
868
675
|
}
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* 统一计算燕尾/直线箭头顶点。
|
|
679
|
+
* type: 1-燕尾箭头,2-燕尾箭头变体,3-直线箭头。
|
|
680
|
+
*/
|
|
869
681
|
var calculateSwallowPoints = function calculateSwallowPoints(anchorpoints, type) {
|
|
870
682
|
var points = [];
|
|
871
683
|
switch (type) {
|
|
@@ -882,11 +694,9 @@ var calculateSwallowPoints = function calculateSwallowPoints(anchorpoints, type)
|
|
|
882
694
|
}
|
|
883
695
|
return points;
|
|
884
696
|
};
|
|
697
|
+
|
|
885
698
|
/**
|
|
886
|
-
*
|
|
887
|
-
* @param anchorpoints
|
|
888
|
-
* @returns {number[]}
|
|
889
|
-
* @private
|
|
699
|
+
* 计算标准燕尾箭头或直线箭头的经纬高扁平数组。
|
|
890
700
|
*/
|
|
891
701
|
var computeSwallowtailArrow = function computeSwallowtailArrow(anchorpoints) {
|
|
892
702
|
var swallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
@@ -935,16 +745,16 @@ var computeSwallowtailArrow = function computeSwallowtailArrow(anchorpoints) {
|
|
|
935
745
|
x: xt - 0.85 / 3.2 * (y1 - yt),
|
|
936
746
|
y: yt + 0.85 / 3.2 * (x1 - xt)
|
|
937
747
|
};
|
|
938
|
-
var
|
|
748
|
+
var degrees = [];
|
|
939
749
|
for (var index = 0; index < ap.length; index++) {
|
|
940
750
|
var ele = ap[index];
|
|
941
|
-
ele &&
|
|
751
|
+
ele && degrees.push(ele.x, ele.y, 0);
|
|
942
752
|
}
|
|
943
|
-
return
|
|
753
|
+
return degrees;
|
|
944
754
|
};
|
|
755
|
+
|
|
945
756
|
/**
|
|
946
|
-
*
|
|
947
|
-
* @param anchorpoints
|
|
757
|
+
* 计算双点燕尾箭头变体的经纬高扁平数组。
|
|
948
758
|
*/
|
|
949
759
|
var computeSwallowtailArrow2 = function computeSwallowtailArrow2(anchorpoints) {
|
|
950
760
|
var p0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
@@ -960,10 +770,9 @@ var computeSwallowtailArrow2 = function computeSwallowtailArrow2(anchorpoints) {
|
|
|
960
770
|
});
|
|
961
771
|
return degreesArray;
|
|
962
772
|
};
|
|
773
|
+
|
|
963
774
|
/**
|
|
964
|
-
*
|
|
965
|
-
* @param points
|
|
966
|
-
* @returns
|
|
775
|
+
* 根据控制点计算钳击箭头面顶点。
|
|
967
776
|
*/
|
|
968
777
|
var calculatePincerArrowPoint = function calculatePincerArrowPoint(points) {
|
|
969
778
|
if (points.length < 3) return null;
|
|
@@ -978,150 +787,10 @@ var calculatePincerArrowPoint = function calculatePincerArrowPoint(points) {
|
|
|
978
787
|
if (index == -1) result = res.polygonalPoint;
|
|
979
788
|
return result;
|
|
980
789
|
};
|
|
981
|
-
|
|
982
|
-
var _ref;
|
|
983
|
-
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
984
|
-
var p0 = transformCartesianToWGS84(points[0]);
|
|
985
|
-
var p1 = points[1] ? transformCartesianToWGS84(points[1]) : {
|
|
986
|
-
x: p0.x + 0.00001,
|
|
987
|
-
y: p0.y + 0.00001,
|
|
988
|
-
z: p0.z
|
|
989
|
-
};
|
|
990
|
-
var pnts = [[p0.x, p0.y], [p1.x, p1.y]];
|
|
991
|
-
var arcArr = getFlagPoints(pnts, type);
|
|
992
|
-
return Cesium.Cartesian3.fromDegreesArray((_ref = []).concat.apply(_ref, _toConsumableArray(arcArr)));
|
|
993
|
-
};
|
|
994
|
-
/**
|
|
995
|
-
*
|
|
996
|
-
* @param {*} points
|
|
997
|
-
* @param {*} type 0-曲线,1-直线,2-正三角,3-倒三角,4-对三角
|
|
998
|
-
* @returns
|
|
999
|
-
*/
|
|
1000
|
-
function getFlagPoints(points) {
|
|
1001
|
-
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
1002
|
-
type = type ? type : 0;
|
|
1003
|
-
var components = [];
|
|
1004
|
-
// 至少需要两个控制点
|
|
1005
|
-
if (points.length > 1) {
|
|
1006
|
-
// 取第一个
|
|
1007
|
-
var startPoint = points[0];
|
|
1008
|
-
// 取最后一个
|
|
1009
|
-
var endPoint = points[points.length - 1];
|
|
1010
|
-
// 中间点
|
|
1011
|
-
var pointCenter = [endPoint[0], (endPoint[1] - startPoint[1]) / 4 + startPoint[1]];
|
|
1012
|
-
// 上曲线起始点
|
|
1013
|
-
var point1 = startPoint;
|
|
1014
|
-
// 上曲线第一控制点
|
|
1015
|
-
var point2 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) / 8 + startPoint[1]];
|
|
1016
|
-
// 上曲线第二个点
|
|
1017
|
-
var point3 = [(startPoint[0] + endPoint[0]) / 2, startPoint[1]];
|
|
1018
|
-
// 上曲线第二控制点
|
|
1019
|
-
var point4 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], -(endPoint[1] - startPoint[1]) / 8 + startPoint[1]];
|
|
1020
|
-
// 上曲线结束点
|
|
1021
|
-
var point5 = [endPoint[0], startPoint[1]];
|
|
1022
|
-
// 下曲线结束点
|
|
1023
|
-
var point6 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2];
|
|
1024
|
-
// 下曲线第二控制点
|
|
1025
|
-
var point7 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 3 / 8 + startPoint[1]];
|
|
1026
|
-
// 下曲线第二个点
|
|
1027
|
-
var point8 = [(startPoint[0] + endPoint[0]) / 2, (startPoint[1] + endPoint[1]) / 2];
|
|
1028
|
-
// 下曲线第一控制点
|
|
1029
|
-
var point9 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 5 / 8 + startPoint[1]];
|
|
1030
|
-
// 下曲线起始点
|
|
1031
|
-
var point10 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2];
|
|
1032
|
-
// 旗杆底部点
|
|
1033
|
-
var point11 = [startPoint[0], endPoint[1]];
|
|
1034
|
-
// 底部左点
|
|
1035
|
-
var point12 = [startPoint[0] - (endPoint[0] - startPoint[0]) / 30, endPoint[1]];
|
|
1036
|
-
// 顶部左点
|
|
1037
|
-
var point13 = [startPoint[0] - (endPoint[0] - startPoint[0]) / 30, startPoint[1]];
|
|
1038
|
-
var curve1Points, curve2Points;
|
|
1039
|
-
//type:0-曲线,1-直线,2-正三角,3-倒三角,4-对三角
|
|
1040
|
-
switch (type) {
|
|
1041
|
-
case 0:
|
|
1042
|
-
curve1Points = [point1, point2, point3, point4, point5];
|
|
1043
|
-
curve2Points = [point6, point7, point8, point9, point10, point10, point10, point10, point10];
|
|
1044
|
-
break;
|
|
1045
|
-
case 1:
|
|
1046
|
-
curve1Points = [point1, point5];
|
|
1047
|
-
curve2Points = [point6, point10, point10, point10, point10, point10];
|
|
1048
|
-
break;
|
|
1049
|
-
case 2:
|
|
1050
|
-
curve1Points = [point1, point6];
|
|
1051
|
-
curve2Points = [point6, point10, point10, point10, point10, point10];
|
|
1052
|
-
break;
|
|
1053
|
-
case 3:
|
|
1054
|
-
curve1Points = [point1, point5];
|
|
1055
|
-
curve2Points = [point5, point10, point10, point10, point10, point10];
|
|
1056
|
-
break;
|
|
1057
|
-
case 4:
|
|
1058
|
-
curve1Points = [point1, pointCenter];
|
|
1059
|
-
curve2Points = [pointCenter, point10, point10, point10, point10, point10];
|
|
1060
|
-
break;
|
|
1061
|
-
}
|
|
1062
|
-
// 计算上曲线
|
|
1063
|
-
var curveTop = getBezierPoints(curve1Points);
|
|
1064
|
-
// 计算下曲线
|
|
1065
|
-
var curveBottom = getBezierPoints(curve2Points);
|
|
1066
|
-
// 合并
|
|
1067
|
-
components = curveTop.concat(curveBottom);
|
|
1068
|
-
components.push(point11, point12);
|
|
1069
|
-
components.push(point13);
|
|
1070
|
-
}
|
|
1071
|
-
return components;
|
|
1072
|
-
}
|
|
1073
|
-
/**
|
|
1074
|
-
* 贝塞尔曲线
|
|
1075
|
-
* @param points
|
|
1076
|
-
* @returns {*}
|
|
1077
|
-
*/
|
|
1078
|
-
function getBezierPoints(points) {
|
|
1079
|
-
if (points.length <= 2) {
|
|
1080
|
-
return points;
|
|
1081
|
-
} else {
|
|
1082
|
-
var bezierPoints = [];
|
|
1083
|
-
var n = points.length - 1;
|
|
1084
|
-
for (var t = 0; t <= 1; t += 0.01) {
|
|
1085
|
-
var x = 0,
|
|
1086
|
-
y = 0;
|
|
1087
|
-
for (var index = 0; index <= n; index++) {
|
|
1088
|
-
var factor = getBinomialFactor(n, index);
|
|
1089
|
-
var a = Math.pow(t, index);
|
|
1090
|
-
var b = Math.pow(1 - t, n - index);
|
|
1091
|
-
x += factor * a * b * points[index][0];
|
|
1092
|
-
y += factor * a * b * points[index][1];
|
|
1093
|
-
}
|
|
1094
|
-
bezierPoints.push([x, y]);
|
|
1095
|
-
}
|
|
1096
|
-
bezierPoints.push(points[n]);
|
|
1097
|
-
return bezierPoints;
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
/**
|
|
1101
|
-
* 获取二项分布
|
|
1102
|
-
* @param n
|
|
1103
|
-
* @param index
|
|
1104
|
-
* @returns {number}
|
|
1105
|
-
*/
|
|
1106
|
-
function getBinomialFactor(n, index) {
|
|
1107
|
-
return getFactorial(n) / (getFactorial(index) * getFactorial(n - index));
|
|
1108
|
-
}
|
|
1109
|
-
/**
|
|
1110
|
-
* 获取阶乘数据
|
|
1111
|
-
* @param n
|
|
1112
|
-
* @returns {number}
|
|
1113
|
-
*/
|
|
1114
|
-
function getFactorial(n) {
|
|
1115
|
-
var result = 1;
|
|
1116
|
-
for (var i = 1; i <= n; i++) {
|
|
1117
|
-
result *= i;
|
|
1118
|
-
}
|
|
1119
|
-
return result;
|
|
1120
|
-
}
|
|
790
|
+
|
|
1121
791
|
/**
|
|
1122
|
-
*
|
|
1123
|
-
*
|
|
1124
|
-
* @returns
|
|
792
|
+
* 根据两个控制点生成阵型折线点集。
|
|
793
|
+
* type: 0-防御阵型,1-进攻阵型。
|
|
1125
794
|
*/
|
|
1126
795
|
var calculateFormationPoints = function calculateFormationPoints(anchorpoints, type) {
|
|
1127
796
|
var pos0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
@@ -1135,13 +804,13 @@ var calculateFormationPoints = function calculateFormationPoints(anchorpoints, t
|
|
|
1135
804
|
var center = {
|
|
1136
805
|
x: centerX,
|
|
1137
806
|
y: centerY
|
|
1138
|
-
};
|
|
1139
|
-
var
|
|
807
|
+
};
|
|
808
|
+
var leftCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
|
|
1140
809
|
var rightCartesian3 = Cesium.Cartesian3.fromDegrees(pos1.x, pos1.y);
|
|
1141
|
-
var diameter = Cesium.Cartesian3.distance(
|
|
1142
|
-
var radius = diameter / 2;
|
|
1143
|
-
var angle = calculateAngle(center, pos1);
|
|
1144
|
-
var sourcePos = getPointByAngleDistance(center.x, center.y, 90 + angle, radius);
|
|
810
|
+
var diameter = Cesium.Cartesian3.distance(leftCartesian3, rightCartesian3);
|
|
811
|
+
var radius = diameter / 2;
|
|
812
|
+
var angle = calculateAngle(center, pos1);
|
|
813
|
+
var sourcePos = getPointByAngleDistance(center.x, center.y, 90 + angle, radius);
|
|
1145
814
|
var angle_left = calculateAngle(sourcePos, pos0);
|
|
1146
815
|
var circleRadius = Math.pow(2, 0.5) * radius;
|
|
1147
816
|
var points = [];
|
|
@@ -1171,10 +840,9 @@ var calculateFormationPoints = function calculateFormationPoints(anchorpoints, t
|
|
|
1171
840
|
});
|
|
1172
841
|
return Cesium.Cartesian3.fromDegreesArray(resultPos);
|
|
1173
842
|
};
|
|
843
|
+
|
|
1174
844
|
/**
|
|
1175
|
-
*
|
|
1176
|
-
* @param {*} anchorpoints
|
|
1177
|
-
* @returns
|
|
845
|
+
* 根据两个控制点生成弓形折线点集。
|
|
1178
846
|
*/
|
|
1179
847
|
var calculateBowPoints = function calculateBowPoints(anchorpoints) {
|
|
1180
848
|
var pos0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
@@ -1188,13 +856,13 @@ var calculateBowPoints = function calculateBowPoints(anchorpoints) {
|
|
|
1188
856
|
var center = {
|
|
1189
857
|
x: centerX,
|
|
1190
858
|
y: centerY
|
|
1191
|
-
};
|
|
1192
|
-
var
|
|
859
|
+
};
|
|
860
|
+
var leftCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
|
|
1193
861
|
var rightCartesian3 = Cesium.Cartesian3.fromDegrees(pos1.x, pos1.y);
|
|
1194
|
-
var diameter = Cesium.Cartesian3.distance(
|
|
1195
|
-
var radius = diameter / 2;
|
|
1196
|
-
var angle = calculateAngle(center, pos1);
|
|
1197
|
-
var sourcePos = getPointByAngleDistance(center.x, center.y, 90 + angle, radius);
|
|
862
|
+
var diameter = Cesium.Cartesian3.distance(leftCartesian3, rightCartesian3);
|
|
863
|
+
var radius = diameter / 2;
|
|
864
|
+
var angle = calculateAngle(center, pos1);
|
|
865
|
+
var sourcePos = getPointByAngleDistance(center.x, center.y, 90 + angle, radius);
|
|
1198
866
|
var angle_left = calculateAngle(sourcePos, pos0);
|
|
1199
867
|
var circleRadius = Math.pow(2, 0.5) * radius;
|
|
1200
868
|
var points = [];
|
|
@@ -1212,19 +880,15 @@ var calculateBowPoints = function calculateBowPoints(anchorpoints) {
|
|
|
1212
880
|
});
|
|
1213
881
|
return Cesium.Cartesian3.fromDegreesArray(resultPos);
|
|
1214
882
|
};
|
|
883
|
+
|
|
1215
884
|
/**
|
|
1216
|
-
*
|
|
1217
|
-
*
|
|
1218
|
-
* @param {*} lat 纬度
|
|
1219
|
-
* @param {*} angle 角度 (0~360度)
|
|
1220
|
-
* @param {*} distance 距离 (米)
|
|
1221
|
-
*
|
|
885
|
+
* 已知起点经纬度、角度与距离,反解目标点经纬度。
|
|
886
|
+
* 这里采用 WGS84 椭球近似计算,供弓形、阵型、扇形等算法复用。
|
|
1222
887
|
*/
|
|
1223
888
|
function getPointByAngleDistance(lng, lat, angle, distance) {
|
|
1224
|
-
var a = 6378137;
|
|
1225
|
-
var b = 6356752.3142;
|
|
1226
|
-
var f = 1 / 298.257223563;
|
|
1227
|
-
|
|
889
|
+
var a = 6378137;
|
|
890
|
+
var b = 6356752.3142;
|
|
891
|
+
var f = 1 / 298.257223563;
|
|
1228
892
|
var alpha1 = angle * (Math.PI / 180);
|
|
1229
893
|
var sinAlpha1 = Math.sin(alpha1);
|
|
1230
894
|
var cosAlpha1 = Math.cos(alpha1);
|
|
@@ -1260,112 +924,10 @@ function getPointByAngleDistance(lng, lat, angle, distance) {
|
|
|
1260
924
|
y: lat2 * (180 / Math.PI)
|
|
1261
925
|
};
|
|
1262
926
|
}
|
|
927
|
+
|
|
1263
928
|
/**
|
|
1264
|
-
*
|
|
1265
|
-
* @param anchor
|
|
1266
|
-
* @returns
|
|
929
|
+
* 根据圆心、半径点、终止角方向点生成扇形顶点。
|
|
1267
930
|
*/
|
|
1268
|
-
var computeRoundedRectanglePoints = function computeRoundedRectanglePoints(anchorpoints) {
|
|
1269
|
-
var pos0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
1270
|
-
var pos1 = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
1271
|
-
x: pos0.x + 0.00001,
|
|
1272
|
-
y: pos0.y + 0.00001,
|
|
1273
|
-
z: pos0.z
|
|
1274
|
-
};
|
|
1275
|
-
var o_x = (pos0.x + pos1.x) / 2;
|
|
1276
|
-
var o_y = (pos0.y + pos1.y) / 2;
|
|
1277
|
-
//a为矩形的长边,b为矩形的短边
|
|
1278
|
-
var a = Math.abs(pos0.x - pos1.x);
|
|
1279
|
-
var b = Math.abs(pos0.y - pos1.y);
|
|
1280
|
-
var r = 1 / 10 * Math.min(a, b);
|
|
1281
|
-
//从左上点开始,顺时针求四个圆弧的圆心
|
|
1282
|
-
var o1_x = o_x - a / 2 + r;
|
|
1283
|
-
var o1_y = o_y - b / 2 + r;
|
|
1284
|
-
var o1 = {
|
|
1285
|
-
x: o1_x,
|
|
1286
|
-
y: o1_y
|
|
1287
|
-
};
|
|
1288
|
-
var o2 = {
|
|
1289
|
-
x: o_x + a / 2 - r,
|
|
1290
|
-
y: o_y - b / 2 + r
|
|
1291
|
-
};
|
|
1292
|
-
var o3 = {
|
|
1293
|
-
x: o_x + a / 2 - r,
|
|
1294
|
-
y: o_y + b / 2 - r
|
|
1295
|
-
};
|
|
1296
|
-
var o4 = {
|
|
1297
|
-
x: o_x - a / 2 + r,
|
|
1298
|
-
y: o_y + b / 2 - r
|
|
1299
|
-
};
|
|
1300
|
-
//从左上角开始画圆弧
|
|
1301
|
-
var step = Math.PI / 180;
|
|
1302
|
-
var points1 = [];
|
|
1303
|
-
var theta1 = Math.PI;
|
|
1304
|
-
var theta2 = 3 / 2 * Math.PI;
|
|
1305
|
-
var radius1 = theta1;
|
|
1306
|
-
for (var i = 0; i < Math.abs(theta1 - theta2); i += step) {
|
|
1307
|
-
var X = o1.x + r * Math.cos(radius1);
|
|
1308
|
-
var Y = o1.y + r * Math.sin(radius1);
|
|
1309
|
-
radius1 = radius1 + step;
|
|
1310
|
-
radius1 = radius1 < 0 ? 2 * Math.PI + radius1 : radius1;
|
|
1311
|
-
radius1 = radius1 > 2 * Math.PI ? 2 * Math.PI - radius1 : radius1;
|
|
1312
|
-
points1.push({
|
|
1313
|
-
x: X,
|
|
1314
|
-
y: Y
|
|
1315
|
-
});
|
|
1316
|
-
}
|
|
1317
|
-
var points2 = points1;
|
|
1318
|
-
var theta3 = Math.PI * 3 / 2;
|
|
1319
|
-
var theta4 = 2 * Math.PI;
|
|
1320
|
-
var radius2 = theta3;
|
|
1321
|
-
for (var _i2 = 0; _i2 < Math.abs(theta3 - theta4); _i2 += step) {
|
|
1322
|
-
var _X = o2.x + r * Math.cos(radius2);
|
|
1323
|
-
var _Y = o2.y + r * Math.sin(radius2);
|
|
1324
|
-
radius2 = radius2 + step;
|
|
1325
|
-
radius2 = radius2 < 0 ? 2 * Math.PI + radius2 : radius2;
|
|
1326
|
-
radius2 = radius2 > 2 * Math.PI ? 2 * Math.PI - radius2 : radius2;
|
|
1327
|
-
points2.push({
|
|
1328
|
-
x: _X,
|
|
1329
|
-
y: _Y
|
|
1330
|
-
});
|
|
1331
|
-
}
|
|
1332
|
-
var points3 = points2;
|
|
1333
|
-
var theta5 = 0;
|
|
1334
|
-
var theta6 = 1 / 2 * Math.PI;
|
|
1335
|
-
var radius3 = theta5;
|
|
1336
|
-
for (var _i3 = 0; _i3 < Math.abs(theta5 - theta6); _i3 += step) {
|
|
1337
|
-
var _X2 = o3.x + r * Math.cos(radius3);
|
|
1338
|
-
var _Y2 = o3.y + r * Math.sin(radius3);
|
|
1339
|
-
radius3 = radius3 + step;
|
|
1340
|
-
radius3 = radius3 < 0 ? 2 * Math.PI + radius3 : radius3;
|
|
1341
|
-
radius3 = radius3 > 2 * Math.PI ? 2 * Math.PI - radius3 : radius3;
|
|
1342
|
-
points3.push({
|
|
1343
|
-
x: _X2,
|
|
1344
|
-
y: _Y2
|
|
1345
|
-
});
|
|
1346
|
-
}
|
|
1347
|
-
var points = points3;
|
|
1348
|
-
var theta7 = 1 / 2 * Math.PI;
|
|
1349
|
-
var theta8 = Math.PI;
|
|
1350
|
-
var radius4 = theta7;
|
|
1351
|
-
for (var _i4 = 0; _i4 < Math.abs(theta7 - theta8); _i4 += step) {
|
|
1352
|
-
var _X3 = o4.x + r * Math.cos(radius4);
|
|
1353
|
-
var _Y3 = o4.y + r * Math.sin(radius4);
|
|
1354
|
-
radius4 = radius4 + step;
|
|
1355
|
-
radius4 = radius4 < 0 ? 2 * Math.PI + radius4 : radius4;
|
|
1356
|
-
radius4 = radius4 > 2 * Math.PI ? 2 * Math.PI - radius4 : radius4;
|
|
1357
|
-
points.push({
|
|
1358
|
-
x: _X3,
|
|
1359
|
-
y: _Y3
|
|
1360
|
-
});
|
|
1361
|
-
}
|
|
1362
|
-
var GeoPoints = [];
|
|
1363
|
-
points.forEach(function (item) {
|
|
1364
|
-
GeoPoints.push(item.x, item.y, 0);
|
|
1365
|
-
});
|
|
1366
|
-
var result = Cesium.Cartesian3.fromDegreesArrayHeights(GeoPoints);
|
|
1367
|
-
return result;
|
|
1368
|
-
};
|
|
1369
931
|
var calculateSectorPoints = function calculateSectorPoints(points) {
|
|
1370
932
|
var pos0 = transformCartesianToWGS84(points[0]);
|
|
1371
933
|
pos0.z = 0;
|
|
@@ -1382,15 +944,11 @@ var calculateSectorPoints = function calculateSectorPoints(points) {
|
|
|
1382
944
|
};
|
|
1383
945
|
var startAngle = calculateAngle(pos0, pos1);
|
|
1384
946
|
var endAngle = calculateAngle(pos0, pos2);
|
|
1385
|
-
// // 将角度转换为弧度
|
|
1386
947
|
var startAngleRad = Math.min(startAngle, endAngle);
|
|
1387
948
|
var endAngleRad = Math.max(startAngle, endAngle);
|
|
1388
|
-
// 获取扇形的所有坐标值
|
|
1389
949
|
var coordinates = [];
|
|
1390
|
-
coordinates.push(pos0.x, pos0.y);
|
|
1391
|
-
|
|
1392
|
-
// 扇形边界点坐标
|
|
1393
|
-
var numPoints = 100; // 分割圆弧的点数,可以根据需要调整
|
|
950
|
+
coordinates.push(pos0.x, pos0.y);
|
|
951
|
+
var numPoints = 100;
|
|
1394
952
|
var angleStep = (endAngleRad - startAngleRad) / numPoints;
|
|
1395
953
|
for (var i = 0; i <= numPoints; i++) {
|
|
1396
954
|
var angle = startAngleRad + i * angleStep;
|
|
@@ -1400,13 +958,8 @@ var calculateSectorPoints = function calculateSectorPoints(points) {
|
|
|
1400
958
|
coordinates.push(pos0.x, pos0.y);
|
|
1401
959
|
return Cesium.Cartesian3.fromDegreesArray(coordinates);
|
|
1402
960
|
};
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
result += index === 0 ? element : '\n ' + element;
|
|
1409
|
-
}
|
|
1410
|
-
return result;
|
|
1411
|
-
};
|
|
1412
|
-
export { calculateBowPoints, calculateFlagPoints, calculateFormationPoints, calculatePincerArrowPoint, calculateRectanglePoints, calculateSectorPoints, calculateSwallowPoints, computeAssemblePoints, computeRoundedRectanglePoints, createBezierPoints, getAttackArrowPoints, getEllipticAngle, getLabelText, getRegularPoints, getRightAngleArrowPoints, getSemiAxis, lockingMap, newSessionid };
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* 对外暴露给 drawer/shape 的最小算法集合。
|
|
964
|
+
*/
|
|
965
|
+
export { calculateBowPoints, calculateFormationPoints, calculatePincerArrowPoint, calculateSectorPoints, calculateSwallowPoints, computeAssemblePoints, createBezierPoints, getAttackArrowPoints, getEllipticAngle, getPointByAngleDistance, getRightAngleArrowPoints, getSemiAxis };
|