cosineAndSine.glsl 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /**
  2. * @private
  3. */
  4. vec2 cordic(float angle)
  5. {
  6. // Scale the vector by the appropriate factor for the 24 iterations to follow.
  7. vec2 vector = vec2(6.0725293500888267e-1, 0.0);
  8. // Iteration 1
  9. float sense = (angle < 0.0) ? -1.0 : 1.0;
  10. // float factor = sense * 1.0; // 2^-0
  11. mat2 rotation = mat2(1.0, sense, -sense, 1.0);
  12. vector = rotation * vector;
  13. angle -= sense * 7.8539816339744828e-1; // atan(2^-0)
  14. // Iteration 2
  15. sense = (angle < 0.0) ? -1.0 : 1.0;
  16. float factor = sense * 5.0e-1; // 2^-1
  17. rotation[0][1] = factor;
  18. rotation[1][0] = -factor;
  19. vector = rotation * vector;
  20. angle -= sense * 4.6364760900080609e-1; // atan(2^-1)
  21. // Iteration 3
  22. sense = (angle < 0.0) ? -1.0 : 1.0;
  23. factor = sense * 2.5e-1; // 2^-2
  24. rotation[0][1] = factor;
  25. rotation[1][0] = -factor;
  26. vector = rotation * vector;
  27. angle -= sense * 2.4497866312686414e-1; // atan(2^-2)
  28. // Iteration 4
  29. sense = (angle < 0.0) ? -1.0 : 1.0;
  30. factor = sense * 1.25e-1; // 2^-3
  31. rotation[0][1] = factor;
  32. rotation[1][0] = -factor;
  33. vector = rotation * vector;
  34. angle -= sense * 1.2435499454676144e-1; // atan(2^-3)
  35. // Iteration 5
  36. sense = (angle < 0.0) ? -1.0 : 1.0;
  37. factor = sense * 6.25e-2; // 2^-4
  38. rotation[0][1] = factor;
  39. rotation[1][0] = -factor;
  40. vector = rotation * vector;
  41. angle -= sense * 6.2418809995957350e-2; // atan(2^-4)
  42. // Iteration 6
  43. sense = (angle < 0.0) ? -1.0 : 1.0;
  44. factor = sense * 3.125e-2; // 2^-5
  45. rotation[0][1] = factor;
  46. rotation[1][0] = -factor;
  47. vector = rotation * vector;
  48. angle -= sense * 3.1239833430268277e-2; // atan(2^-5)
  49. // Iteration 7
  50. sense = (angle < 0.0) ? -1.0 : 1.0;
  51. factor = sense * 1.5625e-2; // 2^-6
  52. rotation[0][1] = factor;
  53. rotation[1][0] = -factor;
  54. vector = rotation * vector;
  55. angle -= sense * 1.5623728620476831e-2; // atan(2^-6)
  56. // Iteration 8
  57. sense = (angle < 0.0) ? -1.0 : 1.0;
  58. factor = sense * 7.8125e-3; // 2^-7
  59. rotation[0][1] = factor;
  60. rotation[1][0] = -factor;
  61. vector = rotation * vector;
  62. angle -= sense * 7.8123410601011111e-3; // atan(2^-7)
  63. // Iteration 9
  64. sense = (angle < 0.0) ? -1.0 : 1.0;
  65. factor = sense * 3.90625e-3; // 2^-8
  66. rotation[0][1] = factor;
  67. rotation[1][0] = -factor;
  68. vector = rotation * vector;
  69. angle -= sense * 3.9062301319669718e-3; // atan(2^-8)
  70. // Iteration 10
  71. sense = (angle < 0.0) ? -1.0 : 1.0;
  72. factor = sense * 1.953125e-3; // 2^-9
  73. rotation[0][1] = factor;
  74. rotation[1][0] = -factor;
  75. vector = rotation * vector;
  76. angle -= sense * 1.9531225164788188e-3; // atan(2^-9)
  77. // Iteration 11
  78. sense = (angle < 0.0) ? -1.0 : 1.0;
  79. factor = sense * 9.765625e-4; // 2^-10
  80. rotation[0][1] = factor;
  81. rotation[1][0] = -factor;
  82. vector = rotation * vector;
  83. angle -= sense * 9.7656218955931946e-4; // atan(2^-10)
  84. // Iteration 12
  85. sense = (angle < 0.0) ? -1.0 : 1.0;
  86. factor = sense * 4.8828125e-4; // 2^-11
  87. rotation[0][1] = factor;
  88. rotation[1][0] = -factor;
  89. vector = rotation * vector;
  90. angle -= sense * 4.8828121119489829e-4; // atan(2^-11)
  91. // Iteration 13
  92. sense = (angle < 0.0) ? -1.0 : 1.0;
  93. factor = sense * 2.44140625e-4; // 2^-12
  94. rotation[0][1] = factor;
  95. rotation[1][0] = -factor;
  96. vector = rotation * vector;
  97. angle -= sense * 2.4414062014936177e-4; // atan(2^-12)
  98. // Iteration 14
  99. sense = (angle < 0.0) ? -1.0 : 1.0;
  100. factor = sense * 1.220703125e-4; // 2^-13
  101. rotation[0][1] = factor;
  102. rotation[1][0] = -factor;
  103. vector = rotation * vector;
  104. angle -= sense * 1.2207031189367021e-4; // atan(2^-13)
  105. // Iteration 15
  106. sense = (angle < 0.0) ? -1.0 : 1.0;
  107. factor = sense * 6.103515625e-5; // 2^-14
  108. rotation[0][1] = factor;
  109. rotation[1][0] = -factor;
  110. vector = rotation * vector;
  111. angle -= sense * 6.1035156174208773e-5; // atan(2^-14)
  112. // Iteration 16
  113. sense = (angle < 0.0) ? -1.0 : 1.0;
  114. factor = sense * 3.0517578125e-5; // 2^-15
  115. rotation[0][1] = factor;
  116. rotation[1][0] = -factor;
  117. vector = rotation * vector;
  118. angle -= sense * 3.0517578115526096e-5; // atan(2^-15)
  119. // Iteration 17
  120. sense = (angle < 0.0) ? -1.0 : 1.0;
  121. factor = sense * 1.52587890625e-5; // 2^-16
  122. rotation[0][1] = factor;
  123. rotation[1][0] = -factor;
  124. vector = rotation * vector;
  125. angle -= sense * 1.5258789061315762e-5; // atan(2^-16)
  126. // Iteration 18
  127. sense = (angle < 0.0) ? -1.0 : 1.0;
  128. factor = sense * 7.62939453125e-6; // 2^-17
  129. rotation[0][1] = factor;
  130. rotation[1][0] = -factor;
  131. vector = rotation * vector;
  132. angle -= sense * 7.6293945311019700e-6; // atan(2^-17)
  133. // Iteration 19
  134. sense = (angle < 0.0) ? -1.0 : 1.0;
  135. factor = sense * 3.814697265625e-6; // 2^-18
  136. rotation[0][1] = factor;
  137. rotation[1][0] = -factor;
  138. vector = rotation * vector;
  139. angle -= sense * 3.8146972656064961e-6; // atan(2^-18)
  140. // Iteration 20
  141. sense = (angle < 0.0) ? -1.0 : 1.0;
  142. factor = sense * 1.9073486328125e-6; // 2^-19
  143. rotation[0][1] = factor;
  144. rotation[1][0] = -factor;
  145. vector = rotation * vector;
  146. angle -= sense * 1.9073486328101870e-6; // atan(2^-19)
  147. // Iteration 21
  148. sense = (angle < 0.0) ? -1.0 : 1.0;
  149. factor = sense * 9.5367431640625e-7; // 2^-20
  150. rotation[0][1] = factor;
  151. rotation[1][0] = -factor;
  152. vector = rotation * vector;
  153. angle -= sense * 9.5367431640596084e-7; // atan(2^-20)
  154. // Iteration 22
  155. sense = (angle < 0.0) ? -1.0 : 1.0;
  156. factor = sense * 4.76837158203125e-7; // 2^-21
  157. rotation[0][1] = factor;
  158. rotation[1][0] = -factor;
  159. vector = rotation * vector;
  160. angle -= sense * 4.7683715820308884e-7; // atan(2^-21)
  161. // Iteration 23
  162. sense = (angle < 0.0) ? -1.0 : 1.0;
  163. factor = sense * 2.384185791015625e-7; // 2^-22
  164. rotation[0][1] = factor;
  165. rotation[1][0] = -factor;
  166. vector = rotation * vector;
  167. angle -= sense * 2.3841857910155797e-7; // atan(2^-22)
  168. // Iteration 24
  169. sense = (angle < 0.0) ? -1.0 : 1.0;
  170. factor = sense * 1.1920928955078125e-7; // 2^-23
  171. rotation[0][1] = factor;
  172. rotation[1][0] = -factor;
  173. vector = rotation * vector;
  174. // angle -= sense * 1.1920928955078068e-7; // atan(2^-23)
  175. return vector;
  176. }
  177. /**
  178. * Computes the cosine and sine of the provided angle using the CORDIC algorithm.
  179. *
  180. * @name czm_cosineAndSine
  181. * @glslFunction
  182. *
  183. * @param {float} angle The angle in radians.
  184. *
  185. * @returns {vec2} The resulting cosine of the angle (as the x coordinate) and sine of the angle (as the y coordinate).
  186. *
  187. * @example
  188. * vec2 v = czm_cosineAndSine(czm_piOverSix);
  189. * float cosine = v.x;
  190. * float sine = v.y;
  191. */
  192. vec2 czm_cosineAndSine(float angle)
  193. {
  194. if (angle < -czm_piOverTwo || angle > czm_piOverTwo)
  195. {
  196. if (angle < 0.0)
  197. {
  198. return -cordic(angle + czm_pi);
  199. }
  200. else
  201. {
  202. return -cordic(angle - czm_pi);
  203. }
  204. }
  205. else
  206. {
  207. return cordic(angle);
  208. }
  209. }