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.
Files changed (177) hide show
  1. package/dist/assets/Build/DeepTwins/Workers/MvtVector.worker.js +1 -0
  2. package/dist/esm/{plot/utils/Algorithm.js → drawer/algorithm.js} +1 -3
  3. package/dist/esm/drawer/common.d.ts +61 -0
  4. package/dist/esm/{plot/utils/PlotCommon.js → drawer/common.js} +104 -551
  5. package/dist/esm/{plot/utils/Coordinate.d.ts → drawer/coordinate.d.ts} +1 -1
  6. package/dist/esm/drawer/index.d.ts +11 -18
  7. package/dist/esm/drawer/index.js +329 -80
  8. package/dist/esm/{plot/utils → drawer}/plotUtil.js +1 -3
  9. package/dist/esm/drawer/shape/Assemble.d.ts +34 -0
  10. package/dist/esm/drawer/shape/Assemble.js +415 -0
  11. package/dist/esm/drawer/shape/AttackArrow.d.ts +32 -0
  12. package/dist/esm/drawer/shape/AttackArrow.js +442 -0
  13. package/dist/esm/drawer/shape/BaseShape.d.ts +14 -4
  14. package/dist/esm/drawer/shape/BaseShape.js +175 -20
  15. package/dist/esm/drawer/shape/Bow.d.ts +31 -0
  16. package/dist/esm/drawer/shape/Bow.js +375 -0
  17. package/dist/esm/drawer/shape/Circle.d.ts +37 -0
  18. package/dist/esm/drawer/shape/Circle.js +461 -0
  19. package/dist/esm/drawer/shape/Curve.d.ts +29 -0
  20. package/dist/esm/drawer/shape/Curve.js +386 -0
  21. package/dist/esm/drawer/shape/DragPoint.d.ts +32 -0
  22. package/dist/esm/drawer/shape/DragPoint.js +211 -0
  23. package/dist/esm/drawer/shape/Elliptic.d.ts +38 -0
  24. package/dist/esm/drawer/shape/Elliptic.js +491 -0
  25. package/dist/esm/drawer/shape/Formation.d.ts +33 -0
  26. package/dist/esm/drawer/shape/Formation.js +395 -0
  27. package/dist/esm/drawer/shape/PincerArrow.d.ts +32 -0
  28. package/dist/esm/drawer/shape/PincerArrow.js +445 -0
  29. package/dist/esm/drawer/shape/Point.d.ts +2 -31
  30. package/dist/esm/drawer/shape/Point.js +7 -201
  31. package/dist/esm/drawer/shape/Polygon.d.ts +1 -1
  32. package/dist/esm/drawer/shape/Polygon.js +10 -81
  33. package/dist/esm/drawer/shape/Polyline.d.ts +1 -1
  34. package/dist/esm/drawer/shape/Polyline.js +10 -81
  35. package/dist/esm/drawer/shape/RegularPolygon.d.ts +37 -0
  36. package/dist/esm/drawer/shape/RegularPolygon.js +468 -0
  37. package/dist/esm/drawer/shape/RightAngleArrow.d.ts +34 -0
  38. package/dist/esm/drawer/shape/RightAngleArrow.js +423 -0
  39. package/dist/esm/drawer/shape/Sector.d.ts +37 -0
  40. package/dist/esm/drawer/shape/Sector.js +568 -0
  41. package/dist/esm/drawer/shape/StraightArrow.d.ts +34 -0
  42. package/dist/esm/drawer/shape/StraightArrow.js +422 -0
  43. package/dist/esm/drawer/shape/SwallowtailArrow.d.ts +36 -0
  44. package/dist/esm/drawer/shape/SwallowtailArrow.js +438 -0
  45. package/dist/esm/drawer/types.d.ts +23 -0
  46. package/dist/esm/drawer/types.js +11 -0
  47. package/dist/esm/drawer/utils.d.ts +14 -0
  48. package/dist/esm/drawer/utils.js +320 -2
  49. package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
  50. package/dist/esm/index.d.ts +1 -0
  51. package/dist/esm/index.js +5 -3
  52. package/dist/esm/measure/Area.d.ts +17 -17
  53. package/dist/esm/measure/Area.js +95 -63
  54. package/dist/esm/measure/BaseDraw.d.ts +9 -4
  55. package/dist/esm/measure/BaseDraw.js +37 -2
  56. package/dist/esm/measure/Distance.d.ts +9 -9
  57. package/dist/esm/measure/Distance.js +52 -68
  58. package/dist/esm/measure/index.d.ts +16 -26
  59. package/dist/esm/measure/index.js +72 -84
  60. package/dist/esm/measure/types.d.ts +94 -0
  61. package/dist/esm/measure/types.js +17 -0
  62. package/dist/esm/measure/utils.d.ts +7 -7
  63. package/dist/esm/measure/utils.js +43 -24
  64. package/dist/esm/tileLayer/MvtVectorLoad.d.ts +241 -0
  65. package/dist/esm/tileLayer/MvtVectorLoad.js +1353 -0
  66. package/dist/esm/tileLayer/MvtVectorWorkerClient.d.ts +25 -0
  67. package/dist/esm/tileLayer/MvtVectorWorkerClient.js +126 -0
  68. package/dist/esm/tool/utils.js +1 -1
  69. package/dist/umd/deeptwins-engine-3d.min.js +1 -1
  70. package/package.json +2 -1
  71. package/dist/assets/Build/DeepTwins/Image/compass/pointer-white.png +0 -0
  72. package/dist/esm/plot/create/CreateAssemble.d.ts +0 -2
  73. package/dist/esm/plot/create/CreateAssemble.js +0 -63
  74. package/dist/esm/plot/create/CreateAttackArrow.d.ts +0 -5
  75. package/dist/esm/plot/create/CreateAttackArrow.js +0 -75
  76. package/dist/esm/plot/create/CreateBillboard.d.ts +0 -2
  77. package/dist/esm/plot/create/CreateBillboard.js +0 -47
  78. package/dist/esm/plot/create/CreateBow.d.ts +0 -2
  79. package/dist/esm/plot/create/CreateBow.js +0 -63
  80. package/dist/esm/plot/create/CreateCircle.d.ts +0 -2
  81. package/dist/esm/plot/create/CreateCircle.js +0 -68
  82. package/dist/esm/plot/create/CreateCurve.d.ts +0 -2
  83. package/dist/esm/plot/create/CreateCurve.js +0 -76
  84. package/dist/esm/plot/create/CreateElliptic.d.ts +0 -2
  85. package/dist/esm/plot/create/CreateElliptic.js +0 -69
  86. package/dist/esm/plot/create/CreateFlag.d.ts +0 -2
  87. package/dist/esm/plot/create/CreateFlag.js +0 -80
  88. package/dist/esm/plot/create/CreateFormation.d.ts +0 -2
  89. package/dist/esm/plot/create/CreateFormation.js +0 -65
  90. package/dist/esm/plot/create/CreateFreeLine.d.ts +0 -2
  91. package/dist/esm/plot/create/CreateFreeLine.js +0 -69
  92. package/dist/esm/plot/create/CreateFreePolygon.d.ts +0 -2
  93. package/dist/esm/plot/create/CreateFreePolygon.js +0 -65
  94. package/dist/esm/plot/create/CreateLabel.d.ts +0 -2
  95. package/dist/esm/plot/create/CreateLabel.js +0 -55
  96. package/dist/esm/plot/create/CreateLineArrow.d.ts +0 -2
  97. package/dist/esm/plot/create/CreateLineArrow.js +0 -79
  98. package/dist/esm/plot/create/CreatePincerArrow.d.ts +0 -5
  99. package/dist/esm/plot/create/CreatePincerArrow.js +0 -73
  100. package/dist/esm/plot/create/CreatePoint.d.ts +0 -2
  101. package/dist/esm/plot/create/CreatePoint.js +0 -47
  102. package/dist/esm/plot/create/CreatePolygon.d.ts +0 -2
  103. package/dist/esm/plot/create/CreatePolygon.js +0 -80
  104. package/dist/esm/plot/create/CreatePolyline.d.ts +0 -2
  105. package/dist/esm/plot/create/CreatePolyline.js +0 -70
  106. package/dist/esm/plot/create/CreateRectangle.d.ts +0 -2
  107. package/dist/esm/plot/create/CreateRectangle.js +0 -60
  108. package/dist/esm/plot/create/CreateRegularPolygon.d.ts +0 -2
  109. package/dist/esm/plot/create/CreateRegularPolygon.js +0 -75
  110. package/dist/esm/plot/create/CreateRightAngleArrow.d.ts +0 -5
  111. package/dist/esm/plot/create/CreateRightAngleArrow.js +0 -73
  112. package/dist/esm/plot/create/CreateRoundRectangle.d.ts +0 -2
  113. package/dist/esm/plot/create/CreateRoundRectangle.js +0 -63
  114. package/dist/esm/plot/create/CreateSector.d.ts +0 -2
  115. package/dist/esm/plot/create/CreateSector.js +0 -65
  116. package/dist/esm/plot/create/CreateStraightArrow.d.ts +0 -5
  117. package/dist/esm/plot/create/CreateStraightArrow.js +0 -65
  118. package/dist/esm/plot/create/CreateSwallowtailArrow.d.ts +0 -5
  119. package/dist/esm/plot/create/CreateSwallowtailArrow.js +0 -67
  120. package/dist/esm/plot/create/index.d.ts +0 -25
  121. package/dist/esm/plot/create/index.js +0 -25
  122. package/dist/esm/plot/edit/EditAssemble.d.ts +0 -8
  123. package/dist/esm/plot/edit/EditAssemble.js +0 -120
  124. package/dist/esm/plot/edit/EditAttackArrow.d.ts +0 -8
  125. package/dist/esm/plot/edit/EditAttackArrow.js +0 -182
  126. package/dist/esm/plot/edit/EditBillboard.d.ts +0 -7
  127. package/dist/esm/plot/edit/EditBillboard.js +0 -70
  128. package/dist/esm/plot/edit/EditBow.d.ts +0 -8
  129. package/dist/esm/plot/edit/EditBow.js +0 -119
  130. package/dist/esm/plot/edit/EditCircle.d.ts +0 -8
  131. package/dist/esm/plot/edit/EditCircle.js +0 -133
  132. package/dist/esm/plot/edit/EditCurve.d.ts +0 -8
  133. package/dist/esm/plot/edit/EditCurve.js +0 -180
  134. package/dist/esm/plot/edit/EditElliptic.d.ts +0 -8
  135. package/dist/esm/plot/edit/EditElliptic.js +0 -144
  136. package/dist/esm/plot/edit/EditFlag.d.ts +0 -8
  137. package/dist/esm/plot/edit/EditFlag.js +0 -121
  138. package/dist/esm/plot/edit/EditFormation.d.ts +0 -8
  139. package/dist/esm/plot/edit/EditFormation.js +0 -120
  140. package/dist/esm/plot/edit/EditLabel.d.ts +0 -7
  141. package/dist/esm/plot/edit/EditLabel.js +0 -100
  142. package/dist/esm/plot/edit/EditLineArrow.d.ts +0 -8
  143. package/dist/esm/plot/edit/EditLineArrow.js +0 -180
  144. package/dist/esm/plot/edit/EditPincerArrow.d.ts +0 -8
  145. package/dist/esm/plot/edit/EditPincerArrow.js +0 -121
  146. package/dist/esm/plot/edit/EditPoint.d.ts +0 -7
  147. package/dist/esm/plot/edit/EditPoint.js +0 -70
  148. package/dist/esm/plot/edit/EditPolygon.d.ts +0 -8
  149. package/dist/esm/plot/edit/EditPolygon.js +0 -181
  150. package/dist/esm/plot/edit/EditPolyline.d.ts +0 -8
  151. package/dist/esm/plot/edit/EditPolyline.js +0 -179
  152. package/dist/esm/plot/edit/EditRectangle.d.ts +0 -8
  153. package/dist/esm/plot/edit/EditRectangle.js +0 -119
  154. package/dist/esm/plot/edit/EditRegularPolygon.d.ts +0 -8
  155. package/dist/esm/plot/edit/EditRegularPolygon.js +0 -170
  156. package/dist/esm/plot/edit/EditRightAngleArrow.d.ts +0 -8
  157. package/dist/esm/plot/edit/EditRightAngleArrow.js +0 -143
  158. package/dist/esm/plot/edit/EditRoundRectangle.d.ts +0 -8
  159. package/dist/esm/plot/edit/EditRoundRectangle.js +0 -119
  160. package/dist/esm/plot/edit/EditSector.d.ts +0 -8
  161. package/dist/esm/plot/edit/EditSector.js +0 -120
  162. package/dist/esm/plot/edit/EditStraightArrow.d.ts +0 -8
  163. package/dist/esm/plot/edit/EditStraightArrow.js +0 -120
  164. package/dist/esm/plot/edit/EditSwallowtailArrow.d.ts +0 -8
  165. package/dist/esm/plot/edit/EditSwallowtailArrow.js +0 -121
  166. package/dist/esm/plot/edit/index.d.ts +0 -23
  167. package/dist/esm/plot/edit/index.js +0 -23
  168. package/dist/esm/plot/utils/DomUtil.d.ts +0 -34
  169. package/dist/esm/plot/utils/DomUtil.js +0 -100
  170. package/dist/esm/plot/utils/PlotCommon.d.ts +0 -101
  171. package/dist/esm/plot/utils/ReminderTip.d.ts +0 -10
  172. package/dist/esm/plot/utils/ReminderTip.js +0 -67
  173. package/dist/esm/plot/utils/Tooltip.d.ts +0 -3
  174. package/dist/esm/plot/utils/Tooltip.js +0 -97
  175. /package/dist/esm/{plot/utils/Algorithm.d.ts → drawer/algorithm.d.ts} +0 -0
  176. /package/dist/esm/{plot/utils/Coordinate.js → drawer/coordinate.js} +0 -0
  177. /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 "./Algorithm";
12
- import { calculateAngle, transformCartesianToWGS84, transformWGS84ToCartesian } from "./Coordinate";
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
- * 创建随机(唯一)ID
24
- * @param num
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
- * @param anchorpoints
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; //箭头前端三角形中点坐标x
445
- var y_ = pointS.y + 5 * (pointE.y - pointS.y) / ratio; //箭头前端三角形中点坐标y
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 Binomial_coefficient = computeBinomial(anchorpoints);
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) * Binomial_coefficient[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 Binomial_coefficient = [];
609
- Binomial_coefficient.push(1);
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
- Binomial_coefficient.push(cs / bcs);
480
+ binomialCoefficient.push(cs / bcs);
618
481
  }
619
- Binomial_coefficient.push(1);
620
- return Binomial_coefficient;
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
- * @param points
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 degress = [];
748
+ var degrees = [];
939
749
  for (var index = 0; index < ap.length; index++) {
940
750
  var ele = ap[index];
941
- ele && degress.push(ele.x, ele.y, 0);
751
+ ele && degrees.push(ele.x, ele.y, 0);
942
752
  }
943
- return degress;
753
+ return degrees;
944
754
  };
755
+
945
756
  /**
946
- * 计算燕尾箭头2特征点
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
- var calculateFlagPoints = function calculateFlagPoints(points) {
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
- * @param {*} anchorpoints
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 lectCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
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(lectCartesian3, rightCartesian3); //起终点距离,单位m
1142
- var radius = diameter / 2; //半径
1143
- var angle = calculateAngle(center, pos1); //中点指向终点的角度,0-360
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 lectCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
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(lectCartesian3, rightCartesian3); //起终点距离,单位m
1195
- var radius = diameter / 2; //半径
1196
- var angle = calculateAngle(center, pos1); //中点指向终点的角度,0-360
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
- * 已知点根据角度和距离求取另一点坐标(二维) 注:WGS84坐标系
1217
- * @param {*} lng 经度
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
- var getLabelText = function getLabelText(text, type) {
1404
- var textArr = type ? text.split(' ') : text.split('\\n');
1405
- var result = '';
1406
- for (var index = 0; index < textArr.length; index++) {
1407
- var element = textArr[index];
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 };