PolylineVolumeGeometryLibrary-c5f85813.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. /* This file is automatically rebuilt by the Cesium build process. */
  2. define(['exports', './Math-392d0035', './Cartesian2-a5d6dde9', './Transforms-81680c41', './EllipsoidTangentPlane-85280670', './PolylinePipeline-0b5c8621'], function (exports, _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. * @enum {Number}
  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 = Object.freeze(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(
  94. Cartesian2.Cartesian3.add(position, start, nextScratch),
  95. nextScratch
  96. );
  97. var prev = tangentPlane.projectPointOntoPlane(
  98. Cartesian2.Cartesian3.add(position, end, prevScratch),
  99. prevScratch
  100. );
  101. var angle = Cartesian2.Cartesian2.angleBetween(next, prev);
  102. return prev.x * next.y - prev.y * next.x >= 0.0 ? -angle : angle;
  103. }
  104. var negativeX = new Cartesian2.Cartesian3(-1, 0, 0);
  105. var transform = new Transforms.Matrix4();
  106. var translation = new Transforms.Matrix4();
  107. var rotationZ = new Transforms.Matrix3();
  108. var scaleMatrix = Transforms.Matrix3.IDENTITY.clone();
  109. var westScratch = new Cartesian2.Cartesian3();
  110. var finalPosScratch = new Transforms.Cartesian4();
  111. var heightCartesian = new Cartesian2.Cartesian3();
  112. function addPosition(
  113. center,
  114. left,
  115. shape,
  116. finalPositions,
  117. ellipsoid,
  118. height,
  119. xScalar,
  120. repeat
  121. ) {
  122. var west = westScratch;
  123. var finalPosition = finalPosScratch;
  124. transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
  125. west = Transforms.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
  126. west = Cartesian2.Cartesian3.normalize(west, west);
  127. var angle = computeRotationAngle(west, left, center, ellipsoid);
  128. rotationZ = Transforms.Matrix3.fromRotationZ(angle, rotationZ);
  129. heightCartesian.z = height;
  130. transform = Transforms.Matrix4.multiplyTransformation(
  131. transform,
  132. Transforms.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation),
  133. transform
  134. );
  135. var scale = scaleMatrix;
  136. scale[0] = xScalar;
  137. for (var j = 0; j < repeat; j++) {
  138. for (var i = 0; i < shape.length; i += 3) {
  139. finalPosition = Cartesian2.Cartesian3.fromArray(shape, i, finalPosition);
  140. finalPosition = Transforms.Matrix3.multiplyByVector(
  141. scale,
  142. finalPosition,
  143. finalPosition
  144. );
  145. finalPosition = Transforms.Matrix4.multiplyByPoint(
  146. transform,
  147. finalPosition,
  148. finalPosition
  149. );
  150. finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
  151. }
  152. }
  153. return finalPositions;
  154. }
  155. var centerScratch = new Cartesian2.Cartesian3();
  156. function addPositions(
  157. centers,
  158. left,
  159. shape,
  160. finalPositions,
  161. ellipsoid,
  162. heights,
  163. xScalar
  164. ) {
  165. for (var i = 0; i < centers.length; i += 3) {
  166. var center = Cartesian2.Cartesian3.fromArray(centers, i, centerScratch);
  167. finalPositions = addPosition(
  168. center,
  169. left,
  170. shape,
  171. finalPositions,
  172. ellipsoid,
  173. heights[i / 3],
  174. xScalar,
  175. 1
  176. );
  177. }
  178. return finalPositions;
  179. }
  180. function convertShapeTo3DDuplicate(shape2D, boundingRectangle) {
  181. //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
  182. var length = shape2D.length;
  183. var shape = new Array(length * 6);
  184. var index = 0;
  185. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  186. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  187. var point = shape2D[0];
  188. shape[index++] = point.x - xOffset;
  189. shape[index++] = 0.0;
  190. shape[index++] = point.y - yOffset;
  191. for (var i = 1; i < length; i++) {
  192. point = shape2D[i];
  193. var x = point.x - xOffset;
  194. var z = point.y - yOffset;
  195. shape[index++] = x;
  196. shape[index++] = 0.0;
  197. shape[index++] = z;
  198. shape[index++] = x;
  199. shape[index++] = 0.0;
  200. shape[index++] = z;
  201. }
  202. point = shape2D[0];
  203. shape[index++] = point.x - xOffset;
  204. shape[index++] = 0.0;
  205. shape[index++] = point.y - yOffset;
  206. return shape;
  207. }
  208. function convertShapeTo3D(shape2D, boundingRectangle) {
  209. //orientate 2D shape to XZ plane center at (0, 0, 0)
  210. var length = shape2D.length;
  211. var shape = new Array(length * 3);
  212. var index = 0;
  213. var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
  214. var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
  215. for (var i = 0; i < length; i++) {
  216. shape[index++] = shape2D[i].x - xOffset;
  217. shape[index++] = 0;
  218. shape[index++] = shape2D[i].y - yOffset;
  219. }
  220. return shape;
  221. }
  222. var quaterion = new Transforms.Quaternion();
  223. var startPointScratch = new Cartesian2.Cartesian3();
  224. var rotMatrix = new Transforms.Matrix3();
  225. function computeRoundCorner(
  226. pivot,
  227. startPoint,
  228. endPoint,
  229. cornerType,
  230. leftIsOutside,
  231. ellipsoid,
  232. finalPositions,
  233. shape,
  234. height,
  235. duplicatePoints
  236. ) {
  237. var angle = Cartesian2.Cartesian3.angleBetween(
  238. Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1),
  239. Cartesian2.Cartesian3.subtract(endPoint, pivot, scratch2)
  240. );
  241. var granularity =
  242. cornerType === CornerType$1.BEVELED
  243. ? 0
  244. : Math.ceil(angle / _Math.CesiumMath.toRadians(5));
  245. var m;
  246. if (leftIsOutside) {
  247. m = Transforms.Matrix3.fromQuaternion(
  248. Transforms.Quaternion.fromAxisAngle(
  249. Cartesian2.Cartesian3.negate(pivot, scratch1),
  250. angle / (granularity + 1),
  251. quaterion
  252. ),
  253. rotMatrix
  254. );
  255. } else {
  256. m = Transforms.Matrix3.fromQuaternion(
  257. Transforms.Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion),
  258. rotMatrix
  259. );
  260. }
  261. var left;
  262. var surfacePoint;
  263. startPoint = Cartesian2.Cartesian3.clone(startPoint, startPointScratch);
  264. if (granularity > 0) {
  265. var repeat = duplicatePoints ? 2 : 1;
  266. for (var i = 0; i < granularity; i++) {
  267. startPoint = Transforms.Matrix3.multiplyByVector(m, startPoint, startPoint);
  268. left = Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1);
  269. left = Cartesian2.Cartesian3.normalize(left, left);
  270. if (!leftIsOutside) {
  271. left = Cartesian2.Cartesian3.negate(left, left);
  272. }
  273. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  274. finalPositions = addPosition(
  275. surfacePoint,
  276. left,
  277. shape,
  278. finalPositions,
  279. ellipsoid,
  280. height,
  281. 1,
  282. repeat
  283. );
  284. }
  285. } else {
  286. left = Cartesian2.Cartesian3.subtract(startPoint, pivot, scratch1);
  287. left = Cartesian2.Cartesian3.normalize(left, left);
  288. if (!leftIsOutside) {
  289. left = Cartesian2.Cartesian3.negate(left, left);
  290. }
  291. surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
  292. finalPositions = addPosition(
  293. surfacePoint,
  294. left,
  295. shape,
  296. finalPositions,
  297. ellipsoid,
  298. height,
  299. 1,
  300. 1
  301. );
  302. endPoint = Cartesian2.Cartesian3.clone(endPoint, startPointScratch);
  303. left = Cartesian2.Cartesian3.subtract(endPoint, pivot, scratch1);
  304. left = Cartesian2.Cartesian3.normalize(left, left);
  305. if (!leftIsOutside) {
  306. left = Cartesian2.Cartesian3.negate(left, left);
  307. }
  308. surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
  309. finalPositions = addPosition(
  310. surfacePoint,
  311. left,
  312. shape,
  313. finalPositions,
  314. ellipsoid,
  315. height,
  316. 1,
  317. 1
  318. );
  319. }
  320. return finalPositions;
  321. }
  322. PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function (
  323. shapePositions
  324. ) {
  325. var length = shapePositions.length;
  326. var cleanedPositions = [];
  327. for (var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
  328. var v0 = shapePositions[i0];
  329. var v1 = shapePositions[i1];
  330. if (!Cartesian2.Cartesian2.equals(v0, v1)) {
  331. cleanedPositions.push(v1); // Shallow copy!
  332. }
  333. }
  334. return cleanedPositions;
  335. };
  336. PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function (
  337. forward,
  338. backward,
  339. position,
  340. ellipsoid
  341. ) {
  342. var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
  343. var next = tangentPlane.projectPointOntoPlane(
  344. Cartesian2.Cartesian3.add(position, forward, nextScratch),
  345. nextScratch
  346. );
  347. var prev = tangentPlane.projectPointOntoPlane(
  348. Cartesian2.Cartesian3.add(position, backward, prevScratch),
  349. prevScratch
  350. );
  351. return prev.x * next.y - prev.y * next.x >= 0.0;
  352. };
  353. var scratchForwardProjection = new Cartesian2.Cartesian3();
  354. var scratchBackwardProjection = new Cartesian2.Cartesian3();
  355. PolylineVolumeGeometryLibrary.computePositions = function (
  356. positions,
  357. shape2D,
  358. boundingRectangle,
  359. geometry,
  360. duplicatePoints
  361. ) {
  362. var ellipsoid = geometry._ellipsoid;
  363. var heights = scaleToSurface(positions, ellipsoid);
  364. var granularity = geometry._granularity;
  365. var cornerType = geometry._cornerType;
  366. var shapeForSides = duplicatePoints
  367. ? convertShapeTo3DDuplicate(shape2D, boundingRectangle)
  368. : convertShapeTo3D(shape2D, boundingRectangle);
  369. var shapeForEnds = duplicatePoints
  370. ? convertShapeTo3D(shape2D, boundingRectangle)
  371. : undefined;
  372. var heightOffset = boundingRectangle.height / 2;
  373. var width = boundingRectangle.width / 2;
  374. var length = positions.length;
  375. var finalPositions = [];
  376. var ends = duplicatePoints ? [] : undefined;
  377. var forward = scratchCartesian1;
  378. var backward = scratchCartesian2;
  379. var cornerDirection = scratchCartesian3;
  380. var surfaceNormal = scratchCartesian4;
  381. var pivot = scratchCartesian5;
  382. var start = scratchCartesian6;
  383. var end = scratchCartesian7;
  384. var left = scratchCartesian8;
  385. var previousPosition = scratchCartesian9;
  386. var position = positions[0];
  387. var nextPosition = positions[1];
  388. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  389. forward = Cartesian2.Cartesian3.subtract(nextPosition, position, forward);
  390. forward = Cartesian2.Cartesian3.normalize(forward, forward);
  391. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  392. left = Cartesian2.Cartesian3.normalize(left, left);
  393. var h0 = heights[0];
  394. var h1 = heights[1];
  395. if (duplicatePoints) {
  396. ends = addPosition(
  397. position,
  398. left,
  399. shapeForEnds,
  400. ends,
  401. ellipsoid,
  402. h0 + heightOffset,
  403. 1,
  404. 1
  405. );
  406. }
  407. previousPosition = Cartesian2.Cartesian3.clone(position, previousPosition);
  408. position = nextPosition;
  409. backward = Cartesian2.Cartesian3.negate(forward, backward);
  410. var subdividedHeights;
  411. var subdividedPositions;
  412. for (var i = 1; i < length - 1; i++) {
  413. var repeat = duplicatePoints ? 2 : 1;
  414. nextPosition = positions[i + 1];
  415. forward = Cartesian2.Cartesian3.subtract(nextPosition, position, forward);
  416. forward = Cartesian2.Cartesian3.normalize(forward, forward);
  417. cornerDirection = Cartesian2.Cartesian3.add(forward, backward, cornerDirection);
  418. cornerDirection = Cartesian2.Cartesian3.normalize(cornerDirection, cornerDirection);
  419. surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
  420. var forwardProjection = Cartesian2.Cartesian3.multiplyByScalar(
  421. surfaceNormal,
  422. Cartesian2.Cartesian3.dot(forward, surfaceNormal),
  423. scratchForwardProjection
  424. );
  425. Cartesian2.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
  426. Cartesian2.Cartesian3.normalize(forwardProjection, forwardProjection);
  427. var backwardProjection = Cartesian2.Cartesian3.multiplyByScalar(
  428. surfaceNormal,
  429. Cartesian2.Cartesian3.dot(backward, surfaceNormal),
  430. scratchBackwardProjection
  431. );
  432. Cartesian2.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
  433. Cartesian2.Cartesian3.normalize(backwardProjection, backwardProjection);
  434. var doCorner = !_Math.CesiumMath.equalsEpsilon(
  435. Math.abs(Cartesian2.Cartesian3.dot(forwardProjection, backwardProjection)),
  436. 1.0,
  437. _Math.CesiumMath.EPSILON7
  438. );
  439. if (doCorner) {
  440. cornerDirection = Cartesian2.Cartesian3.cross(
  441. cornerDirection,
  442. surfaceNormal,
  443. cornerDirection
  444. );
  445. cornerDirection = Cartesian2.Cartesian3.cross(
  446. surfaceNormal,
  447. cornerDirection,
  448. cornerDirection
  449. );
  450. cornerDirection = Cartesian2.Cartesian3.normalize(cornerDirection, cornerDirection);
  451. var scalar =
  452. 1 /
  453. Math.max(
  454. 0.25,
  455. Cartesian2.Cartesian3.magnitude(
  456. Cartesian2.Cartesian3.cross(cornerDirection, backward, scratch1)
  457. )
  458. );
  459. var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(
  460. forward,
  461. backward,
  462. position,
  463. ellipsoid
  464. );
  465. if (leftIsOutside) {
  466. pivot = Cartesian2.Cartesian3.add(
  467. position,
  468. Cartesian2.Cartesian3.multiplyByScalar(
  469. cornerDirection,
  470. scalar * width,
  471. cornerDirection
  472. ),
  473. pivot
  474. );
  475. start = Cartesian2.Cartesian3.add(
  476. pivot,
  477. Cartesian2.Cartesian3.multiplyByScalar(left, width, start),
  478. start
  479. );
  480. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  481. scratch2Array[1] = Cartesian2.Cartesian3.clone(start, scratch2Array[1]);
  482. subdividedHeights = subdivideHeights(
  483. scratch2Array,
  484. h0 + heightOffset,
  485. h1 + heightOffset,
  486. granularity
  487. );
  488. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  489. positions: scratch2Array,
  490. granularity: granularity,
  491. ellipsoid: ellipsoid,
  492. });
  493. finalPositions = addPositions(
  494. subdividedPositions,
  495. left,
  496. shapeForSides,
  497. finalPositions,
  498. ellipsoid,
  499. subdividedHeights,
  500. 1
  501. );
  502. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  503. left = Cartesian2.Cartesian3.normalize(left, left);
  504. end = Cartesian2.Cartesian3.add(
  505. pivot,
  506. Cartesian2.Cartesian3.multiplyByScalar(left, width, end),
  507. end
  508. );
  509. if (
  510. cornerType === CornerType$1.ROUNDED ||
  511. cornerType === CornerType$1.BEVELED
  512. ) {
  513. computeRoundCorner(
  514. pivot,
  515. start,
  516. end,
  517. cornerType,
  518. leftIsOutside,
  519. ellipsoid,
  520. finalPositions,
  521. shapeForSides,
  522. h1 + heightOffset,
  523. duplicatePoints
  524. );
  525. } else {
  526. cornerDirection = Cartesian2.Cartesian3.negate(cornerDirection, cornerDirection);
  527. finalPositions = addPosition(
  528. position,
  529. cornerDirection,
  530. shapeForSides,
  531. finalPositions,
  532. ellipsoid,
  533. h1 + heightOffset,
  534. scalar,
  535. repeat
  536. );
  537. }
  538. previousPosition = Cartesian2.Cartesian3.clone(end, previousPosition);
  539. } else {
  540. pivot = Cartesian2.Cartesian3.add(
  541. position,
  542. Cartesian2.Cartesian3.multiplyByScalar(
  543. cornerDirection,
  544. scalar * width,
  545. cornerDirection
  546. ),
  547. pivot
  548. );
  549. start = Cartesian2.Cartesian3.add(
  550. pivot,
  551. Cartesian2.Cartesian3.multiplyByScalar(left, -width, start),
  552. start
  553. );
  554. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  555. scratch2Array[1] = Cartesian2.Cartesian3.clone(start, scratch2Array[1]);
  556. subdividedHeights = subdivideHeights(
  557. scratch2Array,
  558. h0 + heightOffset,
  559. h1 + heightOffset,
  560. granularity
  561. );
  562. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  563. positions: scratch2Array,
  564. granularity: granularity,
  565. ellipsoid: ellipsoid,
  566. });
  567. finalPositions = addPositions(
  568. subdividedPositions,
  569. left,
  570. shapeForSides,
  571. finalPositions,
  572. ellipsoid,
  573. subdividedHeights,
  574. 1
  575. );
  576. left = Cartesian2.Cartesian3.cross(surfaceNormal, forward, left);
  577. left = Cartesian2.Cartesian3.normalize(left, left);
  578. end = Cartesian2.Cartesian3.add(
  579. pivot,
  580. Cartesian2.Cartesian3.multiplyByScalar(left, -width, end),
  581. end
  582. );
  583. if (
  584. cornerType === CornerType$1.ROUNDED ||
  585. cornerType === CornerType$1.BEVELED
  586. ) {
  587. computeRoundCorner(
  588. pivot,
  589. start,
  590. end,
  591. cornerType,
  592. leftIsOutside,
  593. ellipsoid,
  594. finalPositions,
  595. shapeForSides,
  596. h1 + heightOffset,
  597. duplicatePoints
  598. );
  599. } else {
  600. finalPositions = addPosition(
  601. position,
  602. cornerDirection,
  603. shapeForSides,
  604. finalPositions,
  605. ellipsoid,
  606. h1 + heightOffset,
  607. scalar,
  608. repeat
  609. );
  610. }
  611. previousPosition = Cartesian2.Cartesian3.clone(end, previousPosition);
  612. }
  613. backward = Cartesian2.Cartesian3.negate(forward, backward);
  614. } else {
  615. finalPositions = addPosition(
  616. previousPosition,
  617. left,
  618. shapeForSides,
  619. finalPositions,
  620. ellipsoid,
  621. h0 + heightOffset,
  622. 1,
  623. 1
  624. );
  625. previousPosition = position;
  626. }
  627. h0 = h1;
  628. h1 = heights[i + 1];
  629. position = nextPosition;
  630. }
  631. scratch2Array[0] = Cartesian2.Cartesian3.clone(previousPosition, scratch2Array[0]);
  632. scratch2Array[1] = Cartesian2.Cartesian3.clone(position, scratch2Array[1]);
  633. subdividedHeights = subdivideHeights(
  634. scratch2Array,
  635. h0 + heightOffset,
  636. h1 + heightOffset,
  637. granularity
  638. );
  639. subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
  640. positions: scratch2Array,
  641. granularity: granularity,
  642. ellipsoid: ellipsoid,
  643. });
  644. finalPositions = addPositions(
  645. subdividedPositions,
  646. left,
  647. shapeForSides,
  648. finalPositions,
  649. ellipsoid,
  650. subdividedHeights,
  651. 1
  652. );
  653. if (duplicatePoints) {
  654. ends = addPosition(
  655. position,
  656. left,
  657. shapeForEnds,
  658. ends,
  659. ellipsoid,
  660. h1 + heightOffset,
  661. 1,
  662. 1
  663. );
  664. }
  665. length = finalPositions.length;
  666. var posLength = duplicatePoints ? length + ends.length : length;
  667. var combinedPositions = new Float64Array(posLength);
  668. combinedPositions.set(finalPositions);
  669. if (duplicatePoints) {
  670. combinedPositions.set(ends, length);
  671. }
  672. return combinedPositions;
  673. };
  674. exports.CornerType = CornerType$1;
  675. exports.PolylineVolumeGeometryLibrary = PolylineVolumeGeometryLibrary;
  676. });