deeptwins-engine-3d 0.1.32 → 0.1.34
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/Image/f_point.png +0 -0
- package/dist/esm/analyze/SubmergenceAnalysis.d.ts +19 -0
- package/dist/esm/analyze/SubmergenceAnalysis.js +137 -0
- package/dist/esm/constant.d.ts +29 -0
- package/dist/esm/constant.js +47 -0
- package/dist/esm/drawer/index.d.ts +56 -59
- package/dist/esm/drawer/index.js +380 -292
- package/dist/esm/drawer/shape/BaseShape.d.ts +33 -0
- package/dist/esm/drawer/shape/BaseShape.js +228 -0
- package/dist/esm/drawer/shape/Point.d.ts +44 -11
- package/dist/esm/drawer/shape/Point.js +299 -35
- package/dist/esm/drawer/shape/Polygon.d.ts +43 -9
- package/dist/esm/drawer/shape/Polygon.js +408 -56
- package/dist/esm/drawer/shape/Polyline.d.ts +41 -10
- package/dist/esm/drawer/shape/Polyline.js +373 -31
- package/dist/esm/drawer/utils.d.ts +1 -0
- package/dist/esm/drawer/utils.js +63 -0
- package/dist/esm/graphicLayer/BaseLayer.d.ts +1 -0
- package/dist/esm/graphicLayer/BaseLayer.js +8 -3
- package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
- package/dist/esm/graphicLayer/BaseSource.js +13 -3
- package/dist/esm/graphicLayer/GraphicLayerCollection.d.ts +2 -0
- package/dist/esm/graphicLayer/GraphicLayerCollection.js +46 -4
- package/dist/esm/graphicLayer/HtmlEntity.js +1 -2
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +7 -4
- package/dist/esm/map/Map.d.ts +1 -0
- package/dist/esm/map/Map.js +10 -0
- package/dist/esm/measure/Area.d.ts +29 -0
- package/dist/esm/measure/{AreaMeasure.js → Area.js} +156 -65
- package/dist/esm/measure/BaseDraw.d.ts +13 -0
- package/dist/esm/measure/BaseDraw.js +70 -0
- package/dist/esm/measure/Distance.d.ts +23 -0
- package/dist/esm/measure/Distance.js +239 -0
- package/dist/esm/measure/index.d.ts +44 -5
- package/dist/esm/measure/index.js +278 -5
- package/dist/esm/measure/utils.d.ts +108 -14
- package/dist/esm/measure/utils.js +262 -20
- package/dist/esm/plot/create/CreateAssemble.d.ts +2 -0
- package/dist/esm/plot/create/CreateAssemble.js +63 -0
- package/dist/esm/plot/create/CreateAttackArrow.d.ts +5 -0
- package/dist/esm/plot/create/CreateAttackArrow.js +75 -0
- package/dist/esm/plot/create/CreateBillboard.d.ts +2 -0
- package/dist/esm/plot/create/CreateBillboard.js +47 -0
- package/dist/esm/plot/create/CreateBow.d.ts +2 -0
- package/dist/esm/plot/create/CreateBow.js +63 -0
- package/dist/esm/plot/create/CreateCircle.d.ts +2 -0
- package/dist/esm/plot/create/CreateCircle.js +68 -0
- package/dist/esm/plot/create/CreateCurve.d.ts +2 -0
- package/dist/esm/plot/create/CreateCurve.js +76 -0
- package/dist/esm/plot/create/CreateElliptic.d.ts +2 -0
- package/dist/esm/plot/create/CreateElliptic.js +69 -0
- package/dist/esm/plot/create/CreateFlag.d.ts +2 -0
- package/dist/esm/plot/create/CreateFlag.js +80 -0
- package/dist/esm/plot/create/CreateFormation.d.ts +2 -0
- package/dist/esm/plot/create/CreateFormation.js +65 -0
- package/dist/esm/plot/create/CreateFreeLine.d.ts +2 -0
- package/dist/esm/plot/create/CreateFreeLine.js +69 -0
- package/dist/esm/plot/create/CreateFreePolygon.d.ts +2 -0
- package/dist/esm/plot/create/CreateFreePolygon.js +65 -0
- package/dist/esm/plot/create/CreateLabel.d.ts +2 -0
- package/dist/esm/plot/create/CreateLabel.js +55 -0
- package/dist/esm/plot/create/CreateLineArrow.d.ts +2 -0
- package/dist/esm/plot/create/CreateLineArrow.js +79 -0
- package/dist/esm/plot/create/CreatePincerArrow.d.ts +5 -0
- package/dist/esm/plot/create/CreatePincerArrow.js +73 -0
- package/dist/esm/plot/create/CreatePoint.d.ts +2 -0
- package/dist/esm/plot/create/CreatePoint.js +47 -0
- package/dist/esm/plot/create/CreatePolygon.d.ts +2 -0
- package/dist/esm/plot/create/CreatePolygon.js +80 -0
- package/dist/esm/plot/create/CreatePolyline.d.ts +2 -0
- package/dist/esm/plot/create/CreatePolyline.js +70 -0
- package/dist/esm/plot/create/CreateRectangle.d.ts +2 -0
- package/dist/esm/plot/create/CreateRectangle.js +60 -0
- package/dist/esm/plot/create/CreateRegularPolygon.d.ts +2 -0
- package/dist/esm/plot/create/CreateRegularPolygon.js +75 -0
- package/dist/esm/plot/create/CreateRightAngleArrow.d.ts +5 -0
- package/dist/esm/plot/create/CreateRightAngleArrow.js +73 -0
- package/dist/esm/plot/create/CreateRoundRectangle.d.ts +2 -0
- package/dist/esm/plot/create/CreateRoundRectangle.js +63 -0
- package/dist/esm/plot/create/CreateSector.d.ts +2 -0
- package/dist/esm/plot/create/CreateSector.js +65 -0
- package/dist/esm/plot/create/CreateStraightArrow.d.ts +5 -0
- package/dist/esm/plot/create/CreateStraightArrow.js +65 -0
- package/dist/esm/plot/create/CreateSwallowtailArrow.d.ts +5 -0
- package/dist/esm/plot/create/CreateSwallowtailArrow.js +67 -0
- package/dist/esm/plot/create/index.d.ts +25 -0
- package/dist/esm/plot/create/index.js +25 -0
- package/dist/esm/plot/edit/EditAssemble.d.ts +8 -0
- package/dist/esm/plot/edit/EditAssemble.js +120 -0
- package/dist/esm/plot/edit/EditAttackArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditAttackArrow.js +182 -0
- package/dist/esm/plot/edit/EditBillboard.d.ts +7 -0
- package/dist/esm/plot/edit/EditBillboard.js +70 -0
- package/dist/esm/plot/edit/EditBow.d.ts +8 -0
- package/dist/esm/plot/edit/EditBow.js +119 -0
- package/dist/esm/plot/edit/EditCircle.d.ts +8 -0
- package/dist/esm/plot/edit/EditCircle.js +133 -0
- package/dist/esm/plot/edit/EditCurve.d.ts +8 -0
- package/dist/esm/plot/edit/EditCurve.js +180 -0
- package/dist/esm/plot/edit/EditElliptic.d.ts +8 -0
- package/dist/esm/plot/edit/EditElliptic.js +144 -0
- package/dist/esm/plot/edit/EditFlag.d.ts +8 -0
- package/dist/esm/plot/edit/EditFlag.js +121 -0
- package/dist/esm/plot/edit/EditFormation.d.ts +8 -0
- package/dist/esm/plot/edit/EditFormation.js +120 -0
- package/dist/esm/plot/edit/EditLabel.d.ts +7 -0
- package/dist/esm/plot/edit/EditLabel.js +100 -0
- package/dist/esm/plot/edit/EditLineArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditLineArrow.js +180 -0
- package/dist/esm/plot/edit/EditPincerArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditPincerArrow.js +121 -0
- package/dist/esm/plot/edit/EditPoint.d.ts +7 -0
- package/dist/esm/plot/edit/EditPoint.js +70 -0
- package/dist/esm/plot/edit/EditPolygon.d.ts +8 -0
- package/dist/esm/plot/edit/EditPolygon.js +181 -0
- package/dist/esm/plot/edit/EditPolyline.d.ts +8 -0
- package/dist/esm/plot/edit/EditPolyline.js +179 -0
- package/dist/esm/plot/edit/EditRectangle.d.ts +8 -0
- package/dist/esm/plot/edit/EditRectangle.js +119 -0
- package/dist/esm/plot/edit/EditRegularPolygon.d.ts +8 -0
- package/dist/esm/plot/edit/EditRegularPolygon.js +170 -0
- package/dist/esm/plot/edit/EditRightAngleArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditRightAngleArrow.js +143 -0
- package/dist/esm/plot/edit/EditRoundRectangle.d.ts +8 -0
- package/dist/esm/plot/edit/EditRoundRectangle.js +119 -0
- package/dist/esm/plot/edit/EditSector.d.ts +8 -0
- package/dist/esm/plot/edit/EditSector.js +120 -0
- package/dist/esm/plot/edit/EditStraightArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditStraightArrow.js +120 -0
- package/dist/esm/plot/edit/EditSwallowtailArrow.d.ts +8 -0
- package/dist/esm/plot/edit/EditSwallowtailArrow.js +121 -0
- package/dist/esm/plot/edit/index.d.ts +23 -0
- package/dist/esm/plot/edit/index.js +23 -0
- package/dist/esm/plot/utils/Algorithm.d.ts +2 -0
- package/dist/esm/plot/utils/Algorithm.js +316 -0
- package/dist/esm/plot/utils/Coordinate.d.ts +98 -0
- package/dist/esm/plot/utils/Coordinate.js +184 -0
- package/dist/esm/plot/utils/DomUtil.d.ts +34 -0
- package/dist/esm/plot/utils/DomUtil.js +100 -0
- package/dist/esm/plot/utils/PlotCommon.d.ts +101 -0
- package/dist/esm/plot/utils/PlotCommon.js +1412 -0
- package/dist/esm/plot/utils/ReminderTip.d.ts +10 -0
- package/dist/esm/plot/utils/ReminderTip.js +67 -0
- package/dist/esm/plot/utils/Tooltip.d.ts +3 -0
- package/dist/esm/plot/utils/Tooltip.js +97 -0
- package/dist/esm/plot/utils/plotUtil.d.ts +5 -0
- package/dist/esm/plot/utils/plotUtil.js +268 -0
- package/dist/esm/tool/utils.d.ts +8 -7
- package/dist/esm/tool/utils.js +20 -16
- package/dist/esm/toolTip/index.d.ts +2 -1
- package/dist/esm/toolTip/index.js +12 -6
- package/dist/esm/typings.d.ts +1 -0
- package/dist/umd/deeptwins-engine-3d.min.js +1 -1
- package/package.json +1 -1
- package/dist/esm/drawer/base.d.ts +0 -51
- package/dist/esm/drawer/base.js +0 -179
- package/dist/esm/drawer/painter.d.ts +0 -41
- package/dist/esm/drawer/painter.js +0 -115
- package/dist/esm/drawer/shape/Ellipse.d.ts +0 -10
- package/dist/esm/drawer/shape/Ellipse.js +0 -62
- package/dist/esm/drawer/shape/Rectangle.d.ts +0 -10
- package/dist/esm/drawer/shape/Rectangle.js +0 -85
- package/dist/esm/drawer/typings.d.ts +0 -106
- package/dist/esm/drawer/typings.js +0 -1
- package/dist/esm/measure/AreaMeasure.d.ts +0 -19
- package/dist/esm/measure/AreaSurfaceMeasure.d.ts +0 -30
- package/dist/esm/measure/AreaSurfaceMeasure.js +0 -151
- package/dist/esm/measure/DistanceMeasure.d.ts +0 -19
- package/dist/esm/measure/DistanceMeasure.js +0 -91
- package/dist/esm/measure/DistanceSurfaceMeasure.d.ts +0 -37
- package/dist/esm/measure/DistanceSurfaceMeasure.js +0 -122
- package/dist/esm/measure/Measure.d.ts +0 -111
- package/dist/esm/measure/Measure.js +0 -177
- package/dist/esm/tool/cesiumExtends/Subscriber/index.d.ts +0 -66
- package/dist/esm/tool/cesiumExtends/Subscriber/index.js +0 -246
- package/dist/esm/tool/kriging.d.ts +0 -10
- package/dist/esm/tool/kriging.js +0 -436
|
@@ -0,0 +1,1412 @@
|
|
|
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
|
+
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
|
+
|
|
22
|
+
/**
|
|
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
|
|
56
|
+
*/
|
|
57
|
+
var createBezierPoints = function createBezierPoints(anchorpoints) {
|
|
58
|
+
var degrees = [];
|
|
59
|
+
for (var index = 0; index < anchorpoints.length; index++) {
|
|
60
|
+
var degree = transformCartesianToWGS84(anchorpoints[index]);
|
|
61
|
+
degrees.push(degree);
|
|
62
|
+
}
|
|
63
|
+
var numpoints = 100;
|
|
64
|
+
var points = [];
|
|
65
|
+
for (var i = 0; i <= numpoints; i++) {
|
|
66
|
+
var point = computeBezierPoints(degrees, i / numpoints);
|
|
67
|
+
var cartesian = transformWGS84ToCartesian(point);
|
|
68
|
+
points.push(cartesian);
|
|
69
|
+
}
|
|
70
|
+
return points;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
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
|
|
113
|
+
*/
|
|
114
|
+
var getAttackArrowPoints = function getAttackArrowPoints(positions) {
|
|
115
|
+
var lnglatArr = [];
|
|
116
|
+
for (var i = 0; i < positions.length; i++) {
|
|
117
|
+
var lnglat = transformCartesianToWGS84(positions[i]);
|
|
118
|
+
lnglatArr.push([lnglat.x, lnglat.y]);
|
|
119
|
+
}
|
|
120
|
+
var res = xp.algorithm.tailedAttackArrow(lnglatArr);
|
|
121
|
+
var index = JSON.stringify(res.polygonalPoint).indexOf('null');
|
|
122
|
+
var points = [];
|
|
123
|
+
if (index == -1) points = res.polygonalPoint;
|
|
124
|
+
return points;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 创建直角箭头节点
|
|
129
|
+
* @param anchorpoints
|
|
130
|
+
* @returns
|
|
131
|
+
*/
|
|
132
|
+
var getRightAngleArrowPoints = function getRightAngleArrowPoints(anchorpoints) {
|
|
133
|
+
var degreePoints = [];
|
|
134
|
+
for (var index = 0; index < anchorpoints.length; index++) {
|
|
135
|
+
var degree = transformCartesianToWGS84(anchorpoints[index]);
|
|
136
|
+
degreePoints.push(degree);
|
|
137
|
+
}
|
|
138
|
+
var pointlist = calculateMorePoints(degreePoints);
|
|
139
|
+
var degreesArray = [];
|
|
140
|
+
pointlist.forEach(function (item) {
|
|
141
|
+
degreesArray.push(item.x, item.y);
|
|
142
|
+
});
|
|
143
|
+
return Cesium.Cartesian3.fromDegreesArray(degreesArray);
|
|
144
|
+
};
|
|
145
|
+
function calculateMorePoints(anchorpoints) {
|
|
146
|
+
var ratio = 6;
|
|
147
|
+
var pointsR;
|
|
148
|
+
if (anchorpoints.length > 2) {
|
|
149
|
+
var l = 0,
|
|
150
|
+
pointS,
|
|
151
|
+
pointE;
|
|
152
|
+
for (var i = 0; i < anchorpoints.length - 1; i++) {
|
|
153
|
+
pointS = anchorpoints[i]; //取出首尾两个点
|
|
154
|
+
pointE = anchorpoints[i + 1];
|
|
155
|
+
l += Math.sqrt((pointE.y - pointS.y) * (pointE.y - pointS.y) + (pointE.x - pointS.x) * (pointE.x - pointS.x));
|
|
156
|
+
}
|
|
157
|
+
var w = l / ratio;
|
|
158
|
+
var points_C_l = []; //定义左右控制点集合
|
|
159
|
+
var points_C_r = [];
|
|
160
|
+
var point_t_l = {
|
|
161
|
+
x: undefined,
|
|
162
|
+
y: undefined
|
|
163
|
+
}; //定义尾部左右的起始点
|
|
164
|
+
var point_t_r = {
|
|
165
|
+
x: undefined,
|
|
166
|
+
y: undefined
|
|
167
|
+
};
|
|
168
|
+
//计算中间的所有交点
|
|
169
|
+
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
|
+
//计算向量
|
|
174
|
+
var v_U_1_2 = {
|
|
175
|
+
x: pointU_2.x - pointU_1.x,
|
|
176
|
+
y: pointU_2.y - pointU_1.y
|
|
177
|
+
};
|
|
178
|
+
var v_U_2_3 = {
|
|
179
|
+
x: pointU_3.x - pointU_2.x,
|
|
180
|
+
y: pointU_3.y - pointU_2.y
|
|
181
|
+
};
|
|
182
|
+
var v_lr_1_2 = calculateVector(v_U_1_2, Math.PI / 2, w / 2);
|
|
183
|
+
var v_l_1_2 = v_lr_1_2[0];
|
|
184
|
+
var v_r_1_2 = v_lr_1_2[1];
|
|
185
|
+
var v_lr_2_3 = calculateVector(v_U_2_3, Math.PI / 2, w / 2);
|
|
186
|
+
var v_l_2_3 = v_lr_2_3[0];
|
|
187
|
+
var v_r_2_3 = v_lr_2_3[1];
|
|
188
|
+
//获取左右
|
|
189
|
+
var point_l_1 = {
|
|
190
|
+
x: pointU_1.x + (v_l_1_2 === null || v_l_1_2 === void 0 ? void 0 : v_l_1_2.x),
|
|
191
|
+
y: pointU_1.y + (v_l_1_2 === null || v_l_1_2 === void 0 ? void 0 : v_l_1_2.y)
|
|
192
|
+
};
|
|
193
|
+
var point_r_1 = {
|
|
194
|
+
x: pointU_1.x + (v_r_1_2 === null || v_r_1_2 === void 0 ? void 0 : v_r_1_2.x),
|
|
195
|
+
y: pointU_1.y + (v_r_1_2 === null || v_r_1_2 === void 0 ? void 0 : v_r_1_2.y)
|
|
196
|
+
};
|
|
197
|
+
var point_l_2 = {
|
|
198
|
+
x: pointU_2.x + (v_l_2_3 === null || v_l_2_3 === void 0 ? void 0 : v_l_2_3.x),
|
|
199
|
+
y: pointU_2.y + (v_l_2_3 === null || v_l_2_3 === void 0 ? void 0 : v_l_2_3.y)
|
|
200
|
+
};
|
|
201
|
+
var point_r_2 = {
|
|
202
|
+
x: pointU_2.x + (v_r_2_3 === null || v_r_2_3 === void 0 ? void 0 : v_r_2_3.x),
|
|
203
|
+
y: pointU_2.y + (v_r_2_3 === null || v_r_2_3 === void 0 ? void 0 : v_r_2_3.y)
|
|
204
|
+
};
|
|
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
|
+
var point_C_l = calculateIntersection(v_U_1_2, v_U_2_3, point_l_1, point_l_2);
|
|
211
|
+
var point_C_r = calculateIntersection(v_U_1_2, v_U_2_3, point_r_1, point_r_2);
|
|
212
|
+
//定义中间的控制点
|
|
213
|
+
var point_C_l_c = void 0;
|
|
214
|
+
var point_C_r_c = void 0;
|
|
215
|
+
if (j == 0) {
|
|
216
|
+
//记录下箭头尾部的左右两个端点
|
|
217
|
+
point_t_l = point_l_1;
|
|
218
|
+
point_t_r = point_r_1;
|
|
219
|
+
//计算第一个曲线控制点
|
|
220
|
+
point_C_l_c = {
|
|
221
|
+
x: (point_t_l.x + point_C_l.x) / 2,
|
|
222
|
+
y: (point_t_l.y + point_C_l.y) / 2
|
|
223
|
+
};
|
|
224
|
+
point_C_r_c = {
|
|
225
|
+
x: (point_t_r.x + point_C_r.x) / 2,
|
|
226
|
+
y: (point_t_r.y + point_C_r.y) / 2
|
|
227
|
+
};
|
|
228
|
+
//添加两个拐角控制点中间的中间控制点
|
|
229
|
+
points_C_l.push(point_C_l_c);
|
|
230
|
+
points_C_r.push(point_C_r_c);
|
|
231
|
+
} else {
|
|
232
|
+
//获取前一个拐角控制点
|
|
233
|
+
var point_C_l_q = points_C_l[points_C_l.length - 1];
|
|
234
|
+
var point_C_r_q = points_C_r[points_C_r.length - 1];
|
|
235
|
+
//计算两个拐角之间的中心控制点
|
|
236
|
+
point_C_l_c = {
|
|
237
|
+
x: (point_C_l_q.x + point_C_l.x) / 2,
|
|
238
|
+
y: (point_C_l_q.y + point_C_l.y) / 2
|
|
239
|
+
};
|
|
240
|
+
point_C_r_c = {
|
|
241
|
+
x: (point_C_r_q.x + point_C_r.x) / 2,
|
|
242
|
+
y: (point_C_r_q.y + point_C_r.y) / 2
|
|
243
|
+
};
|
|
244
|
+
//添加两个拐角控制点中间的中间控制点
|
|
245
|
+
points_C_l.push(point_C_l_c);
|
|
246
|
+
points_C_r.push(point_C_r_c);
|
|
247
|
+
}
|
|
248
|
+
//添加后面的拐角控制点
|
|
249
|
+
points_C_l.push(point_C_l);
|
|
250
|
+
points_C_r.push(point_C_r);
|
|
251
|
+
}
|
|
252
|
+
//计算
|
|
253
|
+
//进入计算头部
|
|
254
|
+
//计算一下头部的长度
|
|
255
|
+
var pointU_E2 = anchorpoints[anchorpoints.length - 2]; //倒数第二个用户点
|
|
256
|
+
var pointU_E1 = anchorpoints[anchorpoints.length - 1]; //最后一个用户点
|
|
257
|
+
var v_U_E2_E1 = {
|
|
258
|
+
x: pointU_E1.x - pointU_E2.x,
|
|
259
|
+
y: pointU_E1.y - pointU_E2.y
|
|
260
|
+
};
|
|
261
|
+
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
|
+
var point_h_l;
|
|
264
|
+
var point_h_r;
|
|
265
|
+
//头部左右两向量数组
|
|
266
|
+
var v_lr_h = [];
|
|
267
|
+
var v_l_h = {
|
|
268
|
+
x: undefined,
|
|
269
|
+
y: undefined
|
|
270
|
+
};
|
|
271
|
+
var v_r_h = {
|
|
272
|
+
x: undefined,
|
|
273
|
+
y: undefined
|
|
274
|
+
};
|
|
275
|
+
//定义曲线最后一个控制点,也就是头部结束点和最后一个拐角点的中点
|
|
276
|
+
var point_C_l_e = {
|
|
277
|
+
x: undefined,
|
|
278
|
+
y: undefined
|
|
279
|
+
};
|
|
280
|
+
var point_C_r_e = {
|
|
281
|
+
x: undefined,
|
|
282
|
+
y: undefined
|
|
283
|
+
};
|
|
284
|
+
//定义三角形的左右两个点
|
|
285
|
+
var point_triangle_l = {
|
|
286
|
+
x: undefined,
|
|
287
|
+
y: undefined
|
|
288
|
+
};
|
|
289
|
+
var point_triangle_r = {
|
|
290
|
+
x: undefined,
|
|
291
|
+
y: undefined
|
|
292
|
+
};
|
|
293
|
+
//获取当前的最后的控制点,也就是之前计算的拐角点
|
|
294
|
+
var point_C_l_eq = points_C_l[points_C_l.length - 1];
|
|
295
|
+
var point_C_r_eq = points_C_r[points_C_r.length - 1];
|
|
296
|
+
//三角的高度都不够
|
|
297
|
+
if (head_d <= w) {
|
|
298
|
+
v_lr_h = calculateVector(v_U_E2_E1, Math.PI / 2, w / 2);
|
|
299
|
+
v_l_h = v_lr_h[0];
|
|
300
|
+
v_r_h = v_lr_h[1];
|
|
301
|
+
//获取头部的左右两结束点
|
|
302
|
+
point_h_l = {
|
|
303
|
+
x: pointU_E2.x + v_l_h.x,
|
|
304
|
+
y: pointU_E2.y + v_l_h.y
|
|
305
|
+
};
|
|
306
|
+
point_h_r = {
|
|
307
|
+
x: pointU_E2.x + v_r_h.x,
|
|
308
|
+
y: pointU_E2.y + v_r_h.y
|
|
309
|
+
};
|
|
310
|
+
//计算最后的控制点
|
|
311
|
+
point_C_l_e = {
|
|
312
|
+
x: (point_C_l_eq.x + point_h_l.x) / 2,
|
|
313
|
+
y: (point_C_l_eq.y + point_h_l.y) / 2
|
|
314
|
+
};
|
|
315
|
+
point_C_r_e = {
|
|
316
|
+
x: (point_C_r_eq.x + point_h_r.x) / 2,
|
|
317
|
+
y: (point_C_r_eq.y + point_h_r.y) / 2
|
|
318
|
+
};
|
|
319
|
+
//添加最后的控制点(中心点)
|
|
320
|
+
points_C_l.push(point_C_l_e);
|
|
321
|
+
points_C_r.push(point_C_r_e);
|
|
322
|
+
//计算三角形的左右两点
|
|
323
|
+
point_triangle_l = {
|
|
324
|
+
x: 2 * point_h_l.x - pointU_E2.x,
|
|
325
|
+
y: 2 * point_h_l.y - pointU_E2.y
|
|
326
|
+
};
|
|
327
|
+
point_triangle_r = {
|
|
328
|
+
x: 2 * point_h_r.x - pointU_E2.x,
|
|
329
|
+
y: 2 * point_h_r.y - pointU_E2.y
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
//足够三角的高度
|
|
333
|
+
else {
|
|
334
|
+
//由于够了三角的高度,所以首先去掉三角的高度
|
|
335
|
+
//计算向量
|
|
336
|
+
var v_E2_E1 = {
|
|
337
|
+
x: pointU_E1.x - pointU_E2.x,
|
|
338
|
+
y: pointU_E1.y - pointU_E2.y
|
|
339
|
+
};
|
|
340
|
+
//取模
|
|
341
|
+
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
|
+
var point_c = {
|
|
344
|
+
x: pointU_E1.x - v_E2_E1.x * w / v_E2_E1_d,
|
|
345
|
+
y: pointU_E1.y - v_E2_E1.y * w / v_E2_E1_d
|
|
346
|
+
};
|
|
347
|
+
//计算出在三角形上底边上头部结束点
|
|
348
|
+
v_lr_h = calculateVector(v_U_E2_E1, Math.PI / 2, w / 2);
|
|
349
|
+
v_l_h = v_lr_h[0];
|
|
350
|
+
v_r_h = v_lr_h[1];
|
|
351
|
+
//获取头部的左右两结束点
|
|
352
|
+
point_h_l = {
|
|
353
|
+
x: point_c.x + v_l_h.x,
|
|
354
|
+
y: point_c.y + v_l_h.y
|
|
355
|
+
};
|
|
356
|
+
point_h_r = {
|
|
357
|
+
x: point_c.x + v_r_h.x,
|
|
358
|
+
y: point_c.y + v_r_h.y
|
|
359
|
+
};
|
|
360
|
+
//计算最后的控制点
|
|
361
|
+
point_C_l_e = {
|
|
362
|
+
x: (point_C_l_eq.x + point_h_l.x) / 2,
|
|
363
|
+
y: (point_C_l_eq.y + point_h_l.y) / 2
|
|
364
|
+
};
|
|
365
|
+
point_C_r_e = {
|
|
366
|
+
x: (point_C_r_eq.x + point_h_r.x) / 2,
|
|
367
|
+
y: (point_C_r_eq.y + point_h_r.y) / 2
|
|
368
|
+
};
|
|
369
|
+
//添加最后的控制点(中心点)
|
|
370
|
+
points_C_l.push(point_C_l_e);
|
|
371
|
+
points_C_r.push(point_C_r_e);
|
|
372
|
+
//计算三角形的左右点
|
|
373
|
+
point_triangle_l = {
|
|
374
|
+
x: 2 * point_h_l.x - point_c.x,
|
|
375
|
+
y: 2 * point_h_l.y - point_c.y
|
|
376
|
+
};
|
|
377
|
+
point_triangle_r = {
|
|
378
|
+
x: 2 * point_h_r.x - point_c.x,
|
|
379
|
+
y: 2 * point_h_r.y - point_c.y
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
//使用控制点计算差值
|
|
383
|
+
//计算贝塞尔的控制点
|
|
384
|
+
var points_BC_l = [],
|
|
385
|
+
points_BC_r = [];
|
|
386
|
+
for (var _i = 0; _i < points_C_l.length - 2; _i++) {
|
|
387
|
+
var temp_l = [];
|
|
388
|
+
var temp_r = [];
|
|
389
|
+
var temp1_l = points_C_l[_i];
|
|
390
|
+
var temp2_l = points_C_l[_i + 1];
|
|
391
|
+
var temp3_l = points_C_l[_i + 2];
|
|
392
|
+
var temp1_r = points_C_r[_i];
|
|
393
|
+
var temp2_r = points_C_r[_i + 1];
|
|
394
|
+
var temp3_r = points_C_r[_i + 2];
|
|
395
|
+
temp_l.push(temp1_l, temp2_l, temp3_l);
|
|
396
|
+
temp_r.push(temp1_r, temp2_r, temp3_r);
|
|
397
|
+
var points_temp_l = createBezierPoints(temp_l);
|
|
398
|
+
var points_temp_r = createBezierPoints(temp_r);
|
|
399
|
+
points_BC_l = points_BC_l.concat(points_temp_l);
|
|
400
|
+
points_BC_r = points_BC_r.concat(points_temp_r);
|
|
401
|
+
}
|
|
402
|
+
//组合左右点集和三角形三个点
|
|
403
|
+
pointsR = [point_t_l];
|
|
404
|
+
//首先连接左边的差值曲线
|
|
405
|
+
pointsR = pointsR.concat(points_BC_l);
|
|
406
|
+
//添加左边头部结束点
|
|
407
|
+
pointsR.push(point_h_l);
|
|
408
|
+
//添加三角形左边点
|
|
409
|
+
pointsR.push(point_triangle_l);
|
|
410
|
+
//添加三角形顶点
|
|
411
|
+
pointsR.push(pointU_E1);
|
|
412
|
+
//添加三角形右边点
|
|
413
|
+
pointsR.push(point_triangle_r);
|
|
414
|
+
//添加右边头部结束点
|
|
415
|
+
pointsR.push(point_h_r);
|
|
416
|
+
//合并右边的所有点(先把右边的点倒序)
|
|
417
|
+
pointsR = pointsR.concat(points_BC_r.reverse());
|
|
418
|
+
|
|
419
|
+
//添加右边尾部起始点
|
|
420
|
+
pointsR.push(point_t_r);
|
|
421
|
+
} else {
|
|
422
|
+
pointsR = calculateTwoPoints(anchorpoints);
|
|
423
|
+
}
|
|
424
|
+
return pointsR;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* 绘制直角箭头相关
|
|
428
|
+
* @param anchorpoints
|
|
429
|
+
* @param type 1-平尾直角;2-燕尾直角
|
|
430
|
+
* @returns
|
|
431
|
+
*/
|
|
432
|
+
function calculateTwoPoints(anchorpoints) {
|
|
433
|
+
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
434
|
+
var ratio = 6;
|
|
435
|
+
var pointS = anchorpoints[0]; //箭头起点
|
|
436
|
+
var pointE = anchorpoints[1]; //箭头终点
|
|
437
|
+
var controlPois = [];
|
|
438
|
+
var v_based = {
|
|
439
|
+
x: pointE.x - pointS.x,
|
|
440
|
+
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
|
|
446
|
+
var v_lr = calculateVector(v_based, Math.PI / 2, w / 2);
|
|
447
|
+
var v_l = v_lr[0];
|
|
448
|
+
var v_r = v_lr[1];
|
|
449
|
+
var point1 = {
|
|
450
|
+
x: pointS.x + (v_l === null || v_l === void 0 ? void 0 : v_l.x),
|
|
451
|
+
y: pointS.y + (v_l === null || v_l === void 0 ? void 0 : v_l.y)
|
|
452
|
+
};
|
|
453
|
+
var point2 = {
|
|
454
|
+
x: x_ + (v_l === null || v_l === void 0 ? void 0 : v_l.x),
|
|
455
|
+
y: y_ + (v_l === null || v_l === void 0 ? void 0 : v_l.y)
|
|
456
|
+
};
|
|
457
|
+
var point3 = {
|
|
458
|
+
x: x_ + 2 * (v_l === null || v_l === void 0 ? void 0 : v_l.x),
|
|
459
|
+
y: y_ + 2 * (v_l === null || v_l === void 0 ? void 0 : v_l.y)
|
|
460
|
+
};
|
|
461
|
+
var point4 = {
|
|
462
|
+
x: pointE.x,
|
|
463
|
+
y: pointE.y
|
|
464
|
+
};
|
|
465
|
+
var point5 = {
|
|
466
|
+
x: x_ + 2 * (v_r === null || v_r === void 0 ? void 0 : v_r.x),
|
|
467
|
+
y: y_ + 2 * (v_r === null || v_r === void 0 ? void 0 : v_r.y)
|
|
468
|
+
};
|
|
469
|
+
var point6 = {
|
|
470
|
+
x: x_ + (v_r === null || v_r === void 0 ? void 0 : v_r.x),
|
|
471
|
+
y: y_ + (v_r === null || v_r === void 0 ? void 0 : v_r.y)
|
|
472
|
+
};
|
|
473
|
+
var point7 = {
|
|
474
|
+
x: pointS.x + (v_r === null || v_r === void 0 ? void 0 : v_r.x),
|
|
475
|
+
y: pointS.y + (v_r === null || v_r === void 0 ? void 0 : v_r.y)
|
|
476
|
+
};
|
|
477
|
+
switch (type) {
|
|
478
|
+
case 1:
|
|
479
|
+
controlPois.push(point1, point2, point3, point4, point5, point6, point7);
|
|
480
|
+
break;
|
|
481
|
+
case 2:
|
|
482
|
+
var point8 = {
|
|
483
|
+
x: pointS.x + (pointE.x - pointS.x) / 10,
|
|
484
|
+
y: pointS.y + (pointE.y - pointS.y) / 10
|
|
485
|
+
};
|
|
486
|
+
controlPois.push(point1, point2, point3, point4, point5, point6, point7, point8);
|
|
487
|
+
break;
|
|
488
|
+
default:
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
return controlPois;
|
|
492
|
+
}
|
|
493
|
+
function calculateVector(v, theta, d) {
|
|
494
|
+
if (!theta) theta = Math.PI / 2;
|
|
495
|
+
if (!d) d = 1;
|
|
496
|
+
var x_1;
|
|
497
|
+
var x_2;
|
|
498
|
+
var y_1;
|
|
499
|
+
var y_2;
|
|
500
|
+
var v_l;
|
|
501
|
+
var v_r;
|
|
502
|
+
var d_v = Math.sqrt(v.x * v.x + v.y * v.y);
|
|
503
|
+
if (v.y == 0) {
|
|
504
|
+
x_1 = x_2 = d_v * d * Math.cos(theta) / v.x;
|
|
505
|
+
if (v.x > 0) {
|
|
506
|
+
y_1 = Math.sqrt(d * d - x_1 * x_1);
|
|
507
|
+
y_2 = -y_1;
|
|
508
|
+
} else if (v.x < 0) {
|
|
509
|
+
y_2 = Math.sqrt(d * d - x_1 * x_1);
|
|
510
|
+
y_1 = -y_2;
|
|
511
|
+
}
|
|
512
|
+
v_l = {
|
|
513
|
+
x: x_1,
|
|
514
|
+
y: y_1
|
|
515
|
+
};
|
|
516
|
+
v_r = {
|
|
517
|
+
x: x_2,
|
|
518
|
+
y: y_2
|
|
519
|
+
};
|
|
520
|
+
} else {
|
|
521
|
+
var n = -v.x / v.y;
|
|
522
|
+
var m = d * d_v * Math.cos(theta) / v.y;
|
|
523
|
+
var a = 1 + n * n;
|
|
524
|
+
var b = 2 * n * m;
|
|
525
|
+
var c = m * m - d * d;
|
|
526
|
+
x_1 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
|
|
527
|
+
x_2 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
|
|
528
|
+
y_1 = n * x_1 + m;
|
|
529
|
+
y_2 = n * x_2 + m;
|
|
530
|
+
if (v.y >= 0) {
|
|
531
|
+
v_l = {
|
|
532
|
+
x: x_1,
|
|
533
|
+
y: y_1
|
|
534
|
+
};
|
|
535
|
+
v_r = {
|
|
536
|
+
x: x_2,
|
|
537
|
+
y: y_2
|
|
538
|
+
};
|
|
539
|
+
} else if (v.y < 0) {
|
|
540
|
+
v_l = {
|
|
541
|
+
x: x_2,
|
|
542
|
+
y: y_2
|
|
543
|
+
};
|
|
544
|
+
v_r = {
|
|
545
|
+
x: x_1,
|
|
546
|
+
y: y_1
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return [v_l, v_r];
|
|
551
|
+
}
|
|
552
|
+
function calculateIntersection(v_1, v_2, point1, point2) {
|
|
553
|
+
var x;
|
|
554
|
+
var y;
|
|
555
|
+
if (v_1.y * v_2.x - v_1.x * v_2.y == 0) {
|
|
556
|
+
if (v_1.x * v_2.x > 0 || v_1.y * v_2.y > 0) {
|
|
557
|
+
x = (point1.x + point2.x) / 2;
|
|
558
|
+
y = (point1.y + point2.y) / 2;
|
|
559
|
+
} else {
|
|
560
|
+
x = point2.x;
|
|
561
|
+
y = point2.y;
|
|
562
|
+
}
|
|
563
|
+
} else {
|
|
564
|
+
//
|
|
565
|
+
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
|
+
if (v_1.x != 0) {
|
|
567
|
+
y = (x - point1.x) * v_1.y / v_1.x + point1.y;
|
|
568
|
+
} else {
|
|
569
|
+
y = (x - point2.x) * v_2.y / v_2.x + point2.y;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return {
|
|
573
|
+
x: x,
|
|
574
|
+
y: y
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* 计算贝塞尔曲线特征点
|
|
580
|
+
* @param anchorpoints
|
|
581
|
+
* @param t
|
|
582
|
+
* @returns - {{x: number, y: number}}
|
|
583
|
+
* @private
|
|
584
|
+
*/
|
|
585
|
+
var computeBezierPoints = function computeBezierPoints(anchorpoints, t) {
|
|
586
|
+
var x = 0,
|
|
587
|
+
y = 0;
|
|
588
|
+
var Binomial_coefficient = computeBinomial(anchorpoints);
|
|
589
|
+
for (var j = 0; j < anchorpoints.length; j++) {
|
|
590
|
+
var tempPoint = anchorpoints[j];
|
|
591
|
+
var coefficient = Math.pow(1 - t, anchorpoints.length - 1 - j) * Math.pow(t, j) * Binomial_coefficient[j];
|
|
592
|
+
x += tempPoint.x * coefficient;
|
|
593
|
+
y += tempPoint.y * coefficient;
|
|
594
|
+
}
|
|
595
|
+
return {
|
|
596
|
+
x: x,
|
|
597
|
+
y: y
|
|
598
|
+
};
|
|
599
|
+
};
|
|
600
|
+
/**
|
|
601
|
+
* 计算二项式系数
|
|
602
|
+
* @param anchorpoints
|
|
603
|
+
* @returns - {Array}
|
|
604
|
+
* @private
|
|
605
|
+
*/
|
|
606
|
+
var computeBinomial = function computeBinomial(anchorpoints) {
|
|
607
|
+
var lens = anchorpoints.length;
|
|
608
|
+
var Binomial_coefficient = [];
|
|
609
|
+
Binomial_coefficient.push(1);
|
|
610
|
+
for (var k = 1; k < lens - 1; k++) {
|
|
611
|
+
var cs = 1,
|
|
612
|
+
bcs = 1;
|
|
613
|
+
for (var m = 0; m < k; m++) {
|
|
614
|
+
cs = cs * (lens - 1 - m);
|
|
615
|
+
bcs = bcs * (k - m);
|
|
616
|
+
}
|
|
617
|
+
Binomial_coefficient.push(cs / bcs);
|
|
618
|
+
}
|
|
619
|
+
Binomial_coefficient.push(1);
|
|
620
|
+
return Binomial_coefficient;
|
|
621
|
+
};
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* 获取椭圆和圆形的轴长
|
|
625
|
+
* @param points
|
|
626
|
+
* @returns
|
|
627
|
+
*/
|
|
628
|
+
var getSemiAxis = function getSemiAxis(points) {
|
|
629
|
+
return points.length === 2 ? Cesium.Cartesian3.distance(points[0], points[1]) : 0;
|
|
630
|
+
};
|
|
631
|
+
/**
|
|
632
|
+
* 获取椭圆旋转的角度
|
|
633
|
+
* @param points
|
|
634
|
+
* @returns
|
|
635
|
+
*/
|
|
636
|
+
var getEllipticAngle = function getEllipticAngle(points) {
|
|
637
|
+
var p1 = transformCartesianToWGS84(points[0]);
|
|
638
|
+
var p2 = transformCartesianToWGS84(points[1]);
|
|
639
|
+
var angle = 450 - calculateAngle(p1, p2);
|
|
640
|
+
return Cesium.Math.toRadians(angle);
|
|
641
|
+
};
|
|
642
|
+
|
|
643
|
+
/**
|
|
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
|
|
659
|
+
*/
|
|
660
|
+
var computeAssemblePoints = function computeAssemblePoints(anchorpoints) {
|
|
661
|
+
var points = [];
|
|
662
|
+
var originP = transformCartesianToWGS84(anchorpoints[0]);
|
|
663
|
+
var lastP = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
664
|
+
x: originP.x + 0.00001,
|
|
665
|
+
y: originP.y + 0.00001,
|
|
666
|
+
z: originP.z
|
|
667
|
+
};
|
|
668
|
+
var vectorOL = {
|
|
669
|
+
x: lastP.x - originP.x,
|
|
670
|
+
y: lastP.y - originP.y
|
|
671
|
+
};
|
|
672
|
+
var dOL = Math.sqrt(vectorOL.x * vectorOL.x + vectorOL.y * vectorOL.y);
|
|
673
|
+
var v_O_P1_lr = calculateVector(vectorOL, Math.PI / 3, Math.sqrt(3) / 12 * dOL);
|
|
674
|
+
var originP_P1 = v_O_P1_lr[1];
|
|
675
|
+
var p1 = {
|
|
676
|
+
x: originP.x + (originP_P1 === null || originP_P1 === void 0 ? void 0 : originP_P1.x),
|
|
677
|
+
y: originP.y + (originP_P1 === null || originP_P1 === void 0 ? void 0 : originP_P1.y)
|
|
678
|
+
};
|
|
679
|
+
var p2 = {
|
|
680
|
+
x: (originP.x + lastP.x) / 2,
|
|
681
|
+
y: (originP.y + lastP.y) / 2
|
|
682
|
+
};
|
|
683
|
+
var v_L_P3_lr = calculateVector(vectorOL, Math.PI * 2 / 3, Math.sqrt(3) / 12 * dOL);
|
|
684
|
+
var lastP_P3 = v_L_P3_lr[1];
|
|
685
|
+
var p3 = {
|
|
686
|
+
x: lastP.x + lastP_P3.x,
|
|
687
|
+
y: lastP.y + lastP_P3.y
|
|
688
|
+
};
|
|
689
|
+
var v_O_P5_lr = calculateVector(vectorOL, Math.PI / 2, 1 / 2 * dOL);
|
|
690
|
+
var v_O_P5 = v_O_P5_lr[0];
|
|
691
|
+
var p5 = {
|
|
692
|
+
x: v_O_P5.x + p2.x,
|
|
693
|
+
y: v_O_P5.y + p2.y
|
|
694
|
+
};
|
|
695
|
+
var p0 = originP;
|
|
696
|
+
var p4 = lastP;
|
|
697
|
+
points.push(p0, p1, p2, p3, p4, p5);
|
|
698
|
+
var closeCardinal = createCloseCardinal(points);
|
|
699
|
+
var fb_points = calculatePointsFBZ3(closeCardinal, 100);
|
|
700
|
+
var result = [];
|
|
701
|
+
for (var index = 0; index < fb_points.length; index++) {
|
|
702
|
+
var ele = fb_points[index];
|
|
703
|
+
result.push(ele.x, ele.y, 0);
|
|
704
|
+
}
|
|
705
|
+
return result;
|
|
706
|
+
};
|
|
707
|
+
/**
|
|
708
|
+
* 生成闭合的样条点
|
|
709
|
+
* @param points
|
|
710
|
+
* @returns {*}
|
|
711
|
+
*/
|
|
712
|
+
function createCloseCardinal(points) {
|
|
713
|
+
if (points == null || points.length < 3) {
|
|
714
|
+
return points;
|
|
715
|
+
}
|
|
716
|
+
//获取起点,作为终点,以闭合曲线。
|
|
717
|
+
var lastP = points[0];
|
|
718
|
+
points.push(lastP);
|
|
719
|
+
//定义传入的点数组,将在点数组中央(每两个点)插入两个控制点
|
|
720
|
+
var cPoints = points;
|
|
721
|
+
//包含输入点和控制点的数组
|
|
722
|
+
var cardinalPoints = [];
|
|
723
|
+
//至少三个点以上
|
|
724
|
+
//这些都是相关资料测出的经验数值
|
|
725
|
+
//定义张力系数,取值在0<t<0.5
|
|
726
|
+
var t = 0.4;
|
|
727
|
+
//为端点张力系数因子,取值在0<b<1
|
|
728
|
+
// let b = 0.5;
|
|
729
|
+
//误差控制,是一个大于等于0的数,用于三点非常趋近与一条直线时,减少计算量
|
|
730
|
+
var e = 0.005;
|
|
731
|
+
//传入的点数量,至少有三个,n至少为2
|
|
732
|
+
var n = cPoints.length - 1;
|
|
733
|
+
//从开始遍历到倒数第二个,其中倒数第二个用于计算起点(终点)的插值控制点
|
|
734
|
+
for (var k = 0; k <= n - 1; k++) {
|
|
735
|
+
var p0 = void 0,
|
|
736
|
+
p1 = void 0,
|
|
737
|
+
p2 = void 0;
|
|
738
|
+
//计算起点(终点)的左右控制点
|
|
739
|
+
if (k == n - 1) {
|
|
740
|
+
//三个基础输入点
|
|
741
|
+
p0 = cPoints[n - 1];
|
|
742
|
+
p1 = cPoints[0];
|
|
743
|
+
p2 = cPoints[1];
|
|
744
|
+
} else {
|
|
745
|
+
p0 = cPoints[k];
|
|
746
|
+
p1 = cPoints[k + 1];
|
|
747
|
+
p2 = cPoints[k + 2];
|
|
748
|
+
}
|
|
749
|
+
//定义p1的左控制点和右控制点
|
|
750
|
+
var p1l = {
|
|
751
|
+
x: undefined,
|
|
752
|
+
y: undefined
|
|
753
|
+
};
|
|
754
|
+
var p1r = {
|
|
755
|
+
x: undefined,
|
|
756
|
+
y: undefined
|
|
757
|
+
};
|
|
758
|
+
//通过p0、p1、p2计算p1点的做控制点p1l和又控制点p1r
|
|
759
|
+
//计算向量p0_p1和p1_p2
|
|
760
|
+
var p0_p1 = {
|
|
761
|
+
x: p1.x - p0.x,
|
|
762
|
+
y: p1.y - p0.y
|
|
763
|
+
};
|
|
764
|
+
var p1_p2 = {
|
|
765
|
+
x: p2.x - p1.x,
|
|
766
|
+
y: p2.y - p1.y
|
|
767
|
+
};
|
|
768
|
+
//并计算模
|
|
769
|
+
var d01 = Math.sqrt(p0_p1.x * p0_p1.x + p0_p1.y * p0_p1.y);
|
|
770
|
+
var d12 = Math.sqrt(p1_p2.x * p1_p2.x + p1_p2.y * p1_p2.y);
|
|
771
|
+
//向量单位化
|
|
772
|
+
var p0_p1_1 = {
|
|
773
|
+
x: p0_p1.x / d01,
|
|
774
|
+
y: p0_p1.y / d01
|
|
775
|
+
};
|
|
776
|
+
var p1_p2_1 = {
|
|
777
|
+
x: p1_p2.x / d12,
|
|
778
|
+
y: p1_p2.y / d12
|
|
779
|
+
};
|
|
780
|
+
//计算向量p0_p1和p1_p2的夹角平分线向量
|
|
781
|
+
var p0_p1_p2 = {
|
|
782
|
+
x: p0_p1_1.x + p1_p2_1.x,
|
|
783
|
+
y: p0_p1_1.y + p1_p2_1.y
|
|
784
|
+
};
|
|
785
|
+
//计算向量 p0_p1_p2 的模
|
|
786
|
+
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
|
+
var p0_p1_p2_1 = {
|
|
789
|
+
x: p0_p1_p2.x / d012,
|
|
790
|
+
y: p0_p1_p2.y / d012
|
|
791
|
+
};
|
|
792
|
+
//判断p0、p1、p2是否共线,这里判定向量p0_p1和p1_p2的夹角的余弦和1的差值小于e就认为三点共线
|
|
793
|
+
var cosE_p0p1p2 = (p0_p1_1.x * p1_p2_1.x + p0_p1_1.y * p1_p2_1.y) / 1;
|
|
794
|
+
//共线
|
|
795
|
+
if (Math.abs(1 - cosE_p0p1p2) < e) {
|
|
796
|
+
//计算p1l的坐标
|
|
797
|
+
p1l.x = p1.x - p1_p2_1.x * d01 * t;
|
|
798
|
+
p1l.y = p1.y - p1_p2_1.y * d01 * t;
|
|
799
|
+
//计算p1r的坐标
|
|
800
|
+
p1r.x = p1.x + p0_p1_1.x * d12 * t;
|
|
801
|
+
p1r.y = p1.y + p0_p1_1.y * d12 * t;
|
|
802
|
+
}
|
|
803
|
+
//非共线
|
|
804
|
+
else {
|
|
805
|
+
//计算p1l的坐标
|
|
806
|
+
p1l.x = p1.x - p0_p1_p2_1.x * d01 * t;
|
|
807
|
+
p1l.y = p1.y - p0_p1_p2_1.y * d01 * t;
|
|
808
|
+
//计算p1r的坐标
|
|
809
|
+
p1r.x = p1.x + p0_p1_p2_1.x * d12 * t;
|
|
810
|
+
p1r.y = p1.y + p0_p1_p2_1.y * d12 * t;
|
|
811
|
+
}
|
|
812
|
+
//记录起点(终点)的左右插值控制点及倒数第二个控制点
|
|
813
|
+
if (k == n - 1) {
|
|
814
|
+
cardinalPoints[0] = p1;
|
|
815
|
+
cardinalPoints[1] = p1r;
|
|
816
|
+
cardinalPoints[(n - 2) * 3 + 2 + 3] = p1l;
|
|
817
|
+
cardinalPoints[(n - 2) * 3 + 2 + 4] = cPoints[n];
|
|
818
|
+
} else {
|
|
819
|
+
//记录下这三个控制点
|
|
820
|
+
cardinalPoints[k * 3 + 2 + 0] = p1l;
|
|
821
|
+
cardinalPoints[k * 3 + 2 + 1] = p1;
|
|
822
|
+
cardinalPoints[k * 3 + 2 + 2] = p1r;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
return cardinalPoints;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* 计算三阶贝塞尔点
|
|
829
|
+
* @param points
|
|
830
|
+
* @param part
|
|
831
|
+
* @returns {Array}
|
|
832
|
+
*/
|
|
833
|
+
function calculatePointsFBZ3(points, part) {
|
|
834
|
+
if (!part) part = 20;
|
|
835
|
+
//获取待拆分的点
|
|
836
|
+
var bezierPts = [];
|
|
837
|
+
var scale = 0.05;
|
|
838
|
+
if (part > 0) {
|
|
839
|
+
scale = 1 / part;
|
|
840
|
+
}
|
|
841
|
+
for (var i = 0; i < points.length - 3;) {
|
|
842
|
+
//起始点
|
|
843
|
+
var pointS = points[i];
|
|
844
|
+
//第一个控制点
|
|
845
|
+
var pointC1 = points[i + 1];
|
|
846
|
+
//第二个控制点
|
|
847
|
+
var pointC2 = points[i + 2];
|
|
848
|
+
//结束点
|
|
849
|
+
var pointE = points[i + 3];
|
|
850
|
+
bezierPts.push(pointS);
|
|
851
|
+
for (var t = 0; t < 1;) {
|
|
852
|
+
//三次贝塞尔曲线公式
|
|
853
|
+
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
|
+
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
|
+
var point = {
|
|
856
|
+
x: x,
|
|
857
|
+
y: y
|
|
858
|
+
};
|
|
859
|
+
bezierPts.push(point);
|
|
860
|
+
t += scale;
|
|
861
|
+
}
|
|
862
|
+
i += 3;
|
|
863
|
+
if (i >= points.length) {
|
|
864
|
+
bezierPts.push(pointS);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
return bezierPts;
|
|
868
|
+
}
|
|
869
|
+
var calculateSwallowPoints = function calculateSwallowPoints(anchorpoints, type) {
|
|
870
|
+
var points = [];
|
|
871
|
+
switch (type) {
|
|
872
|
+
case 1:
|
|
873
|
+
points = computeSwallowtailArrow(anchorpoints);
|
|
874
|
+
break;
|
|
875
|
+
case 2:
|
|
876
|
+
points = computeSwallowtailArrow2(anchorpoints);
|
|
877
|
+
break;
|
|
878
|
+
case 3:
|
|
879
|
+
points = computeSwallowtailArrow(anchorpoints, false);
|
|
880
|
+
default:
|
|
881
|
+
break;
|
|
882
|
+
}
|
|
883
|
+
return points;
|
|
884
|
+
};
|
|
885
|
+
/**
|
|
886
|
+
* 计算燕尾箭头特征点
|
|
887
|
+
* @param anchorpoints
|
|
888
|
+
* @returns {number[]}
|
|
889
|
+
* @private
|
|
890
|
+
*/
|
|
891
|
+
var computeSwallowtailArrow = function computeSwallowtailArrow(anchorpoints) {
|
|
892
|
+
var swallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
893
|
+
var p0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
894
|
+
var p1 = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
895
|
+
x: p0.x + 0.00001,
|
|
896
|
+
y: p0.y + 0.00001,
|
|
897
|
+
z: p0.z
|
|
898
|
+
};
|
|
899
|
+
var x0 = p0.x;
|
|
900
|
+
var y0 = p0.y;
|
|
901
|
+
var x1 = p1.x;
|
|
902
|
+
var y1 = p1.y;
|
|
903
|
+
var xt = (15.8 * x1 + 3.2 * x0) / 19;
|
|
904
|
+
var yt = (15.8 * y1 + 3.2 * y0) / 19;
|
|
905
|
+
var ap = new Array(7);
|
|
906
|
+
ap[0] = {
|
|
907
|
+
x: x1,
|
|
908
|
+
y: y1
|
|
909
|
+
};
|
|
910
|
+
ap[1] = {
|
|
911
|
+
x: xt + 0.85 / 3.2 * (y1 - yt),
|
|
912
|
+
y: yt - 0.85 / 3.2 * (x1 - xt)
|
|
913
|
+
};
|
|
914
|
+
ap[2] = {
|
|
915
|
+
x: xt + 0.25 / 3.2 * (y1 - yt),
|
|
916
|
+
y: yt - 0.25 / 3.2 * (x1 - xt)
|
|
917
|
+
};
|
|
918
|
+
ap[3] = {
|
|
919
|
+
x: x0 + 1.6 / 19 * (y1 - y0),
|
|
920
|
+
y: y0 - 1.6 / 19 * (x1 - x0)
|
|
921
|
+
};
|
|
922
|
+
ap[4] = swallow ? {
|
|
923
|
+
x: (3.2 * x1 + 15.8 * x0) / 19,
|
|
924
|
+
y: (3.2 * y1 + 15.8 * y0) / 19
|
|
925
|
+
} : undefined;
|
|
926
|
+
ap[5] = {
|
|
927
|
+
x: x0 - 1.6 / 19 * (y1 - y0),
|
|
928
|
+
y: y0 + 1.6 / 19 * (x1 - x0)
|
|
929
|
+
};
|
|
930
|
+
ap[6] = {
|
|
931
|
+
x: xt - 0.25 / 3.2 * (y1 - yt),
|
|
932
|
+
y: yt + 0.25 / 3.2 * (x1 - xt)
|
|
933
|
+
};
|
|
934
|
+
ap[7] = {
|
|
935
|
+
x: xt - 0.85 / 3.2 * (y1 - yt),
|
|
936
|
+
y: yt + 0.85 / 3.2 * (x1 - xt)
|
|
937
|
+
};
|
|
938
|
+
var degress = [];
|
|
939
|
+
for (var index = 0; index < ap.length; index++) {
|
|
940
|
+
var ele = ap[index];
|
|
941
|
+
ele && degress.push(ele.x, ele.y, 0);
|
|
942
|
+
}
|
|
943
|
+
return degress;
|
|
944
|
+
};
|
|
945
|
+
/**
|
|
946
|
+
* 计算燕尾箭头2特征点
|
|
947
|
+
* @param anchorpoints
|
|
948
|
+
*/
|
|
949
|
+
var computeSwallowtailArrow2 = function computeSwallowtailArrow2(anchorpoints) {
|
|
950
|
+
var p0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
951
|
+
var p1 = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
952
|
+
x: p0.x + 0.00001,
|
|
953
|
+
y: p0.y + 0.00001,
|
|
954
|
+
z: p0.z
|
|
955
|
+
};
|
|
956
|
+
var pointlist = calculateTwoPoints([p0, p1], 2);
|
|
957
|
+
var degreesArray = [];
|
|
958
|
+
pointlist.forEach(function (item) {
|
|
959
|
+
degreesArray.push(item.x, item.y, 0);
|
|
960
|
+
});
|
|
961
|
+
return degreesArray;
|
|
962
|
+
};
|
|
963
|
+
/**
|
|
964
|
+
* 计算钳击箭头特征点
|
|
965
|
+
* @param points
|
|
966
|
+
* @returns
|
|
967
|
+
*/
|
|
968
|
+
var calculatePincerArrowPoint = function calculatePincerArrowPoint(points) {
|
|
969
|
+
if (points.length < 3) return null;
|
|
970
|
+
var lnglatArr = [];
|
|
971
|
+
for (var i = 0; i < points.length; i++) {
|
|
972
|
+
var degree = transformCartesianToWGS84(points[i]);
|
|
973
|
+
lnglatArr.push([degree.x, degree.y]);
|
|
974
|
+
}
|
|
975
|
+
var res = xp.algorithm.doubleArrow(lnglatArr);
|
|
976
|
+
var result = [];
|
|
977
|
+
var index = JSON.stringify(res.polygonalPoint).indexOf('null');
|
|
978
|
+
if (index == -1) result = res.polygonalPoint;
|
|
979
|
+
return result;
|
|
980
|
+
};
|
|
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
|
+
}
|
|
1121
|
+
/**
|
|
1122
|
+
* 计算并构建阵型过程点
|
|
1123
|
+
* @param {*} anchorpoints
|
|
1124
|
+
* @returns
|
|
1125
|
+
*/
|
|
1126
|
+
var calculateFormationPoints = function calculateFormationPoints(anchorpoints, type) {
|
|
1127
|
+
var pos0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
1128
|
+
var pos1 = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
1129
|
+
x: pos0.x + 0.00001,
|
|
1130
|
+
y: pos0.y + 0.00001,
|
|
1131
|
+
z: pos0.z
|
|
1132
|
+
};
|
|
1133
|
+
var centerX = (pos0.x + pos1.x) / 2;
|
|
1134
|
+
var centerY = (pos0.y + pos1.y) / 2;
|
|
1135
|
+
var center = {
|
|
1136
|
+
x: centerX,
|
|
1137
|
+
y: centerY
|
|
1138
|
+
}; //起点和终点的中间点坐标
|
|
1139
|
+
var lectCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
|
|
1140
|
+
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); //获取模拟的圆心坐标
|
|
1145
|
+
var angle_left = calculateAngle(sourcePos, pos0);
|
|
1146
|
+
var circleRadius = Math.pow(2, 0.5) * radius;
|
|
1147
|
+
var points = [];
|
|
1148
|
+
type = type === 0 ? 0.9 : 1.1;
|
|
1149
|
+
for (var index = 0; index < 90; index++) {
|
|
1150
|
+
var cur_angle = angle_left + index;
|
|
1151
|
+
var cur_point = getPointByAngleDistance(sourcePos.x, sourcePos.y, cur_angle, circleRadius);
|
|
1152
|
+
points.push({
|
|
1153
|
+
x: cur_point.x,
|
|
1154
|
+
y: cur_point.y
|
|
1155
|
+
});
|
|
1156
|
+
if (index != 0 && index % 15 == 0) {
|
|
1157
|
+
var cur_point1 = getPointByAngleDistance(sourcePos.x, sourcePos.y, cur_angle, circleRadius * type);
|
|
1158
|
+
points.push({
|
|
1159
|
+
x: cur_point1.x,
|
|
1160
|
+
y: cur_point1.y
|
|
1161
|
+
});
|
|
1162
|
+
points.push({
|
|
1163
|
+
x: cur_point.x,
|
|
1164
|
+
y: cur_point.y
|
|
1165
|
+
});
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
var resultPos = [];
|
|
1169
|
+
points.forEach(function (item) {
|
|
1170
|
+
resultPos.push(item.x, item.y);
|
|
1171
|
+
});
|
|
1172
|
+
return Cesium.Cartesian3.fromDegreesArray(resultPos);
|
|
1173
|
+
};
|
|
1174
|
+
/**
|
|
1175
|
+
* 计算并构建弓形过程点
|
|
1176
|
+
* @param {*} anchorpoints
|
|
1177
|
+
* @returns
|
|
1178
|
+
*/
|
|
1179
|
+
var calculateBowPoints = function calculateBowPoints(anchorpoints) {
|
|
1180
|
+
var pos0 = transformCartesianToWGS84(anchorpoints[0]);
|
|
1181
|
+
var pos1 = anchorpoints[1] ? transformCartesianToWGS84(anchorpoints[1]) : {
|
|
1182
|
+
x: pos0.x + 0.00001,
|
|
1183
|
+
y: pos0.y + 0.00001,
|
|
1184
|
+
z: pos0.z
|
|
1185
|
+
};
|
|
1186
|
+
var centerX = (pos0.x + pos1.x) / 2;
|
|
1187
|
+
var centerY = (pos0.y + pos1.y) / 2;
|
|
1188
|
+
var center = {
|
|
1189
|
+
x: centerX,
|
|
1190
|
+
y: centerY
|
|
1191
|
+
}; //起点和终点的中间点坐标
|
|
1192
|
+
var lectCartesian3 = Cesium.Cartesian3.fromDegrees(pos0.x, pos0.y);
|
|
1193
|
+
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); //获取模拟的圆心坐标
|
|
1198
|
+
var angle_left = calculateAngle(sourcePos, pos0);
|
|
1199
|
+
var circleRadius = Math.pow(2, 0.5) * radius;
|
|
1200
|
+
var points = [];
|
|
1201
|
+
for (var index = 0; index < 90; index++) {
|
|
1202
|
+
var cur_angle = angle_left + index;
|
|
1203
|
+
var cur_point = getPointByAngleDistance(sourcePos.x, sourcePos.y, cur_angle, circleRadius);
|
|
1204
|
+
points.push({
|
|
1205
|
+
x: cur_point.x,
|
|
1206
|
+
y: cur_point.y
|
|
1207
|
+
});
|
|
1208
|
+
}
|
|
1209
|
+
var resultPos = [];
|
|
1210
|
+
points.forEach(function (item) {
|
|
1211
|
+
resultPos.push(item.x, item.y);
|
|
1212
|
+
});
|
|
1213
|
+
return Cesium.Cartesian3.fromDegreesArray(resultPos);
|
|
1214
|
+
};
|
|
1215
|
+
/**
|
|
1216
|
+
* 已知点根据角度和距离求取另一点坐标(二维) 注:WGS84坐标系
|
|
1217
|
+
* @param {*} lng 经度
|
|
1218
|
+
* @param {*} lat 纬度
|
|
1219
|
+
* @param {*} angle 角度 (0~360度)
|
|
1220
|
+
* @param {*} distance 距离 (米)
|
|
1221
|
+
*
|
|
1222
|
+
*/
|
|
1223
|
+
function getPointByAngleDistance(lng, lat, angle, distance) {
|
|
1224
|
+
var a = 6378137; // 赤道半径
|
|
1225
|
+
var b = 6356752.3142; // 短半径
|
|
1226
|
+
var f = 1 / 298.257223563; // 扁率
|
|
1227
|
+
|
|
1228
|
+
var alpha1 = angle * (Math.PI / 180);
|
|
1229
|
+
var sinAlpha1 = Math.sin(alpha1);
|
|
1230
|
+
var cosAlpha1 = Math.cos(alpha1);
|
|
1231
|
+
var tanU1 = (1 - f) * Math.tan(lat * (Math.PI / 180));
|
|
1232
|
+
var cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1),
|
|
1233
|
+
sinU1 = tanU1 * cosU1;
|
|
1234
|
+
var sigma1 = Math.atan2(tanU1, cosAlpha1);
|
|
1235
|
+
var sinAlpha = cosU1 * sinAlpha1;
|
|
1236
|
+
var cosSqAlpha = 1 - sinAlpha * sinAlpha;
|
|
1237
|
+
var uSq = cosSqAlpha * (a * a - b * b) / (b * b);
|
|
1238
|
+
var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
|
|
1239
|
+
var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
|
|
1240
|
+
var sigma = distance / (b * A),
|
|
1241
|
+
sigmaP = 2 * Math.PI;
|
|
1242
|
+
var cos2SigmaM;
|
|
1243
|
+
var sinSigma;
|
|
1244
|
+
var cosSigma;
|
|
1245
|
+
while (Math.abs(sigma - sigmaP) > 1e-12) {
|
|
1246
|
+
cos2SigmaM = Math.cos(2 * sigma1 + sigma);
|
|
1247
|
+
sinSigma = Math.sin(sigma);
|
|
1248
|
+
cosSigma = Math.cos(sigma);
|
|
1249
|
+
var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
|
|
1250
|
+
sigmaP = sigma;
|
|
1251
|
+
sigma = distance / (b * A) + deltaSigma;
|
|
1252
|
+
}
|
|
1253
|
+
var tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;
|
|
1254
|
+
var lat2 = Math.atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1, (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp));
|
|
1255
|
+
var lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1);
|
|
1256
|
+
var C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
|
|
1257
|
+
var L = lambda - (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
|
|
1258
|
+
return {
|
|
1259
|
+
x: lng + L * (180 / Math.PI),
|
|
1260
|
+
y: lat2 * (180 / Math.PI)
|
|
1261
|
+
};
|
|
1262
|
+
}
|
|
1263
|
+
/**
|
|
1264
|
+
* 计算圆角矩形节点
|
|
1265
|
+
* @param anchor
|
|
1266
|
+
* @returns
|
|
1267
|
+
*/
|
|
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
|
+
var calculateSectorPoints = function calculateSectorPoints(points) {
|
|
1370
|
+
var pos0 = transformCartesianToWGS84(points[0]);
|
|
1371
|
+
pos0.z = 0;
|
|
1372
|
+
var pos1 = points[1] ? transformCartesianToWGS84(points[1]) : {
|
|
1373
|
+
x: pos0.x + 0.00001,
|
|
1374
|
+
y: pos0.y,
|
|
1375
|
+
z: 0
|
|
1376
|
+
};
|
|
1377
|
+
var distance = points[1] ? Cesium.Cartesian3.distance(points[0], points[1]) : 0.1;
|
|
1378
|
+
var pos2 = points[2] ? transformCartesianToWGS84(points[2]) : {
|
|
1379
|
+
x: pos1.x + 0.0000001,
|
|
1380
|
+
y: pos1.y,
|
|
1381
|
+
z: 0
|
|
1382
|
+
};
|
|
1383
|
+
var startAngle = calculateAngle(pos0, pos1);
|
|
1384
|
+
var endAngle = calculateAngle(pos0, pos2);
|
|
1385
|
+
// // 将角度转换为弧度
|
|
1386
|
+
var startAngleRad = Math.min(startAngle, endAngle);
|
|
1387
|
+
var endAngleRad = Math.max(startAngle, endAngle);
|
|
1388
|
+
// 获取扇形的所有坐标值
|
|
1389
|
+
var coordinates = [];
|
|
1390
|
+
coordinates.push(pos0.x, pos0.y); // 扇形中心坐标
|
|
1391
|
+
|
|
1392
|
+
// 扇形边界点坐标
|
|
1393
|
+
var numPoints = 100; // 分割圆弧的点数,可以根据需要调整
|
|
1394
|
+
var angleStep = (endAngleRad - startAngleRad) / numPoints;
|
|
1395
|
+
for (var i = 0; i <= numPoints; i++) {
|
|
1396
|
+
var angle = startAngleRad + i * angleStep;
|
|
1397
|
+
var point = getPointByAngleDistance(pos0.x, pos0.y, angle, distance);
|
|
1398
|
+
coordinates.push(point.x, point.y);
|
|
1399
|
+
}
|
|
1400
|
+
coordinates.push(pos0.x, pos0.y);
|
|
1401
|
+
return Cesium.Cartesian3.fromDegreesArray(coordinates);
|
|
1402
|
+
};
|
|
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 };
|