PolylineVolumeGeometryLibrary-57289189.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /* This file is automatically rebuilt by the Cesium build process. */
  2. define(['exports', './freezeObject-2d83f591', './Math-fa6e45cb', './Cartesian2-2a723276', './Transforms-65aba0a4', './EllipsoidTangentPlane-10c6053a', './PolylinePipeline-b4161aaf'], function (exports, freezeObject, _Math, Cartesian2, Transforms, EllipsoidTangentPlane, PolylinePipeline) { 'use strict';
  3. /**
  4. * Style options for corners.
  5. *
  6. * @demo The {@link https://sandcastle.cesium.com/index.html?src=Corridor.html&label=Geometries|Corridor Demo}
  7. * demonstrates the three corner types, as used by {@link CorridorGraphics}.
  8. *
  9. * @exports CornerType
  10. */
  11. var CornerType = {
  12. /**
  13. * <img src="Images/CornerTypeRounded.png" style="vertical-align: middle;" width="186" height="189" />
  14. *
  15. * Corner has a smooth edge.
  16. * @type {Number}
  17. * @constant
  18. */
  19. ROUNDED : 0,
  20. /**
  21. * <img src="Images/CornerTypeMitered.png" style="vertical-align: middle;" width="186" height="189" />
  22. *
  23. * Corner point is the intersection of adjacent edges.
  24. * @type {Number}
  25. * @constant
  26. */
  27. MITERED : 1,
  28. /**
  29. * <img src="Images/CornerTypeBeveled.png" style="vertical-align: middle;" width="186" height="189" />
  30. *
  31. * Corner is clipped.
  32. * @type {Number}
  33. * @constant
  34. */
  35. BEVELED : 2
  36. };
  37. var CornerType$1 = freezeObject.freezeObject(CornerType);
  38. var scratch2Array = [new Cartesian2.Cartesian3(), new Cartesian2.Cartesian3()];
  39. var scratchCartesian1 = new Cartesian2.Cartesian3();
  40. var scratchCartesian2 = new Cartesian2.Cartesian3();
  41. var scratchCartesian3 = new Cartesian2.Cartesian3();
  42. var scratchCartesian4 = new Cartesian2.Cartesian3();
  43. var scratchCartesian5 = new Cartesian2.Cartesian3();
  44. var scratchCartesian6 = new Cartesian2.Cartesian3();
  45. var scratchCartesian7 = new Cartesian2.Cartesian3();
  46. var scratchCartesian8 = new Cartesian2.Cartesian3();
  47. var scratchCartesian9 = new Cartesian2.Cartesian3();
  48. var scratch1 = new Cartesian2.Cartesian3();
  49. var scratch2 = new Cartesian2.Cartesian3();
  50. /**
  51. * @private
  52. */
  53. var PolylineVolumeGeometryLibrary = {};
  54. var cartographic = new Cartesian2.Cartographic();
  55. function scaleToSurface(positions, ellipsoid) {
  56. var heights = new Array(positions.length);
  57. for (var i = 0; i < positions.length; i++) {
  58. var pos = positions[i];
  59. cartographic = ellipsoid.cartesianToCartographic(pos, cartographic);
  60. heights[i] = cartographic.height;
  61. positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos);
  62. }
  63. return heights;
  64. }
  65. function subdivideHeights(points, h0, h1, granularity) {
  66. var p0 = points[0];
  67. var p1 = points[1];
  68. var angleBetween = Cartesian2.Cartesian3.angleBetween(p0, p1);
  69. var numPoints = Math.ceil(angleBetween / granularity);
  70. var heights = new Array(numPoints);
  71. var i;
  72. if (h0 === h1) {
  73. for (i = 0; i < numPoints; i++) {
  74. heights[i] = h0;
  75. }
  76. heights.push(h1);
  77. return heights;
  78. }
  79. var dHeight = h1 - h0;
  80. var heightPerVertex = dHeight / (numPoints);
  81. for (i = 1; i < numPoints; i++) {
  82. var h = h0 + i * heightPerVertex;
  83. heights[i] = h;
  84. }
  85. heights[0] = h0;
  86. heights.push(h1);
  87. return heights;
  88. }
  89. var nextScratch = new Cartesian2.Cartesian3();
  90. var prevScratch = new Cartesian2.Cartesian3();
  91. function computeRotationAngle(start, end, position, ellipsoid) {
  92. var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  93. var next = tangentPlane.projectPointOntoPlane(Cartesian2.Cartesian3.add(position, start, nextScratch), nextScratch);
  94. var prev = tangentPlane.projectPointOntoPlane(Cartesian2.Cartesian3.add(position, end, prevScratch), prevScratch);
  95. var angle = Cartesian2.Cartesian2.angleBetween(next, prev);
  96. return (prev.x * next.y - prev.y * next.x >= 0.0) ? -angle : angle;
  97. }
  98. var negativeX = new Cartesian2.Cartesian3(-1, 0, 0);
  99. var transform = new Transforms.Matrix4();
  100. var translation = new Transforms.Matrix4();
  101. var rotationZ = new Transforms.Matrix3();
  102. var scaleMatrix = Transforms.Matrix3.IDENTITY.clone();
  103. var westScratch = new Cartesian2.Cartesian3();
  104. var finalPosScratch = new Transforms.Cartesian4();
  105. var heightCartesian = new Cartesian2.Cartesian3();
  106. function addPosition(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat) {
  107. var west = westScratch;
  108. var finalPosition = finalPosScratch;
  109. transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
  110. west = Transforms.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
  111. west = Cartesian2.Cartesian3.normalize(west, west);
  112. var angle = computeRotationAngle(west, left, center, ellipsoid);
  113. rotationZ = Transforms.Matrix3.fromRotationZ(angle, rotationZ);
  114. heightCartesian.z = height;
  115. transform = Transforms.Matrix4.multiplyTransformation(transform, Transforms.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
  116. var scale = scaleMatrix;
  117. scale[0] = xScalar;
  118. for (var j = 0; j < repeat; j++) {
  119. for (var i = 0; i < shape.length; i += 3) {
  120. finalPosition = Cartesian2.Cartesian3.fromArray(shape, i, finalPosition);
  121. finalPosition = Transforms.Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
  122. finalPosition = Transforms.Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
  123. finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
  124. }
  125. }
  126. return finalPositions;
  127. }
  128. var centerScratch = new Cartesian2.Cartesian3();
  129. function addPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar) {
  130. for (var i = 0; i < centers.length; i += 3) {
  131. var center = Cartesian2.Cartesian3.fromArray(centers, i, centerScratch);
  132. finalPositions = addPosition(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1);
  133. }
  134. return finalPositions;
  135. }
  136. function convertShapeTo3DDuplicate(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
  137. var length = shape2D.length;
  138. var shape = new Array(length * 6);
  139. var index = 0;
  140. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  141. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  142. var point = shape2D[0];
  143. shape[index++] = point.x - xOffset;
  144. shape[index++] = 0.0;
  145. shape[index++] = point.y - yOffset;
  146. for (var i = 1; i < length; i++) {
  147. point = shape2D[i];
  148. var x = point.x - xOffset;
  149. var z = point.y - yOffset;
  150. shape[index++] = x;
  151. shape[index++] = 0.0;
  152. shape[index++] = z;
  153. shape[index++] = x;
  154. shape[index++] = 0.0;
  155. shape[index++] = z;
  156. }
  157. point = shape2D[0];
  158. shape[index++] = point.x - xOffset;
  159. shape[index++] = 0.0;
  160. shape[index++] = point.y - yOffset;
  161. return shape;
  162. }
  163. function convertShapeTo3D(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0)
  164. var length = shape2D.length;
  165. var shape = new Array(length * 3);
  166. var index = 0;
  167. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  168. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  169. for (var i = 0; i < length; i++) {
  170. shape[index++] = shape2D[i].x - xOffset;
  171. shape[index++] = 0;
  172. shape[index++] = shape2D[i].y - yOffset;
  173. }
  174. return shape;
  175. }
  176. var quaterion = new Transforms.Quaternion();
  177. var startPointScratch = new Cartesian2.Cartesian3();
  178. var rotMatrix = new Transforms.Matrix3();
  179. function computeRoundCorner(pivot, startPoint, endPoint, cornerType, leftIsOutside, ellipsoid, finalPositions, shape, height, duplicatePoints) {
  180. var angle = Cartesian2.Cartesian3.angleBetween(Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1), Cartesian2.Cartesian3.subtract(endPoint, pivot, scratch2));
  181. var granularity = (cornerType === CornerType$1.BEVELED) ? 0 : Math.ceil(angle / _Math.CesiumMath.toRadians(5));
  182. var m;
  183. if (leftIsOutside) {
  184. m = Transforms.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(Cartesian2.Cartesian3.negate(pivot, scratch1), angle / (granularity + 1), quaterion), rotMatrix);
  185. } else {
  186. m = Transforms.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion), rotMatrix);
  187. }
  188. var left;
  189. var surfacePoint;
  190. startPoint = Cartesian2.Cartesian3.clone(startPoint, startPointScratch);
  191. if (granularity > 0) {
  192. var repeat = duplicatePoints ? 2 : 1;
  193. for (var i = 0; i < granularity; i++) {
  194. startPoint = Transforms.Matrix3.multiplyByVector(m, startPoint, startPoint);
  195. left = Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1);
  196. left = Cartesian2.Cartesian3.normalize(left, left);
  197. if (!leftIsOutside) {
  198. left = Cartesian2.Cartesian3.negate(left, left);
  199. }
  200. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  201. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, repeat);
  202. }
  203. } else {
  204. left = Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1);
  205. left = Cartesian2.Cartesian3.normalize(left, left);
  206. if (!leftIsOutside) {
  207. left = Cartesian2.Cartesian3.negate(left, left);
  208. }
  209. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  210. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
  211. endPoint = Cartesian2.Cartesian3.clone(endPoint, startPointScratch);
  212. left = Cartesian2.Cartesian3.subtract(endPoint, pivot, scratch1);
  213. left = Cartesian2.Cartesian3.normalize(left, left);
  214. if (!leftIsOutside) {
  215. left = Cartesian2.Cartesian3.negate(left, left);
  216. }
  217. surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
  218. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
  219. }
  220. return finalPositions;
  221. }
  222. PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(shapePositions) {
  223. var length = shapePositions.length;
  224. var cleanedPositions = [];
  225. for (var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
  226. var v0 = shapePositions[i0];
  227. var v1 = shapePositions[i1];
  228. if (!Cartesian2.Cartesian2.equals(v0, v1)) {
  229. cleanedPositions.push(v1); // Shallow copy!
  230. }
  231. }
  232. return cleanedPositions;
  233. };
  234. PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(forward, backward, position, ellipsoid) {
  235. var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  236. var next = tangentPlane.projectPointOntoPlane(Cartesian2.Cartesian3.add(position, forward, nextScratch), nextScratch);
  237. var prev = tangentPlane.projectPointOntoPlane(Cartesian2.Cartesian3.add(position, backward, prevScratch), prevScratch);
  238. return ((prev.x * next.y) - (prev.y * next.x)) >= 0.0;
  239. };
  240. var scratchForwardProjection = new Cartesian2.Cartesian3();
  241. var scratchBackwardProjection = new Cartesian2.Cartesian3();
  242. PolylineVolumeGeometryLibrary.computePositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints) {
  243. var ellipsoid = geometry._ellipsoid;
  244. var heights = scaleToSurface(positions, ellipsoid);
  245. var granularity = geometry._granularity;
  246. var cornerType = geometry._cornerType;
  247. var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
  248. var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
  249. var heightOffset = boundingRectangle.height / 2;
  250. var width = boundingRectangle.width / 2;
  251. var length = positions.length;
  252. var finalPositions = [];
  253. var ends = duplicatePoints ? [] : undefined;
  254. var forward = scratchCartesian1;
  255. var backward = scratchCartesian2;
  256. var cornerDirection = scratchCartesian3;
  257. var surfaceNormal = scratchCartesian4;
  258. var pivot = scratchCartesian5;
  259. var start = scratchCartesian6;
  260. var end = scratchCartesian7;
  261. var left = scratchCartesian8;
  262. var previousPosition = scratchCartesian9;
  263. var position = positions[0];
  264. var nextPosition = positions[1];
  265. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  266. forward = Cartesian2.Cartesian3.subtract(nextPosition, position, forward);
  267. forward = Cartesian2.Cartesian3.normalize(forward, forward);
  268. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  269. left = Cartesian2.Cartesian3.normalize(left, left);
  270. var h0 = heights[0];
  271. var h1 = heights[1];
  272. if (duplicatePoints) {
  273. ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1);
  274. }
  275. previousPosition = Cartesian2.Cartesian3.clone(position, previousPosition);
  276. position = nextPosition;
  277. backward = Cartesian2.Cartesian3.negate(forward, backward);
  278. var subdividedHeights;
  279. var subdividedPositions;
  280. for (var i = 1; i < length - 1; i++) {
  281. var repeat = duplicatePoints ? 2 : 1;
  282. nextPosition = positions[i + 1];
  283. forward = Cartesian2.Cartesian3.subtract(nextPosition, position, forward);
  284. forward = Cartesian2.Cartesian3.normalize(forward, forward);
  285. cornerDirection = Cartesian2.Cartesian3.add(forward, backward, cornerDirection);
  286. cornerDirection = Cartesian2.Cartesian3.normalize(cornerDirection, cornerDirection);
  287. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  288. var forwardProjection = Cartesian2.Cartesian3.multiplyByScalar(surfaceNormal, Cartesian2.Cartesian3.dot(forward, surfaceNormal), scratchForwardProjection);
  289. Cartesian2.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  290. Cartesian2.Cartesian3.normalize(forwardProjection, forwardProjection);
  291. var backwardProjection = Cartesian2.Cartesian3.multiplyByScalar(surfaceNormal, Cartesian2.Cartesian3.dot(backward, surfaceNormal), scratchBackwardProjection);
  292. Cartesian2.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  293. Cartesian2.Cartesian3.normalize(backwardProjection, backwardProjection);
  294. var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartesian2.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
  295. if (doCorner) {
  296. cornerDirection = Cartesian2.Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
  297. cornerDirection = Cartesian2.Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
  298. cornerDirection = Cartesian2.Cartesian3.normalize(cornerDirection, cornerDirection);
  299. var scalar = 1 / Math.max(0.25, (Cartesian2.Cartesian3.magnitude(Cartesian2.Cartesian3.cross(cornerDirection, backward, scratch1))));
  300. var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
  301. if (leftIsOutside) {
  302. pivot = Cartesian2.Cartesian3.add(position, Cartesian2.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  303. start = Cartesian2.Cartesian3.add(pivot, Cartesian2.Cartesian3.multiplyByScalar(left, width, start), start);
  304. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  305. scratch2Array[1] = Cartesian2.Cartesian3.clone(start, scratch2Array[1]);
  306. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  307. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  308. positions: scratch2Array,
  309. granularity: granularity,
  310. ellipsoid: ellipsoid
  311. });
  312. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  313. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  314. left = Cartesian2.Cartesian3.normalize(left, left);
  315. end = Cartesian2.Cartesian3.add(pivot, Cartesian2.Cartesian3.multiplyByScalar(left, width, end), end);
  316. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  317. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  318. } else {
  319. cornerDirection = Cartesian2.Cartesian3.negate(cornerDirection, cornerDirection);
  320. finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
  321. }
  322. previousPosition = Cartesian2.Cartesian3.clone(end, previousPosition);
  323. } else {
  324. pivot = Cartesian2.Cartesian3.add(position, Cartesian2.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  325. start = Cartesian2.Cartesian3.add(pivot, Cartesian2.Cartesian3.multiplyByScalar(left, -width, start), start);
  326. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  327. scratch2Array[1] = Cartesian2.Cartesian3.clone(start, scratch2Array[1]);
  328. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  329. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  330. positions: scratch2Array,
  331. granularity: granularity,
  332. ellipsoid: ellipsoid
  333. });
  334. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  335. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  336. left = Cartesian2.Cartesian3.normalize(left, left);
  337. end = Cartesian2.Cartesian3.add(pivot, Cartesian2.Cartesian3.multiplyByScalar(left, -width, end), end);
  338. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  339. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  340. } else {
  341. finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
  342. }
  343. previousPosition = Cartesian2.Cartesian3.clone(end, previousPosition);
  344. }
  345. backward = Cartesian2.Cartesian3.negate(forward, backward);
  346. } else {
  347. finalPositions = addPosition(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1);
  348. previousPosition = position;
  349. }
  350. h0 = h1;
  351. h1 = heights[i + 1];
  352. position = nextPosition;
  353. }
  354. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  355. scratch2Array[1] = Cartesian2.Cartesian3.clone(position, scratch2Array[1]);
  356. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  357. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  358. positions: scratch2Array,
  359. granularity: granularity,
  360. ellipsoid: ellipsoid
  361. });
  362. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  363. if (duplicatePoints) {
  364. ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1);
  365. }
  366. length = finalPositions.length;
  367. var posLength = duplicatePoints ? length + ends.length : length;
  368. var combinedPositions = new Float64Array(posLength);
  369. combinedPositions.set(finalPositions);
  370. if (duplicatePoints) {
  371. combinedPositions.set(ends, length);
  372. }
  373. return combinedPositions;
  374. };
  375. exports.CornerType = CornerType$1;
  376. exports.PolylineVolumeGeometryLibrary = PolylineVolumeGeometryLibrary;
  377. });