RectangleGeometryLibrary-39950242.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /* This file is automatically rebuilt by the Cesium build process. */
  2. define(['exports', './defined-26bd4a03', './Check-da037458', './Math-fa6e45cb', './Cartesian2-2a723276', './Transforms-65aba0a4', './GeometryAttribute-ed359d71'], function (exports, defined, Check, _Math, Cartesian2, Transforms, GeometryAttribute) { 'use strict';
  3. var cos = Math.cos;
  4. var sin = Math.sin;
  5. var sqrt = Math.sqrt;
  6. /**
  7. * @private
  8. */
  9. var RectangleGeometryLibrary = {};
  10. /**
  11. * @private
  12. */
  13. RectangleGeometryLibrary.computePosition = function(computedOptions, ellipsoid, computeST, row, col, position, st) {
  14. var radiiSquared = ellipsoid.radiiSquared;
  15. var nwCorner = computedOptions.nwCorner;
  16. var rectangle = computedOptions.boundingRectangle;
  17. var stLatitude = nwCorner.latitude - computedOptions.granYCos * row + col * computedOptions.granXSin;
  18. var cosLatitude = cos(stLatitude);
  19. var nZ = sin(stLatitude);
  20. var kZ = radiiSquared.z * nZ;
  21. var stLongitude = nwCorner.longitude + row * computedOptions.granYSin + col * computedOptions.granXCos;
  22. var nX = cosLatitude * cos(stLongitude);
  23. var nY = cosLatitude * sin(stLongitude);
  24. var kX = radiiSquared.x * nX;
  25. var kY = radiiSquared.y * nY;
  26. var gamma = sqrt((kX * nX) + (kY * nY) + (kZ * nZ));
  27. position.x = kX / gamma;
  28. position.y = kY / gamma;
  29. position.z = kZ / gamma;
  30. if (computeST) {
  31. var stNwCorner = computedOptions.stNwCorner;
  32. if (defined.defined(stNwCorner)) {
  33. stLatitude = stNwCorner.latitude - computedOptions.stGranYCos * row + col * computedOptions.stGranXSin;
  34. stLongitude = stNwCorner.longitude + row * computedOptions.stGranYSin + col * computedOptions.stGranXCos;
  35. st.x = (stLongitude - computedOptions.stWest) * computedOptions.lonScalar;
  36. st.y = (stLatitude - computedOptions.stSouth) * computedOptions.latScalar;
  37. } else {
  38. st.x = (stLongitude - rectangle.west) * computedOptions.lonScalar;
  39. st.y = (stLatitude - rectangle.south) * computedOptions.latScalar;
  40. }
  41. }
  42. };
  43. var rotationMatrixScratch = new GeometryAttribute.Matrix2();
  44. var nwCartesian = new Cartesian2.Cartesian3();
  45. var centerScratch = new Cartesian2.Cartographic();
  46. var centerCartesian = new Cartesian2.Cartesian3();
  47. var proj = new Transforms.GeographicProjection();
  48. function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) {
  49. var cosRotation = Math.cos(rotation);
  50. var granYCos = granularityY * cosRotation;
  51. var granXCos = granularityX * cosRotation;
  52. var sinRotation = Math.sin(rotation);
  53. var granYSin = granularityY * sinRotation;
  54. var granXSin = granularityX * sinRotation;
  55. nwCartesian = proj.project(nwCorner, nwCartesian);
  56. nwCartesian = Cartesian2.Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian);
  57. var rotationMatrix = GeometryAttribute.Matrix2.fromRotation(rotation, rotationMatrixScratch);
  58. nwCartesian = GeometryAttribute.Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian);
  59. nwCartesian = Cartesian2.Cartesian3.add(nwCartesian, centerCartesian, nwCartesian);
  60. nwCorner = proj.unproject(nwCartesian, nwCorner);
  61. width -= 1;
  62. height -= 1;
  63. var latitude = nwCorner.latitude;
  64. var latitude0 = latitude + width * granXSin;
  65. var latitude1 = latitude - granYCos * height;
  66. var latitude2 = latitude - granYCos * height + width * granXSin;
  67. var north = Math.max(latitude, latitude0, latitude1, latitude2);
  68. var south = Math.min(latitude, latitude0, latitude1, latitude2);
  69. var longitude = nwCorner.longitude;
  70. var longitude0 = longitude + width * granXCos;
  71. var longitude1 = longitude + height * granYSin;
  72. var longitude2 = longitude + height * granYSin + width * granXCos;
  73. var east = Math.max(longitude, longitude0, longitude1, longitude2);
  74. var west = Math.min(longitude, longitude0, longitude1, longitude2);
  75. return {
  76. north: north,
  77. south: south,
  78. east: east,
  79. west: west,
  80. granYCos : granYCos,
  81. granYSin : granYSin,
  82. granXCos : granXCos,
  83. granXSin : granXSin,
  84. nwCorner : nwCorner
  85. };
  86. }
  87. /**
  88. * @private
  89. */
  90. RectangleGeometryLibrary.computeOptions = function(rectangle, granularity, rotation, stRotation, boundingRectangleScratch, nwCornerResult, stNwCornerResult) {
  91. var east = rectangle.east;
  92. var west = rectangle.west;
  93. var north = rectangle.north;
  94. var south = rectangle.south;
  95. var northCap = false;
  96. var southCap = false;
  97. if (north === _Math.CesiumMath.PI_OVER_TWO) {
  98. northCap = true;
  99. }
  100. if (south === -_Math.CesiumMath.PI_OVER_TWO) {
  101. southCap = true;
  102. }
  103. var width;
  104. var height;
  105. var granularityX;
  106. var granularityY;
  107. var dx;
  108. var dy = north - south;
  109. if (west > east) {
  110. dx = (_Math.CesiumMath.TWO_PI - west + east);
  111. } else {
  112. dx = east - west;
  113. }
  114. width = Math.ceil(dx / granularity) + 1;
  115. height = Math.ceil(dy / granularity) + 1;
  116. granularityX = dx / (width - 1);
  117. granularityY = dy / (height - 1);
  118. var nwCorner = Cartesian2.Rectangle.northwest(rectangle, nwCornerResult);
  119. var center = Cartesian2.Rectangle.center(rectangle, centerScratch);
  120. if (rotation !== 0 || stRotation !== 0) {
  121. if (center.longitude < nwCorner.longitude) {
  122. center.longitude += _Math.CesiumMath.TWO_PI;
  123. }
  124. centerCartesian = proj.project(center, centerCartesian);
  125. }
  126. var granYCos = granularityY;
  127. var granXCos = granularityX;
  128. var granYSin = 0.0;
  129. var granXSin = 0.0;
  130. var boundingRectangle = Cartesian2.Rectangle.clone(rectangle, boundingRectangleScratch);
  131. var computedOptions = {
  132. granYCos : granYCos,
  133. granYSin : granYSin,
  134. granXCos : granXCos,
  135. granXSin : granXSin,
  136. nwCorner : nwCorner,
  137. boundingRectangle : boundingRectangle,
  138. width: width,
  139. height: height,
  140. northCap: northCap,
  141. southCap: southCap
  142. };
  143. if (rotation !== 0) {
  144. var rotationOptions = getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height);
  145. north = rotationOptions.north;
  146. south = rotationOptions.south;
  147. east = rotationOptions.east;
  148. west = rotationOptions.west;
  149. //>>includeStart('debug', pragmas.debug);
  150. if (north < -_Math.CesiumMath.PI_OVER_TWO || north > _Math.CesiumMath.PI_OVER_TWO ||
  151. south < -_Math.CesiumMath.PI_OVER_TWO || south > _Math.CesiumMath.PI_OVER_TWO) {
  152. throw new Check.DeveloperError('Rotated rectangle is invalid. It crosses over either the north or south pole.');
  153. }
  154. //>>includeEnd('debug')
  155. computedOptions.granYCos = rotationOptions.granYCos;
  156. computedOptions.granYSin = rotationOptions.granYSin;
  157. computedOptions.granXCos = rotationOptions.granXCos;
  158. computedOptions.granXSin = rotationOptions.granXSin;
  159. boundingRectangle.north = north;
  160. boundingRectangle.south = south;
  161. boundingRectangle.east = east;
  162. boundingRectangle.west = west;
  163. }
  164. if (stRotation !== 0) {
  165. rotation = rotation - stRotation;
  166. var stNwCorner = Cartesian2.Rectangle.northwest(boundingRectangle, stNwCornerResult);
  167. var stRotationOptions = getRotationOptions(stNwCorner, rotation, granularityX, granularityY, center, width, height);
  168. computedOptions.stGranYCos = stRotationOptions.granYCos;
  169. computedOptions.stGranXCos = stRotationOptions.granXCos;
  170. computedOptions.stGranYSin = stRotationOptions.granYSin;
  171. computedOptions.stGranXSin = stRotationOptions.granXSin;
  172. computedOptions.stNwCorner = stNwCorner;
  173. computedOptions.stWest = stRotationOptions.west;
  174. computedOptions.stSouth = stRotationOptions.south;
  175. }
  176. return computedOptions;
  177. };
  178. exports.RectangleGeometryLibrary = RectangleGeometryLibrary;
  179. });