PolylineVolumeGeometryLibrary-934b338a.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. /**
  2. * Cesium - https://github.com/AnalyticalGraphicsInc/cesium
  3. *
  4. * Copyright 2011-2017 Cesium Contributors
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * Columbus View (Pat. Pend.)
  19. *
  20. * Portions licensed separately.
  21. * See https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md for full licensing details.
  22. */
  23. define(['exports', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './Transforms-b2e71640', './EllipsoidTangentPlane-a815c96f', './PolylinePipeline-a9f32196'], function (exports, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, Transforms, EllipsoidTangentPlane, PolylinePipeline) { 'use strict';
  24. /**
  25. * Style options for corners.
  26. *
  27. * @demo The {@link https://sandcastle.cesium.com/index.html?src=Corridor.html&label=Geometries|Corridor Demo}
  28. * demonstrates the three corner types, as used by {@link CorridorGraphics}.
  29. *
  30. * @exports CornerType
  31. */
  32. var CornerType = {
  33. /**
  34. * <img src="Images/CornerTypeRounded.png" style="vertical-align: middle;" width="186" height="189" />
  35. *
  36. * Corner has a smooth edge.
  37. * @type {Number}
  38. * @constant
  39. */
  40. ROUNDED : 0,
  41. /**
  42. * <img src="Images/CornerTypeMitered.png" style="vertical-align: middle;" width="186" height="189" />
  43. *
  44. * Corner point is the intersection of adjacent edges.
  45. * @type {Number}
  46. * @constant
  47. */
  48. MITERED : 1,
  49. /**
  50. * <img src="Images/CornerTypeBeveled.png" style="vertical-align: middle;" width="186" height="189" />
  51. *
  52. * Corner is clipped.
  53. * @type {Number}
  54. * @constant
  55. */
  56. BEVELED : 2
  57. };
  58. var CornerType$1 = Object.freeze(CornerType);
  59. var scratch2Array = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
  60. var scratchCartesian1 = new Cartographic.Cartesian3();
  61. var scratchCartesian2 = new Cartographic.Cartesian3();
  62. var scratchCartesian3 = new Cartographic.Cartesian3();
  63. var scratchCartesian4 = new Cartographic.Cartesian3();
  64. var scratchCartesian5 = new Cartographic.Cartesian3();
  65. var scratchCartesian6 = new Cartographic.Cartesian3();
  66. var scratchCartesian7 = new Cartographic.Cartesian3();
  67. var scratchCartesian8 = new Cartographic.Cartesian3();
  68. var scratchCartesian9 = new Cartographic.Cartesian3();
  69. var scratch1 = new Cartographic.Cartesian3();
  70. var scratch2 = new Cartographic.Cartesian3();
  71. /**
  72. * @private
  73. */
  74. var PolylineVolumeGeometryLibrary = {};
  75. var cartographic = new Cartographic.Cartographic();
  76. function scaleToSurface(positions, ellipsoid) {
  77. var heights = new Array(positions.length);
  78. for (var i = 0; i < positions.length; i++) {
  79. var pos = positions[i];
  80. cartographic = ellipsoid.cartesianToCartographic(pos, cartographic);
  81. heights[i] = cartographic.height;
  82. positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos);
  83. }
  84. return heights;
  85. }
  86. function subdivideHeights(points, h0, h1, granularity) {
  87. var p0 = points[0];
  88. var p1 = points[1];
  89. var angleBetween = Cartographic.Cartesian3.angleBetween(p0, p1);
  90. var numPoints = Math.ceil(angleBetween / granularity);
  91. var heights = new Array(numPoints);
  92. var i;
  93. if (h0 === h1) {
  94. for (i = 0; i < numPoints; i++) {
  95. heights[i] = h0;
  96. }
  97. heights.push(h1);
  98. return heights;
  99. }
  100. var dHeight = h1 - h0;
  101. var heightPerVertex = dHeight / (numPoints);
  102. for (i = 1; i < numPoints; i++) {
  103. var h = h0 + i * heightPerVertex;
  104. heights[i] = h;
  105. }
  106. heights[0] = h0;
  107. heights.push(h1);
  108. return heights;
  109. }
  110. var nextScratch = new Cartographic.Cartesian3();
  111. var prevScratch = new Cartographic.Cartesian3();
  112. function computeRotationAngle(start, end, position, ellipsoid) {
  113. var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  114. var next = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, start, nextScratch), nextScratch);
  115. var prev = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, end, prevScratch), prevScratch);
  116. var angle = Cartesian2.Cartesian2.angleBetween(next, prev);
  117. return (prev.x * next.y - prev.y * next.x >= 0.0) ? -angle : angle;
  118. }
  119. var negativeX = new Cartographic.Cartesian3(-1, 0, 0);
  120. var transform = BoundingSphere.Matrix4.clone(BoundingSphere.Matrix4.IDENTITY);
  121. var translation = new BoundingSphere.Matrix4();
  122. var rotationZ = new BoundingSphere.Matrix3();
  123. var scaleMatrix = BoundingSphere.Matrix3.IDENTITY.clone();
  124. var westScratch = new Cartographic.Cartesian3();
  125. var finalPosScratch = new Cartesian4.Cartesian4();
  126. var heightCartesian = new Cartographic.Cartesian3();
  127. function addPosition(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat) {
  128. var west = westScratch;
  129. var finalPosition = finalPosScratch;
  130. transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
  131. west = BoundingSphere.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
  132. west = Cartographic.Cartesian3.normalize(west, west);
  133. var angle = computeRotationAngle(west, left, center, ellipsoid);
  134. rotationZ = BoundingSphere.Matrix3.fromRotationZ(angle, rotationZ);
  135. heightCartesian.z = height;
  136. transform = BoundingSphere.Matrix4.multiplyTransformation(transform, BoundingSphere.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
  137. var scale = scaleMatrix;
  138. scale[0] = xScalar;
  139. for (var j = 0; j < repeat; j++) {
  140. for (var i = 0; i < shape.length; i += 3) {
  141. finalPosition = Cartographic.Cartesian3.fromArray(shape, i, finalPosition);
  142. finalPosition = BoundingSphere.Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
  143. finalPosition = BoundingSphere.Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
  144. finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
  145. }
  146. }
  147. return finalPositions;
  148. }
  149. function addPositionLocal(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat, enuInverse) {
  150. var west = westScratch;
  151. var finalPosition = finalPosScratch;
  152. transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
  153. west = BoundingSphere.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
  154. west = Cartographic.Cartesian3.normalize(west, west);
  155. var angle = computeRotationAngle(west, left, center, ellipsoid);
  156. rotationZ = BoundingSphere.Matrix3.fromRotationZ(angle, rotationZ);
  157. heightCartesian.z = height;
  158. transform = BoundingSphere.Matrix4.multiplyTransformation(transform, BoundingSphere.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
  159. var scale = scaleMatrix;
  160. scale[0] = xScalar;
  161. for (var j = 0; j < repeat; j++) {
  162. for (var i = 0; i < shape.length; i += 3) {
  163. finalPosition = Cartographic.Cartesian3.fromArray(shape, i, finalPosition);
  164. finalPosition = BoundingSphere.Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
  165. finalPosition = BoundingSphere.Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
  166. finalPosition = BoundingSphere.Matrix4.multiplyByPoint(enuInverse, finalPosition, finalPosition);
  167. finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
  168. }
  169. }
  170. return finalPositions;
  171. }
  172. var centerScratch = new Cartographic.Cartesian3();
  173. function addPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar) {
  174. for (var i = 0; i < centers.length; i += 3) {
  175. var center = Cartographic.Cartesian3.fromArray(centers, i, centerScratch);
  176. finalPositions = addPosition(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1);
  177. }
  178. return finalPositions;
  179. }
  180. function addLocalPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar, enuInverse) {
  181. for (var i = 0; i < centers.length; i += 3) {
  182. var center = Cartographic.Cartesian3.fromArray(centers, i, centerScratch);
  183. finalPositions = addPositionLocal(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1, enuInverse);
  184. }
  185. return finalPositions;
  186. }
  187. function convertShapeTo3DDuplicate(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
  188. var length = shape2D.length;
  189. var shape = new Array(length * 6);
  190. var index = 0;
  191. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  192. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  193. var point = shape2D[0];
  194. shape[index++] = point.x - xOffset;
  195. shape[index++] = 0.0;
  196. shape[index++] = point.y - yOffset;
  197. for (var i = 1; i < length; i++) {
  198. point = shape2D[i];
  199. var x = point.x - xOffset;
  200. var z = point.y - yOffset;
  201. shape[index++] = x;
  202. shape[index++] = 0.0;
  203. shape[index++] = z;
  204. shape[index++] = x;
  205. shape[index++] = 0.0;
  206. shape[index++] = z;
  207. }
  208. point = shape2D[0];
  209. shape[index++] = point.x - xOffset;
  210. shape[index++] = 0.0;
  211. shape[index++] = point.y - yOffset;
  212. return shape;
  213. }
  214. function convertShapeTo3D(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0)
  215. var length = shape2D.length;
  216. var shape = new Array(length * 3);
  217. var index = 0;
  218. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  219. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  220. for (var i = 0; i < length; i++) {
  221. shape[index++] = shape2D[i].x - xOffset;
  222. shape[index++] = 0;
  223. shape[index++] = shape2D[i].y - yOffset;
  224. }
  225. return shape;
  226. }
  227. var quaterion = new Transforms.Quaternion();
  228. var startPointScratch = new Cartographic.Cartesian3();
  229. var rotMatrix = new BoundingSphere.Matrix3();
  230. function computeRoundCorner(pivot, startPoint, endPoint, cornerType, leftIsOutside, ellipsoid, finalPositions, shape, height, duplicatePoints) {
  231. var angle = Cartographic.Cartesian3.angleBetween(Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1), Cartographic.Cartesian3.subtract(endPoint, pivot, scratch2));
  232. var granularity = (cornerType === CornerType$1.BEVELED) ? 0 : Math.ceil(angle / _Math.CesiumMath.toRadians(5));
  233. var m;
  234. if (leftIsOutside) {
  235. m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(Cartographic.Cartesian3.negate(pivot, scratch1), angle / (granularity + 1), quaterion), rotMatrix);
  236. } else {
  237. m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion), rotMatrix);
  238. }
  239. var left;
  240. var surfacePoint;
  241. startPoint = Cartographic.Cartesian3.clone(startPoint, startPointScratch);
  242. if (granularity > 0) {
  243. var repeat = duplicatePoints ? 2 : 1;
  244. for (var i = 0; i < granularity; i++) {
  245. startPoint = BoundingSphere.Matrix3.multiplyByVector(m, startPoint, startPoint);
  246. left = Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1);
  247. left = Cartographic.Cartesian3.normalize(left, left);
  248. if (!leftIsOutside) {
  249. left = Cartographic.Cartesian3.negate(left, left);
  250. }
  251. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  252. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, repeat);
  253. }
  254. } else {
  255. left = Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1);
  256. left = Cartographic.Cartesian3.normalize(left, left);
  257. if (!leftIsOutside) {
  258. left = Cartographic.Cartesian3.negate(left, left);
  259. }
  260. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  261. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
  262. endPoint = Cartographic.Cartesian3.clone(endPoint, startPointScratch);
  263. left = Cartographic.Cartesian3.subtract(endPoint, pivot, scratch1);
  264. left = Cartographic.Cartesian3.normalize(left, left);
  265. if (!leftIsOutside) {
  266. left = Cartographic.Cartesian3.negate(left, left);
  267. }
  268. surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
  269. finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
  270. }
  271. return finalPositions;
  272. }
  273. PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(shapePositions) {
  274. var length = shapePositions.length;
  275. var cleanedPositions = [];
  276. for (var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
  277. var v0 = shapePositions[i0];
  278. var v1 = shapePositions[i1];
  279. if (!Cartesian2.Cartesian2.equals(v0, v1)) {
  280. cleanedPositions.push(v1); // Shallow copy!
  281. }
  282. }
  283. return cleanedPositions;
  284. };
  285. PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(forward, backward, position, ellipsoid) {
  286. var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  287. var next = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, forward, nextScratch), nextScratch);
  288. var prev = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, backward, prevScratch), prevScratch);
  289. return ((prev.x * next.y) - (prev.y * next.x)) >= 0.0;
  290. };
  291. var scratchForwardProjection = new Cartographic.Cartesian3();
  292. var scratchBackwardProjection = new Cartographic.Cartesian3();
  293. PolylineVolumeGeometryLibrary.computePositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints) {
  294. var ellipsoid = geometry._ellipsoid;
  295. var heights = scaleToSurface(positions, ellipsoid);
  296. var granularity = geometry._granularity;
  297. var cornerType = geometry._cornerType;
  298. var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
  299. var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
  300. var heightOffset = boundingRectangle.height / 2;
  301. var width = boundingRectangle.width / 2;
  302. var length = positions.length;
  303. var finalPositions = [];
  304. var ends = duplicatePoints ? [] : undefined;
  305. var forward = scratchCartesian1;
  306. var backward = scratchCartesian2;
  307. var cornerDirection = scratchCartesian3;
  308. var surfaceNormal = scratchCartesian4;
  309. var pivot = scratchCartesian5;
  310. var start = scratchCartesian6;
  311. var end = scratchCartesian7;
  312. var left = scratchCartesian8;
  313. var previousPosition = scratchCartesian9;
  314. var position = positions[0];
  315. var nextPosition = positions[1];
  316. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  317. forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
  318. forward = Cartographic.Cartesian3.normalize(forward, forward);
  319. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  320. left = Cartographic.Cartesian3.normalize(left, left);
  321. var h0 = heights[0];
  322. var h1 = heights[1];
  323. if (duplicatePoints) {
  324. ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1);
  325. }
  326. previousPosition = Cartographic.Cartesian3.clone(position, previousPosition);
  327. position = nextPosition;
  328. backward = Cartographic.Cartesian3.negate(forward, backward);
  329. var subdividedHeights;
  330. var subdividedPositions;
  331. for (var i = 1; i < length - 1; i++) {
  332. var repeat = duplicatePoints ? 2 : 1;
  333. nextPosition = positions[i + 1];
  334. forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
  335. forward = Cartographic.Cartesian3.normalize(forward, forward);
  336. cornerDirection = Cartographic.Cartesian3.add(forward, backward, cornerDirection);
  337. cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
  338. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  339. var forwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(forward, surfaceNormal), scratchForwardProjection);
  340. Cartographic.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  341. Cartographic.Cartesian3.normalize(forwardProjection, forwardProjection);
  342. var backwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(backward, surfaceNormal), scratchBackwardProjection);
  343. Cartographic.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  344. Cartographic.Cartesian3.normalize(backwardProjection, backwardProjection);
  345. var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartographic.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
  346. if (doCorner) {
  347. cornerDirection = Cartographic.Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
  348. cornerDirection = Cartographic.Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
  349. cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
  350. var scalar = 1 / Math.max(0.25, (Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(cornerDirection, backward, scratch1))));
  351. var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
  352. if (leftIsOutside) {
  353. pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  354. start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, start), start);
  355. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  356. scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
  357. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  358. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  359. positions: scratch2Array,
  360. granularity: granularity,
  361. ellipsoid: ellipsoid
  362. });
  363. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  364. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  365. left = Cartographic.Cartesian3.normalize(left, left);
  366. end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, end), end);
  367. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  368. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  369. } else {
  370. cornerDirection = Cartographic.Cartesian3.negate(cornerDirection, cornerDirection);
  371. finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
  372. }
  373. previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
  374. } else {
  375. pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  376. start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, start), start);
  377. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  378. scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
  379. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  380. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  381. positions: scratch2Array,
  382. granularity: granularity,
  383. ellipsoid: ellipsoid
  384. });
  385. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  386. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  387. left = Cartographic.Cartesian3.normalize(left, left);
  388. end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, end), end);
  389. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  390. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  391. } else {
  392. finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
  393. }
  394. previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
  395. }
  396. backward = Cartographic.Cartesian3.negate(forward, backward);
  397. } else {
  398. finalPositions = addPosition(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1);
  399. previousPosition = position;
  400. }
  401. h0 = h1;
  402. h1 = heights[i + 1];
  403. position = nextPosition;
  404. }
  405. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  406. scratch2Array[1] = Cartographic.Cartesian3.clone(position, scratch2Array[1]);
  407. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  408. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  409. positions: scratch2Array,
  410. granularity: granularity,
  411. ellipsoid: ellipsoid
  412. });
  413. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  414. if (duplicatePoints) {
  415. ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1);
  416. }
  417. length = finalPositions.length;
  418. var posLength = duplicatePoints ? length + ends.length : length;
  419. var combinedPositions = new Float64Array(posLength);
  420. combinedPositions.set(finalPositions);
  421. if (duplicatePoints) {
  422. combinedPositions.set(ends, length);
  423. }
  424. return combinedPositions;
  425. };
  426. PolylineVolumeGeometryLibrary.computeLocalPositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints, enuCenter) {
  427. var ellipsoid = geometry._ellipsoid;
  428. var heights = scaleToSurface(positions, ellipsoid);
  429. var granularity = geometry._granularity;
  430. var cornerType = geometry._cornerType;
  431. var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
  432. var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
  433. var heightOffset = 0; //保证放样模型处于放样点的中心点
  434. var width = boundingRectangle.width / 2;
  435. var length = positions.length;
  436. var finalPositions = [];
  437. var ends = duplicatePoints ? [] : undefined;
  438. var forward = scratchCartesian1;
  439. var backward = scratchCartesian2;
  440. var cornerDirection = scratchCartesian3;
  441. var surfaceNormal = scratchCartesian4;
  442. var pivot = scratchCartesian5;
  443. var start = scratchCartesian6;
  444. var end = scratchCartesian7;
  445. var left = scratchCartesian8;
  446. var previousPosition = scratchCartesian9;
  447. var enu = Transforms.Transforms.eastNorthUpToFixedFrame(enuCenter, ellipsoid, new BoundingSphere.Matrix4());
  448. var enuInverse = BoundingSphere.Matrix4.inverse(enu, new BoundingSphere.Matrix4());
  449. var position = positions[0];
  450. var nextPosition = positions[1];
  451. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  452. forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
  453. forward = Cartographic.Cartesian3.normalize(forward, forward);
  454. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  455. left = Cartographic.Cartesian3.normalize(left, left);
  456. var h0 = heights[0];
  457. var h1 = heights[1];
  458. if (duplicatePoints) {
  459. ends = addPositionLocal(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1, enuInverse);
  460. }
  461. previousPosition = Cartographic.Cartesian3.clone(position, previousPosition);
  462. position = nextPosition;
  463. backward = Cartographic.Cartesian3.negate(forward, backward);
  464. var subdividedHeights;
  465. var subdividedPositions;
  466. for (var i = 1; i < length - 1; i++) {
  467. var repeat = duplicatePoints ? 2 : 1;
  468. nextPosition = positions[i + 1];
  469. forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
  470. forward = Cartographic.Cartesian3.normalize(forward, forward);
  471. cornerDirection = Cartographic.Cartesian3.add(forward, backward, cornerDirection);
  472. cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
  473. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  474. var forwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(forward, surfaceNormal), scratchForwardProjection);
  475. Cartographic.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  476. Cartographic.Cartesian3.normalize(forwardProjection, forwardProjection);
  477. var backwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(backward, surfaceNormal), scratchBackwardProjection);
  478. Cartographic.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  479. Cartographic.Cartesian3.normalize(backwardProjection, backwardProjection);
  480. var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartographic.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
  481. if (doCorner) {
  482. cornerDirection = Cartographic.Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
  483. cornerDirection = Cartographic.Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
  484. cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
  485. var scalar = 1 / Math.max(0.25, (Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(cornerDirection, backward, scratch1))));
  486. var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
  487. if (leftIsOutside) {
  488. pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  489. start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, start), start);
  490. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  491. scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
  492. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  493. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  494. positions: scratch2Array,
  495. granularity: granularity,
  496. ellipsoid: ellipsoid
  497. });
  498. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1, fromEnu);
  499. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  500. left = Cartographic.Cartesian3.normalize(left, left);
  501. end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, end), end);
  502. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  503. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  504. } else {
  505. cornerDirection = Cartographic.Cartesian3.negate(cornerDirection, cornerDirection);
  506. finalPositions = addPositionLocal(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat, enuInverse);
  507. }
  508. previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
  509. } else {
  510. pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
  511. start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, start), start);
  512. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  513. scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
  514. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  515. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  516. positions: scratch2Array,
  517. granularity: granularity,
  518. ellipsoid: ellipsoid
  519. });
  520. finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
  521. left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
  522. left = Cartographic.Cartesian3.normalize(left, left);
  523. end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, end), end);
  524. if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
  525. computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
  526. } else {
  527. finalPositions = addPositionLocal(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat, enuInverse);
  528. }
  529. previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
  530. }
  531. backward = Cartographic.Cartesian3.negate(forward, backward);
  532. } else {
  533. finalPositions = addPositionLocal(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1, enuInverse);
  534. previousPosition = position;
  535. }
  536. h0 = h1;
  537. h1 = heights[i + 1];
  538. position = nextPosition;
  539. }
  540. scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
  541. scratch2Array[1] = Cartographic.Cartesian3.clone(position, scratch2Array[1]);
  542. subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
  543. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  544. positions: scratch2Array,
  545. granularity: granularity,
  546. ellipsoid: ellipsoid
  547. });
  548. finalPositions = addLocalPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1, enuInverse);
  549. if (duplicatePoints) {
  550. ends = addPositionLocal(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1, enuInverse);
  551. }
  552. length = finalPositions.length;
  553. var posLength = duplicatePoints ? length + ends.length : length;
  554. var combinedPositions = new Float64Array(posLength);
  555. combinedPositions.set(finalPositions);
  556. if (duplicatePoints) {
  557. combinedPositions.set(ends, length);
  558. }
  559. return combinedPositions;
  560. };
  561. exports.CornerType = CornerType$1;
  562. exports.PolylineVolumeGeometryLibrary = PolylineVolumeGeometryLibrary;
  563. });