WallGeometryLibrary-007e9883.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. define(['exports', './arrayRemoveDuplicates-d2061e85', './Matrix3-41c58dde', './defaultValue-fe22d8c0', './Math-0a2ac845', './PolylinePipeline-896735cc'], (function (exports, arrayRemoveDuplicates, Matrix3, defaultValue, Math, PolylinePipeline) { 'use strict';
  2. /**
  3. * @private
  4. */
  5. const WallGeometryLibrary = {};
  6. function latLonEquals(c0, c1) {
  7. return (
  8. Math.CesiumMath.equalsEpsilon(c0.latitude, c1.latitude, Math.CesiumMath.EPSILON10) &&
  9. Math.CesiumMath.equalsEpsilon(c0.longitude, c1.longitude, Math.CesiumMath.EPSILON10)
  10. );
  11. }
  12. const scratchCartographic1 = new Matrix3.Cartographic();
  13. const scratchCartographic2 = new Matrix3.Cartographic();
  14. function removeDuplicates(ellipsoid, positions, topHeights, bottomHeights) {
  15. positions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Matrix3.Cartesian3.equalsEpsilon);
  16. const length = positions.length;
  17. if (length < 2) {
  18. return;
  19. }
  20. const hasBottomHeights = defaultValue.defined(bottomHeights);
  21. const hasTopHeights = defaultValue.defined(topHeights);
  22. const cleanedPositions = new Array(length);
  23. const cleanedTopHeights = new Array(length);
  24. const cleanedBottomHeights = new Array(length);
  25. const v0 = positions[0];
  26. cleanedPositions[0] = v0;
  27. const c0 = ellipsoid.cartesianToCartographic(v0, scratchCartographic1);
  28. if (hasTopHeights) {
  29. c0.height = topHeights[0];
  30. }
  31. cleanedTopHeights[0] = c0.height;
  32. if (hasBottomHeights) {
  33. cleanedBottomHeights[0] = bottomHeights[0];
  34. } else {
  35. cleanedBottomHeights[0] = 0.0;
  36. }
  37. const startTopHeight = cleanedTopHeights[0];
  38. const startBottomHeight = cleanedBottomHeights[0];
  39. let hasAllSameHeights = startTopHeight === startBottomHeight;
  40. let index = 1;
  41. for (let i = 1; i < length; ++i) {
  42. const v1 = positions[i];
  43. const c1 = ellipsoid.cartesianToCartographic(v1, scratchCartographic2);
  44. if (hasTopHeights) {
  45. c1.height = topHeights[i];
  46. }
  47. hasAllSameHeights = hasAllSameHeights && c1.height === 0;
  48. if (!latLonEquals(c0, c1)) {
  49. cleanedPositions[index] = v1; // Shallow copy!
  50. cleanedTopHeights[index] = c1.height;
  51. if (hasBottomHeights) {
  52. cleanedBottomHeights[index] = bottomHeights[i];
  53. } else {
  54. cleanedBottomHeights[index] = 0.0;
  55. }
  56. hasAllSameHeights =
  57. hasAllSameHeights &&
  58. cleanedTopHeights[index] === cleanedBottomHeights[index];
  59. Matrix3.Cartographic.clone(c1, c0);
  60. ++index;
  61. } else if (c0.height < c1.height) {
  62. // two adjacent positions are the same, so use whichever has the greater height
  63. cleanedTopHeights[index - 1] = c1.height;
  64. }
  65. }
  66. if (hasAllSameHeights || index < 2) {
  67. return;
  68. }
  69. cleanedPositions.length = index;
  70. cleanedTopHeights.length = index;
  71. cleanedBottomHeights.length = index;
  72. return {
  73. positions: cleanedPositions,
  74. topHeights: cleanedTopHeights,
  75. bottomHeights: cleanedBottomHeights,
  76. };
  77. }
  78. const positionsArrayScratch = new Array(2);
  79. const heightsArrayScratch = new Array(2);
  80. const generateArcOptionsScratch = {
  81. positions: undefined,
  82. height: undefined,
  83. granularity: undefined,
  84. ellipsoid: undefined,
  85. };
  86. /**
  87. * @private
  88. */
  89. WallGeometryLibrary.computePositions = function (
  90. ellipsoid,
  91. wallPositions,
  92. maximumHeights,
  93. minimumHeights,
  94. granularity,
  95. duplicateCorners
  96. ) {
  97. const o = removeDuplicates(
  98. ellipsoid,
  99. wallPositions,
  100. maximumHeights,
  101. minimumHeights
  102. );
  103. if (!defaultValue.defined(o)) {
  104. return;
  105. }
  106. wallPositions = o.positions;
  107. maximumHeights = o.topHeights;
  108. minimumHeights = o.bottomHeights;
  109. const length = wallPositions.length;
  110. const numCorners = length - 2;
  111. let topPositions;
  112. let bottomPositions;
  113. const minDistance = Math.CesiumMath.chordLength(
  114. granularity,
  115. ellipsoid.maximumRadius
  116. );
  117. const generateArcOptions = generateArcOptionsScratch;
  118. generateArcOptions.minDistance = minDistance;
  119. generateArcOptions.ellipsoid = ellipsoid;
  120. if (duplicateCorners) {
  121. let count = 0;
  122. let i;
  123. for (i = 0; i < length - 1; i++) {
  124. count +=
  125. PolylinePipeline.PolylinePipeline.numberOfPoints(
  126. wallPositions[i],
  127. wallPositions[i + 1],
  128. minDistance
  129. ) + 1;
  130. }
  131. topPositions = new Float64Array(count * 3);
  132. bottomPositions = new Float64Array(count * 3);
  133. const generateArcPositions = positionsArrayScratch;
  134. const generateArcHeights = heightsArrayScratch;
  135. generateArcOptions.positions = generateArcPositions;
  136. generateArcOptions.height = generateArcHeights;
  137. let offset = 0;
  138. for (i = 0; i < length - 1; i++) {
  139. generateArcPositions[0] = wallPositions[i];
  140. generateArcPositions[1] = wallPositions[i + 1];
  141. generateArcHeights[0] = maximumHeights[i];
  142. generateArcHeights[1] = maximumHeights[i + 1];
  143. const pos = PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions);
  144. topPositions.set(pos, offset);
  145. generateArcHeights[0] = minimumHeights[i];
  146. generateArcHeights[1] = minimumHeights[i + 1];
  147. bottomPositions.set(
  148. PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions),
  149. offset
  150. );
  151. offset += pos.length;
  152. }
  153. } else {
  154. generateArcOptions.positions = wallPositions;
  155. generateArcOptions.height = maximumHeights;
  156. topPositions = new Float64Array(
  157. PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions)
  158. );
  159. generateArcOptions.height = minimumHeights;
  160. bottomPositions = new Float64Array(
  161. PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions)
  162. );
  163. }
  164. return {
  165. bottomPositions: bottomPositions,
  166. topPositions: topPositions,
  167. numCorners: numCorners,
  168. };
  169. };
  170. var WallGeometryLibrary$1 = WallGeometryLibrary;
  171. exports.WallGeometryLibrary = WallGeometryLibrary$1;
  172. }));