@cesium/engine 3.0.2 → 5.0.0

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 (246) hide show
  1. package/Build/ThirdParty/Workers/pako_deflate.min.js +605 -0
  2. package/Build/ThirdParty/Workers/pako_inflate.min.js +800 -0
  3. package/Build/ThirdParty/Workers/z-worker-pako.js +502 -0
  4. package/Build/Workers/chunk-2U6EBIRX.js +757 -0
  5. package/Build/Workers/chunk-2ZI7FZ3Q.js +58 -0
  6. package/Build/Workers/chunk-3TSHZWOZ.js +1860 -0
  7. package/Build/Workers/chunk-44B6FQSJ.js +684 -0
  8. package/Build/Workers/chunk-4AJR66C5.js +368 -0
  9. package/Build/Workers/chunk-4HN3N5SE.js +501 -0
  10. package/Build/Workers/chunk-4QGPYV3W.js +102 -0
  11. package/Build/Workers/chunk-4RKE4B3G.js +476 -0
  12. package/Build/Workers/chunk-5E3V7Y4R.js +196 -0
  13. package/Build/Workers/chunk-6EHT6GS3.js +163 -0
  14. package/Build/Workers/chunk-6I22NWKQ.js +171 -0
  15. package/Build/Workers/chunk-7N67FBLW.js +1054 -0
  16. package/Build/Workers/chunk-AQQGAFKX.js +124 -0
  17. package/Build/Workers/chunk-CROU4RHL.js +138 -0
  18. package/Build/Workers/chunk-CTJCECTX.js +258 -0
  19. package/Build/Workers/chunk-DWJZFZ67.js +781 -0
  20. package/Build/Workers/chunk-EHJQEARC.js +59 -0
  21. package/Build/Workers/chunk-EVLKHUAE.js +1477 -0
  22. package/Build/Workers/chunk-FOOYJER7.js +834 -0
  23. package/Build/Workers/chunk-GLCRFDOB.js +73 -0
  24. package/Build/Workers/chunk-GPO47TW4.js +39 -0
  25. package/Build/Workers/chunk-H5Q2JKIA.js +1075 -0
  26. package/Build/Workers/chunk-HIDSEUWS.js +2041 -0
  27. package/Build/Workers/chunk-HV67ARO7.js +302 -0
  28. package/Build/Workers/chunk-IC7G4BX2.js +421 -0
  29. package/Build/Workers/chunk-IQN2LMGD.js +55 -0
  30. package/Build/Workers/chunk-J2FHYK2Z.js +55 -0
  31. package/Build/Workers/chunk-K3VEWONC.js +289 -0
  32. package/Build/Workers/chunk-KZFXE35V.js +117 -0
  33. package/Build/Workers/chunk-MG2TXIO5.js +400 -0
  34. package/Build/Workers/chunk-MRCFDEKH.js +138 -0
  35. package/Build/Workers/chunk-MYDS6HBL.js +3273 -0
  36. package/Build/Workers/chunk-OCIX2CQ7.js +305 -0
  37. package/Build/Workers/chunk-P32XMW4I.js +2716 -0
  38. package/Build/Workers/chunk-PEVZYZBQ.js +157 -0
  39. package/Build/Workers/chunk-PMDLIBEQ.js +218 -0
  40. package/Build/Workers/chunk-QDUOGCCO.js +1009 -0
  41. package/Build/Workers/chunk-QUCJGBCK.js +430 -0
  42. package/Build/Workers/chunk-RCI7BSOM.js +452 -0
  43. package/Build/Workers/chunk-SVTSC7FX.js +390 -0
  44. package/Build/Workers/chunk-TXOGSFHZ.js +77 -0
  45. package/Build/Workers/chunk-TXYJOVQK.js +629 -0
  46. package/Build/Workers/chunk-UFIT5XDI.js +1258 -0
  47. package/Build/Workers/chunk-ULLMQNFQ.js +73 -0
  48. package/Build/Workers/chunk-UM7FIUQW.js +101 -0
  49. package/Build/Workers/{package.js → chunk-UMLTOPAE.js} +13 -2
  50. package/Build/Workers/chunk-V5S5N2IS.js +8644 -0
  51. package/Build/Workers/chunk-VN2IHJKM.js +513 -0
  52. package/Build/Workers/chunk-VWSD2XV5.js +669 -0
  53. package/Build/Workers/chunk-X2KIWBTW.js +100 -0
  54. package/Build/Workers/chunk-Y24CDOJC.js +353 -0
  55. package/Build/Workers/chunk-YLMDWSXO.js +44 -0
  56. package/Build/Workers/chunk-YNZ4DMR7.js +634 -0
  57. package/Build/Workers/chunk-Z2MP3UBE.js +236 -0
  58. package/Build/Workers/combineGeometry.js +65 -15
  59. package/Build/Workers/createBoxGeometry.js +55 -10
  60. package/Build/Workers/createBoxOutlineGeometry.js +231 -310
  61. package/Build/Workers/createCircleGeometry.js +185 -202
  62. package/Build/Workers/createCircleOutlineGeometry.js +141 -155
  63. package/Build/Workers/createCoplanarPolygonGeometry.js +477 -557
  64. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +218 -230
  65. package/Build/Workers/createCorridorGeometry.js +1163 -1307
  66. package/Build/Workers/createCorridorOutlineGeometry.js +534 -569
  67. package/Build/Workers/createCylinderGeometry.js +57 -10
  68. package/Build/Workers/createCylinderOutlineGeometry.js +224 -258
  69. package/Build/Workers/createEllipseGeometry.js +68 -12
  70. package/Build/Workers/createEllipseOutlineGeometry.js +61 -12
  71. package/Build/Workers/createEllipsoidGeometry.js +56 -10
  72. package/Build/Workers/createEllipsoidOutlineGeometry.js +58 -13
  73. package/Build/Workers/createFrustumGeometry.js +55 -10
  74. package/Build/Workers/createFrustumOutlineGeometry.js +226 -243
  75. package/Build/Workers/createGeometry.js +143 -48
  76. package/Build/Workers/createGroundPolylineGeometry.js +1484 -2012
  77. package/Build/Workers/createPlaneGeometry.js +216 -243
  78. package/Build/Workers/createPlaneOutlineGeometry.js +121 -113
  79. package/Build/Workers/createPolygonGeometry.js +1437 -1314
  80. package/Build/Workers/createPolygonOutlineGeometry.js +516 -657
  81. package/Build/Workers/createPolylineGeometry.js +471 -547
  82. package/Build/Workers/createPolylineVolumeGeometry.js +354 -384
  83. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +272 -295
  84. package/Build/Workers/createRectangleGeometry.js +1128 -1331
  85. package/Build/Workers/createRectangleOutlineGeometry.js +445 -500
  86. package/Build/Workers/createSimplePolylineGeometry.js +381 -440
  87. package/Build/Workers/createSphereGeometry.js +112 -118
  88. package/Build/Workers/createSphereOutlineGeometry.js +112 -121
  89. package/Build/Workers/createTaskProcessorWorker.js +32 -127
  90. package/Build/Workers/createVectorTileClampedPolylines.js +462 -505
  91. package/Build/Workers/createVectorTileGeometries.js +377 -436
  92. package/Build/Workers/createVectorTilePoints.js +110 -77
  93. package/Build/Workers/createVectorTilePolygons.js +369 -391
  94. package/Build/Workers/createVectorTilePolylines.js +252 -244
  95. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +543 -615
  96. package/Build/Workers/createVerticesFromHeightmap.js +2244 -2677
  97. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +682 -904
  98. package/Build/Workers/createWallGeometry.js +459 -593
  99. package/Build/Workers/createWallOutlineGeometry.js +324 -419
  100. package/Build/Workers/decodeDraco.js +327 -347
  101. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +2530 -3567
  102. package/Build/Workers/decodeI3S.js +765 -970
  103. package/Build/Workers/transcodeKTX2.js +3351 -1473
  104. package/Build/Workers/transferTypedArrayTest.js +3 -4
  105. package/Build/Workers/upsampleQuantizedTerrainMesh.js +748 -953
  106. package/LICENSE.md +0 -12
  107. package/Source/Core/CesiumTerrainProvider.js +1 -2
  108. package/Source/Core/Credit.js +7 -1
  109. package/Source/Core/FeatureDetection.js +9 -0
  110. package/Source/Core/GoogleMaps.js +1 -2
  111. package/Source/Core/Ion.js +1 -2
  112. package/Source/Core/KTX2Transcoder.js +7 -3
  113. package/Source/Core/PolygonGeometry.js +340 -27
  114. package/Source/Core/PolygonGeometryLibrary.js +302 -1
  115. package/Source/Core/Stereographic.js +247 -0
  116. package/Source/Core/TaskProcessor.js +185 -168
  117. package/Source/Core/Transforms.js +2 -2
  118. package/Source/Core/buildModuleUrl.js +6 -5
  119. package/Source/Core/sampleTerrain.js +43 -10
  120. package/Source/Core/sampleTerrainMostDetailed.js +27 -3
  121. package/Source/Scene/ArcGisMapService.js +1 -2
  122. package/Source/Scene/Billboard.js +7 -0
  123. package/Source/Scene/Cesium3DTilePass.js +1 -1
  124. package/Source/Scene/Cesium3DTileset.js +38 -81
  125. package/Source/Scene/CreditDisplay.js +2 -2
  126. package/Source/Scene/DracoLoader.js +26 -3
  127. package/Source/Scene/I3SDataProvider.js +0 -27
  128. package/Source/Scene/I3SDecoder.js +127 -0
  129. package/Source/Scene/I3SNode.js +32 -110
  130. package/Source/Scene/Implicit3DTileContent.js +13 -0
  131. package/Source/Scene/ImplicitTileset.js +5 -0
  132. package/Source/Scene/LabelCollection.js +3 -1
  133. package/Source/Scene/Model/I3dmLoader.js +5 -1
  134. package/Source/Scene/Model/Model.js +20 -23
  135. package/Source/Scene/OpenStreetMapImageryProvider.js +4 -1
  136. package/Source/Scene/PostProcessStageLibrary.js +3 -3
  137. package/Source/Scene/PrimitiveCollection.js +39 -0
  138. package/Source/Scene/Scene.js +3 -0
  139. package/Source/Scene/SingleTileImageryProvider.js +4 -2
  140. package/Source/ThirdParty/Workers/basis_transcoder.js +1 -1
  141. package/Source/Widget/CesiumWidget.js +2 -1
  142. package/Source/{WorkersES6 → Workers}/createGeometry.js +11 -12
  143. package/Source/{WorkersES6 → Workers}/createTaskProcessorWorker.js +43 -59
  144. package/Source/{WorkersES6 → Workers}/decodeDraco.js +19 -25
  145. package/Source/{WorkersES6 → Workers}/decodeI3S.js +18 -32
  146. package/Source/{WorkersES6 → Workers}/transcodeKTX2.js +19 -26
  147. package/Source/Workers/transferTypedArrayTest.js +0 -6
  148. package/index.d.ts +69 -35
  149. package/index.js +189 -187
  150. package/package.json +2 -1
  151. package/Build/Workers/ArcType-2d9abbbc.js +0 -37
  152. package/Build/Workers/AttributeCompression-f9f6c717.js +0 -716
  153. package/Build/Workers/AxisAlignedBoundingBox-a03420b1.js +0 -258
  154. package/Build/Workers/BoundingRectangle-32fa8a4a.js +0 -369
  155. package/Build/Workers/BoxGeometry-cd550612.js +0 -884
  156. package/Build/Workers/Check-6ede7e26.js +0 -290
  157. package/Build/Workers/Color-571a6085.js +0 -2262
  158. package/Build/Workers/ComponentDatatype-cf1fa08e.js +0 -341
  159. package/Build/Workers/CoplanarPolygonGeometryLibrary-488b1a9f.js +0 -132
  160. package/Build/Workers/CorridorGeometryLibrary-fc4ff147.js +0 -498
  161. package/Build/Workers/CylinderGeometry-bc26926d.js +0 -467
  162. package/Build/Workers/CylinderGeometryLibrary-7bf291b4.js +0 -63
  163. package/Build/Workers/EllipseGeometry-89533a10.js +0 -1304
  164. package/Build/Workers/EllipseGeometryLibrary-b0d7df17.js +0 -366
  165. package/Build/Workers/EllipseOutlineGeometry-63ff7a87.js +0 -443
  166. package/Build/Workers/EllipsoidGeodesic-5b3623dc.js +0 -520
  167. package/Build/Workers/EllipsoidGeometry-07e99d2d.js +0 -637
  168. package/Build/Workers/EllipsoidOutlineGeometry-ba5c7ee2.js +0 -454
  169. package/Build/Workers/EllipsoidRhumbLine-ef872433.js +0 -741
  170. package/Build/Workers/EllipsoidTangentPlane-65d41b3e.js +0 -373
  171. package/Build/Workers/EncodedCartesian3-57415c8a.js +0 -171
  172. package/Build/Workers/FrustumGeometry-4a7589ed.js +0 -2540
  173. package/Build/Workers/GeometryAttribute-a5b6275b.js +0 -619
  174. package/Build/Workers/GeometryAttributes-ad136444.js +0 -91
  175. package/Build/Workers/GeometryInstance-34d9e21e.js +0 -121
  176. package/Build/Workers/GeometryOffsetAttribute-9ad0019c.js +0 -16
  177. package/Build/Workers/GeometryPipeline-fa9e6ffc.js +0 -3690
  178. package/Build/Workers/IndexDatatype-2643aa47.js +0 -200
  179. package/Build/Workers/IntersectionTests-feace3da.js +0 -1836
  180. package/Build/Workers/Math-0a2ac845.js +0 -1340
  181. package/Build/Workers/Matrix2-e1298525.js +0 -7086
  182. package/Build/Workers/Matrix3-41c58dde.js +0 -4283
  183. package/Build/Workers/OrientedBoundingBox-6b94d955.js +0 -1259
  184. package/Build/Workers/Plane-4c3d403b.js +0 -309
  185. package/Build/Workers/PolygonGeometryLibrary-4ffc457d.js +0 -1074
  186. package/Build/Workers/PolygonPipeline-d5e66350.js +0 -1344
  187. package/Build/Workers/PolylinePipeline-83410f0c.js +0 -573
  188. package/Build/Workers/PolylineVolumeGeometryLibrary-290e7aec.js +0 -781
  189. package/Build/Workers/PrimitivePipeline-6081d138.js +0 -966
  190. package/Build/Workers/RectangleGeometryLibrary-986710d8.js +0 -280
  191. package/Build/Workers/RuntimeError-ef395448.js +0 -68
  192. package/Build/Workers/TerrainEncoding-528e1d68.js +0 -1227
  193. package/Build/Workers/Transforms-b527bb09.js +0 -14714
  194. package/Build/Workers/VertexFormat-030f11ff.js +0 -312
  195. package/Build/Workers/WallGeometryLibrary-faf583f8.js +0 -211
  196. package/Build/Workers/WebGLConstants-0b1ce7ba.js +0 -620
  197. package/Build/Workers/WebMercatorProjection-13ed1a6e.js +0 -151
  198. package/Build/Workers/arrayRemoveDuplicates-d2061e85.js +0 -129
  199. package/Build/Workers/cesiumWorkerBootstrapper.js +0 -1363
  200. package/Build/Workers/combine-d9581036.js +0 -82
  201. package/Build/Workers/defaultValue-fe22d8c0.js +0 -51
  202. package/Source/ThirdParty/Workers/draco_decoder_nodejs.js +0 -117
  203. package/Source/Workers/cesiumWorkerBootstrapper.js +0 -2290
  204. package/Source/Workers/package.json +0 -1
  205. /package/Source/{WorkersES6 → Workers}/combineGeometry.js +0 -0
  206. /package/Source/{WorkersES6 → Workers}/createBoxGeometry.js +0 -0
  207. /package/Source/{WorkersES6 → Workers}/createBoxOutlineGeometry.js +0 -0
  208. /package/Source/{WorkersES6 → Workers}/createCircleGeometry.js +0 -0
  209. /package/Source/{WorkersES6 → Workers}/createCircleOutlineGeometry.js +0 -0
  210. /package/Source/{WorkersES6 → Workers}/createCoplanarPolygonGeometry.js +0 -0
  211. /package/Source/{WorkersES6 → Workers}/createCoplanarPolygonOutlineGeometry.js +0 -0
  212. /package/Source/{WorkersES6 → Workers}/createCorridorGeometry.js +0 -0
  213. /package/Source/{WorkersES6 → Workers}/createCorridorOutlineGeometry.js +0 -0
  214. /package/Source/{WorkersES6 → Workers}/createCylinderGeometry.js +0 -0
  215. /package/Source/{WorkersES6 → Workers}/createCylinderOutlineGeometry.js +0 -0
  216. /package/Source/{WorkersES6 → Workers}/createEllipseGeometry.js +0 -0
  217. /package/Source/{WorkersES6 → Workers}/createEllipseOutlineGeometry.js +0 -0
  218. /package/Source/{WorkersES6 → Workers}/createEllipsoidGeometry.js +0 -0
  219. /package/Source/{WorkersES6 → Workers}/createEllipsoidOutlineGeometry.js +0 -0
  220. /package/Source/{WorkersES6 → Workers}/createFrustumGeometry.js +0 -0
  221. /package/Source/{WorkersES6 → Workers}/createFrustumOutlineGeometry.js +0 -0
  222. /package/Source/{WorkersES6 → Workers}/createGroundPolylineGeometry.js +0 -0
  223. /package/Source/{WorkersES6 → Workers}/createPlaneGeometry.js +0 -0
  224. /package/Source/{WorkersES6 → Workers}/createPlaneOutlineGeometry.js +0 -0
  225. /package/Source/{WorkersES6 → Workers}/createPolygonGeometry.js +0 -0
  226. /package/Source/{WorkersES6 → Workers}/createPolygonOutlineGeometry.js +0 -0
  227. /package/Source/{WorkersES6 → Workers}/createPolylineGeometry.js +0 -0
  228. /package/Source/{WorkersES6 → Workers}/createPolylineVolumeGeometry.js +0 -0
  229. /package/Source/{WorkersES6 → Workers}/createPolylineVolumeOutlineGeometry.js +0 -0
  230. /package/Source/{WorkersES6 → Workers}/createRectangleGeometry.js +0 -0
  231. /package/Source/{WorkersES6 → Workers}/createRectangleOutlineGeometry.js +0 -0
  232. /package/Source/{WorkersES6 → Workers}/createSimplePolylineGeometry.js +0 -0
  233. /package/Source/{WorkersES6 → Workers}/createSphereGeometry.js +0 -0
  234. /package/Source/{WorkersES6 → Workers}/createSphereOutlineGeometry.js +0 -0
  235. /package/Source/{WorkersES6 → Workers}/createVectorTileClampedPolylines.js +0 -0
  236. /package/Source/{WorkersES6 → Workers}/createVectorTileGeometries.js +0 -0
  237. /package/Source/{WorkersES6 → Workers}/createVectorTilePoints.js +0 -0
  238. /package/Source/{WorkersES6 → Workers}/createVectorTilePolygons.js +0 -0
  239. /package/Source/{WorkersES6 → Workers}/createVectorTilePolylines.js +0 -0
  240. /package/Source/{WorkersES6 → Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +0 -0
  241. /package/Source/{WorkersES6 → Workers}/createVerticesFromHeightmap.js +0 -0
  242. /package/Source/{WorkersES6 → Workers}/createVerticesFromQuantizedTerrainMesh.js +0 -0
  243. /package/Source/{WorkersES6 → Workers}/createWallGeometry.js +0 -0
  244. /package/Source/{WorkersES6 → Workers}/createWallOutlineGeometry.js +0 -0
  245. /package/Source/{WorkersES6 → Workers}/decodeGoogleEarthEnterprisePacket.js +0 -0
  246. /package/Source/{WorkersES6 → Workers}/upsampleQuantizedTerrainMesh.js +0 -0
@@ -13,8 +13,11 @@ import GeometryAttribute from "./GeometryAttribute.js";
13
13
  import GeometryAttributes from "./GeometryAttributes.js";
14
14
  import GeometryPipeline from "./GeometryPipeline.js";
15
15
  import IndexDatatype from "./IndexDatatype.js";
16
+ import IntersectionTests from "./IntersectionTests.js";
16
17
  import CesiumMath from "./Math.js";
17
18
  import Matrix3 from "./Matrix3.js";
19
+ import Plane from "./Plane.js";
20
+ import PolygonHierarchy from "./PolygonHierarchy.js";
18
21
  import PolygonPipeline from "./PolygonPipeline.js";
19
22
  import PrimitiveType from "./PrimitiveType.js";
20
23
  import Quaternion from "./Quaternion.js";
@@ -466,12 +469,294 @@ PolygonGeometryLibrary.polygonOutlinesFromHierarchy = function (
466
469
  return polygons;
467
470
  };
468
471
 
472
+ const scratchRhumbIntersection = new Cartographic();
473
+ function computeEquatorIntersectionRhumb(start, end, ellipsoid) {
474
+ const c0 = ellipsoid.cartesianToCartographic(start, scratchCartographic0);
475
+ const c1 = ellipsoid.cartesianToCartographic(end, scratchCartographic1);
476
+
477
+ if (Math.sign(c0.latitude) === Math.sign(c1.latitude)) {
478
+ return;
479
+ }
480
+
481
+ scratchRhumbLine.setEndPoints(c0, c1);
482
+
483
+ const intersection = scratchRhumbLine.findIntersectionWithLatitude(
484
+ 0,
485
+ scratchRhumbIntersection
486
+ );
487
+
488
+ if (!defined(intersection)) {
489
+ return;
490
+ }
491
+
492
+ let minLongitude = Math.min(c0.longitude, c1.longitude);
493
+ let maxLongitude = Math.max(c0.longitude, c1.longitude);
494
+
495
+ if (Math.abs(maxLongitude - minLongitude) > CesiumMath.PI) {
496
+ // Crosses IDL, flip min and max
497
+ const swap = minLongitude;
498
+ minLongitude = maxLongitude;
499
+ maxLongitude = swap;
500
+ }
501
+
502
+ if (
503
+ intersection.longitude < minLongitude ||
504
+ intersection.longitude > maxLongitude
505
+ ) {
506
+ return;
507
+ }
508
+
509
+ return ellipsoid.cartographicToCartesian(intersection);
510
+ }
511
+
512
+ function computeEquatorIntersection(start, end, ellipsoid, arcType) {
513
+ if (arcType === ArcType.RHUMB) {
514
+ return computeEquatorIntersectionRhumb(start, end, ellipsoid);
515
+ }
516
+
517
+ const intersection = IntersectionTests.lineSegmentPlane(
518
+ start,
519
+ end,
520
+ Plane.ORIGIN_XY_PLANE
521
+ );
522
+
523
+ if (!defined(intersection)) {
524
+ return;
525
+ }
526
+
527
+ return ellipsoid.scaleToGeodeticSurface(intersection, intersection);
528
+ }
529
+
530
+ const scratchCartographic = new Cartographic();
531
+ function computeEdgesOnPlane(positions, ellipsoid, arcType) {
532
+ const edgesOnPlane = [];
533
+ let startPoint,
534
+ endPoint,
535
+ type,
536
+ next,
537
+ intersection,
538
+ i = 0;
539
+ while (i < positions.length) {
540
+ startPoint = positions[i];
541
+ endPoint = positions[(i + 1) % positions.length];
542
+
543
+ type = CesiumMath.sign(startPoint.z);
544
+ next = CesiumMath.sign(endPoint.z);
545
+
546
+ const getLongitude = (position) => {
547
+ const cartographic = ellipsoid.cartesianToCartographic(
548
+ position,
549
+ scratchCartographic
550
+ );
551
+ return cartographic.longitude;
552
+ };
553
+
554
+ if (type === 0) {
555
+ // The start position is on the split
556
+ edgesOnPlane.push({
557
+ position: i,
558
+ type: type,
559
+ visited: false,
560
+ next: next,
561
+ theta: getLongitude(startPoint),
562
+ });
563
+ } else if (next !== 0) {
564
+ intersection = computeEquatorIntersection(
565
+ startPoint,
566
+ endPoint,
567
+ ellipsoid,
568
+ arcType
569
+ );
570
+
571
+ ++i;
572
+ if (!defined(intersection)) {
573
+ // The line segment is entirely above or below
574
+ continue;
575
+ }
576
+
577
+ // The line segment passed through
578
+ positions.splice(i, 0, intersection);
579
+ edgesOnPlane.push({
580
+ position: i,
581
+ type: type,
582
+ visited: false,
583
+ next: next,
584
+ theta: getLongitude(intersection),
585
+ });
586
+ }
587
+
588
+ ++i;
589
+ }
590
+
591
+ return edgesOnPlane;
592
+ }
593
+
594
+ function wirePolygon(
595
+ polygons,
596
+ polygonIndex,
597
+ positions,
598
+ edgesOnPlane,
599
+ toDelete,
600
+ startIndex,
601
+ abovePlane
602
+ ) {
603
+ const polygon = [];
604
+ let i = startIndex;
605
+ const getMatchingEdge = (i) => (edge) => edge.position === i;
606
+ const polygonsToWire = [];
607
+ do {
608
+ const position = positions[i];
609
+ polygon.push(position);
610
+
611
+ const edgeIndex = edgesOnPlane.findIndex(getMatchingEdge(i));
612
+ const edge = edgesOnPlane[edgeIndex];
613
+ if (!defined(edge)) {
614
+ // The current segment does not intersect
615
+ ++i;
616
+ continue;
617
+ }
618
+
619
+ const { visited: hasBeenVisited, type, next } = edge;
620
+ edge.visited = true;
621
+
622
+ if (type === 0) {
623
+ if (next === 0) {
624
+ // Special case where we'll need to backtrack along the edge
625
+ const previousEdge = edgesOnPlane[edgeIndex - (abovePlane ? 1 : -1)];
626
+ if (previousEdge?.position === i + 1) {
627
+ previousEdge.visited = true;
628
+ } else {
629
+ ++i;
630
+ continue;
631
+ }
632
+ }
633
+
634
+ // Special case where 3 polygons meet
635
+ if (
636
+ (!hasBeenVisited && abovePlane && next > 0) ||
637
+ (startIndex === i && !abovePlane && next < 0)
638
+ ) {
639
+ ++i;
640
+ continue;
641
+ }
642
+ }
643
+
644
+ const followEdge = abovePlane ? type >= 0 : type <= 0;
645
+ if (!followEdge) {
646
+ ++i;
647
+ continue;
648
+ }
649
+
650
+ if (!hasBeenVisited) {
651
+ // Wire another polygon starting at this position on the other side of the edge
652
+ polygonsToWire.push(i);
653
+ }
654
+
655
+ // Continue counter-clockwise to the next edge
656
+ const nextEdgeIndex = edgeIndex + (abovePlane ? 1 : -1);
657
+ const nextEdge = edgesOnPlane[nextEdgeIndex];
658
+ if (!defined(nextEdge)) {
659
+ ++i;
660
+ continue;
661
+ }
662
+
663
+ i = nextEdge.position;
664
+ } while (
665
+ i < positions.length &&
666
+ i >= 0 &&
667
+ i !== startIndex &&
668
+ polygon.length < positions.length
669
+ );
670
+
671
+ polygons.splice(polygonIndex, toDelete, polygon);
672
+
673
+ for (const index of polygonsToWire) {
674
+ polygonIndex = wirePolygon(
675
+ polygons,
676
+ ++polygonIndex,
677
+ positions,
678
+ edgesOnPlane,
679
+ 0,
680
+ index,
681
+ !abovePlane
682
+ );
683
+ }
684
+
685
+ return polygonIndex;
686
+ }
687
+
688
+ /**
689
+ * Splits an array of polygons, defined as a list of Cartesian3 positions in counter-clockwise winding order, along the equator.
690
+ *
691
+ * @param {Array<Cartesian3[]>} outerRings An array of polygons, defined as a list of Cartesian3 positions in counter-clockwise winding order.
692
+ * @param {Ellipsoid} ellipsoid The ellipsoid to be used as a reference.
693
+ * @param {ArcType} arcType The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
694
+ * @param {Array<Cartesian3[]>} [result] An array of split polygons.
695
+ *
696
+ * @returns {Array<Cartesian3[]>} An array of split polygons.
697
+ */
698
+ PolygonGeometryLibrary.splitPolygonsOnEquator = function (
699
+ outerRings,
700
+ ellipsoid,
701
+ arcType,
702
+ result
703
+ ) {
704
+ if (!defined(result)) {
705
+ result = [];
706
+ }
707
+
708
+ result.splice(0, 0, ...outerRings);
709
+ result.length = outerRings.length;
710
+
711
+ let currentPolygon = 0;
712
+ while (currentPolygon < result.length) {
713
+ // Adapted from https://www.sciencedirect.com/science/article/abs/pii/B9780125434577500589#:~:text=If%20the%20plane%20intersects%20the,tree%20and%20polygon%20intersection%20libraries
714
+ const outerRing = result[currentPolygon];
715
+ const positions = outerRing.slice();
716
+
717
+ if (outerRing.length < 3) {
718
+ result[currentPolygon] = positions;
719
+ ++currentPolygon;
720
+ continue;
721
+ }
722
+
723
+ // Step 1: Get all edges which intersect the split line, splciing any found intersections points into the list of positions
724
+ const edgesOnPlane = computeEdgesOnPlane(positions, ellipsoid, arcType);
725
+ // If nothing intersected (no point were added), or there is only a single point on the plane, use the original polygon
726
+ if (positions.length === outerRing.length || edgesOnPlane.length <= 1) {
727
+ result[currentPolygon] = positions;
728
+ ++currentPolygon;
729
+ continue;
730
+ }
731
+
732
+ // Step 2: Sort the edges along the split line by the distance between their starting points and the starting point of the split line.
733
+ edgesOnPlane.sort((a, b) => {
734
+ return a.theta - b.theta;
735
+ });
736
+
737
+ // Step 3: Rewire polygons, splicing each polygon into the array of results
738
+ const north = positions[0].z >= 0.0;
739
+ currentPolygon = wirePolygon(
740
+ result,
741
+ currentPolygon,
742
+ positions,
743
+ edgesOnPlane,
744
+ 1,
745
+ 0,
746
+ north
747
+ );
748
+ }
749
+
750
+ return result;
751
+ };
752
+
469
753
  PolygonGeometryLibrary.polygonsFromHierarchy = function (
470
754
  polygonHierarchy,
471
755
  keepDuplicates,
472
756
  projectPointsTo2D,
473
757
  scaleToEllipsoidSurface,
474
- ellipsoid
758
+ ellipsoid,
759
+ splitPolygons
475
760
  ) {
476
761
  // create from a polygon hierarchy
477
762
  // Algorithm adapted from http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
@@ -481,6 +766,8 @@ PolygonGeometryLibrary.polygonsFromHierarchy = function (
481
766
  const queue = new Queue();
482
767
  queue.enqueue(polygonHierarchy);
483
768
 
769
+ let split = defined(splitPolygons);
770
+
484
771
  while (queue.length !== 0) {
485
772
  const outerNode = queue.dequeue();
486
773
  let outerRing = outerNode.positions;
@@ -520,6 +807,20 @@ PolygonGeometryLibrary.polygonsFromHierarchy = function (
520
807
  outerRing = outerRing.slice().reverse();
521
808
  }
522
809
 
810
+ if (split) {
811
+ split = false;
812
+ let polygons = [outerRing];
813
+ polygons = splitPolygons(polygons, polygons);
814
+
815
+ if (polygons.length > 1) {
816
+ for (const positions of polygons) {
817
+ queue.enqueue(new PolygonHierarchy(positions, holes));
818
+ }
819
+
820
+ continue;
821
+ }
822
+ }
823
+
523
824
  let positions = outerRing.slice();
524
825
  const numChildren = defined(holes) ? holes.length : 0;
525
826
  const polygonHoles = [];
@@ -0,0 +1,247 @@
1
+ import Cartesian2 from "./Cartesian2.js";
2
+ import Cartesian3 from "./Cartesian3.js";
3
+ import Cartographic from "./Cartographic.js";
4
+ import Check from "./Check.js";
5
+ import defined from "./defined.js";
6
+ import Ellipsoid from "./Ellipsoid.js";
7
+ import EllipsoidTangentPlane from "./EllipsoidTangentPlane.js";
8
+ import IntersectionTests from "./IntersectionTests.js";
9
+ import CesiumMath from "./Math.js";
10
+ import Ray from "./Ray.js";
11
+
12
+ /**
13
+ * Represents a point in stereographic coordinates, which can be obtained by projecting a cartesian coordinate from one pole onto a tangent plane at the other pole.
14
+ * The stereographic projection faithfully represents the relative directions of all great circles passing through its center point.
15
+ * To faithfully represents angles everywhere, this is a conformal projection, which means points are projected onto an arbrary sphere.
16
+ * @param {Cartesian2} [position] The steroegraphic coordinates.
17
+ * @param {EllipseGeometry} [tangentPlane] The tangent plane onto which the point was projected.
18
+ */
19
+ function Stereographic(position, tangentPlane) {
20
+ this.position = position;
21
+ if (!defined(this.position)) {
22
+ this.position = new Cartesian2();
23
+ }
24
+
25
+ this.tangentPlane = tangentPlane;
26
+ if (!defined(this.tangentPlane)) {
27
+ this.tangentPlane = Stereographic.NORTH_POLE_TANGENT_PLANE;
28
+ }
29
+ }
30
+
31
+ Object.defineProperties(Stereographic.prototype, {
32
+ /**
33
+ * Gets the ellipsoid.
34
+ * @memberof Stereographic.prototype
35
+ * @type {Ellipsoid}
36
+ */
37
+ ellipsoid: {
38
+ get: function () {
39
+ return this.tangentPlane.ellipsoid;
40
+ },
41
+ },
42
+
43
+ /**
44
+ * Gets the x coordinate
45
+ * @memberof Stereographic.prototype
46
+ * @type {number}
47
+ */
48
+ x: {
49
+ get: function () {
50
+ return this.position.x;
51
+ },
52
+ },
53
+
54
+ /**
55
+ * Gets the y coordinate
56
+ * @memberof Stereographic.prototype
57
+ * @type {number}
58
+ */
59
+ y: {
60
+ get: function () {
61
+ return this.position.y;
62
+ },
63
+ },
64
+
65
+ /**
66
+ * Computes the conformal latitude, or the ellipsoidal latitude projected onto an arbitrary sphere.
67
+ * @memberof Stereographic.prototype
68
+ * @type {number}
69
+ */
70
+ conformalLatitude: {
71
+ get: function () {
72
+ const r = Cartesian2.magnitude(this.position);
73
+ const d = 2 * this.ellipsoid.maximumRadius;
74
+ const sign = this.tangentPlane.plane.normal.z;
75
+ return sign * (CesiumMath.PI_OVER_TWO - 2 * Math.atan2(r, d));
76
+ },
77
+ },
78
+
79
+ /**
80
+ * Computes the longitude
81
+ * @memberof Stereographic.prototype
82
+ * @type {number}
83
+ */
84
+ longitude: {
85
+ get: function () {
86
+ let longitude = CesiumMath.PI_OVER_TWO + Math.atan2(this.y, this.x);
87
+ if (longitude > Math.PI) {
88
+ longitude -= CesiumMath.TWO_PI;
89
+ }
90
+
91
+ return longitude;
92
+ },
93
+ },
94
+ });
95
+
96
+ const scratchCartographic = new Cartographic();
97
+ const scratchCartesian = new Cartesian3();
98
+
99
+ /**
100
+ * Computes the latitude based on an ellipsoid.
101
+ *
102
+ * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which to compute the longitude.
103
+ * @returns {number} The latitude
104
+ */
105
+ Stereographic.prototype.getLatitude = function (ellipsoid) {
106
+ if (!defined(ellipsoid)) {
107
+ ellipsoid = Ellipsoid.WGS84;
108
+ }
109
+
110
+ scratchCartographic.latitude = this.conformalLatitude;
111
+ scratchCartographic.longitude = this.longitude;
112
+ scratchCartographic.height = 0.0;
113
+ const cartesian = this.ellipsoid.cartographicToCartesian(
114
+ scratchCartographic,
115
+ scratchCartesian
116
+ );
117
+ ellipsoid.cartesianToCartographic(cartesian, scratchCartographic);
118
+ return scratchCartographic.latitude;
119
+ };
120
+
121
+ const scratchProjectPointOntoPlaneRay = new Ray();
122
+ const scratchProjectPointOntoPlaneRayDirection = new Cartesian3();
123
+ const scratchProjectPointOntoPlaneCartesian3 = new Cartesian3();
124
+
125
+ /**
126
+ * Computes the projection of the provided 3D position onto the 2D polar plane, radially outward from the provided origin.
127
+ *
128
+ * @param {Cartesian3} cartesian The point to project.
129
+ * @param {Stereographic} [result] The object onto which to store the result.
130
+ * @returns {Sterographic} The modified result parameter or a new Sterographic instance if none was provided.
131
+ */
132
+ Stereographic.fromCartesian = function (cartesian, result) {
133
+ //>>includeStart('debug', pragmas.debug);
134
+ Check.defined("cartesian", cartesian);
135
+ //>>includeEnd('debug');
136
+
137
+ const sign = CesiumMath.signNotZero(cartesian.z);
138
+ let tangentPlane = Stereographic.NORTH_POLE_TANGENT_PLANE;
139
+ let origin = Stereographic.SOUTH_POLE;
140
+ if (sign < 0) {
141
+ tangentPlane = Stereographic.SOUTH_POLE_TANGENT_PLANE;
142
+ origin = Stereographic.NORTH_POLE;
143
+ }
144
+
145
+ const ray = scratchProjectPointOntoPlaneRay;
146
+ ray.origin = tangentPlane.ellipsoid.scaleToGeocentricSurface(
147
+ cartesian,
148
+ ray.origin
149
+ );
150
+ ray.direction = Cartesian3.subtract(
151
+ ray.origin,
152
+ origin,
153
+ scratchProjectPointOntoPlaneRayDirection
154
+ );
155
+ Cartesian3.normalize(ray.direction, ray.direction);
156
+
157
+ const intersectionPoint = IntersectionTests.rayPlane(
158
+ ray,
159
+ tangentPlane.plane,
160
+ scratchProjectPointOntoPlaneCartesian3
161
+ );
162
+ const v = Cartesian3.subtract(intersectionPoint, origin, intersectionPoint);
163
+ const x = Cartesian3.dot(tangentPlane.xAxis, v);
164
+ const y = sign * Cartesian3.dot(tangentPlane.yAxis, v);
165
+
166
+ if (!defined(result)) {
167
+ return new Stereographic(new Cartesian2(x, y), tangentPlane);
168
+ }
169
+
170
+ result.position = new Cartesian2(x, y);
171
+ result.tangentPlane = tangentPlane;
172
+ return result;
173
+ };
174
+
175
+ /**
176
+ * Computes the projection of the provided 3D positions onto the 2D polar plane, radially outward from the provided origin.
177
+ *
178
+ * @param {Cartesian3[]} cartesians The points to project.
179
+ * @param {Stereographic[]} [result] The object onto which to store the result.
180
+ * @returns {Sterographic[]} The modified result parameter or a new Sterographic instance if none was provided.
181
+ */
182
+ Stereographic.fromCartesianArray = function (cartesians, result) {
183
+ //>>includeStart('debug', pragmas.debug);
184
+ Check.defined("cartesians", cartesians);
185
+ //>>includeEnd('debug');
186
+
187
+ const length = cartesians.length;
188
+ if (!defined(result)) {
189
+ result = new Array(length);
190
+ } else {
191
+ result.length = length;
192
+ }
193
+ for (let i = 0; i < length; i++) {
194
+ result[i] = Stereographic.fromCartesian(cartesians[i], result[i]);
195
+ }
196
+ return result;
197
+ };
198
+
199
+ /**
200
+ * Duplicates a Stereographic instance.
201
+ *
202
+ * @param {Stereographic} stereographic The Stereographic to duplicate.
203
+ * @param {Stereographic} [result] The object onto which to store the result.
204
+ * @returns {Stereographic} The modified result parameter or a new Stereographic instance if one was not provided. (Returns undefined if stereographic is undefined)
205
+ */
206
+ Stereographic.clone = function (stereographic, result) {
207
+ if (!defined(stereographic)) {
208
+ return undefined;
209
+ }
210
+ if (!defined(result)) {
211
+ return new Stereographic(
212
+ stereographic.position,
213
+ stereographic.tangentPlane
214
+ );
215
+ }
216
+
217
+ result.position = stereographic.position;
218
+ result.tangentPlane = stereographic.tangentPlane;
219
+
220
+ return result;
221
+ };
222
+
223
+ /**
224
+ * An Ellipsoid instance initialized to radii of (0.5, 0.5, 0.5).
225
+ *
226
+ * @type {Stereographic}
227
+ * @constant
228
+ */
229
+ Stereographic.HALF_UNIT_SPHERE = Object.freeze(new Ellipsoid(0.5, 0.5, 0.5));
230
+
231
+ Stereographic.NORTH_POLE = Object.freeze(new Cartesian3(0.0, 0.0, 0.5));
232
+ Stereographic.SOUTH_POLE = Object.freeze(new Cartesian3(0.0, 0.0, -0.5));
233
+
234
+ Stereographic.NORTH_POLE_TANGENT_PLANE = Object.freeze(
235
+ new EllipsoidTangentPlane(
236
+ Stereographic.NORTH_POLE,
237
+ Stereographic.HALF_UNIT_SPHERE
238
+ )
239
+ );
240
+ Stereographic.SOUTH_POLE_TANGENT_PLANE = Object.freeze(
241
+ new EllipsoidTangentPlane(
242
+ Stereographic.SOUTH_POLE,
243
+ Stereographic.HALF_UNIT_SPHERE
244
+ )
245
+ );
246
+
247
+ export default Stereographic;