/MathLib/Trigonometry.cs

https://github.com/tjom/MIRPCADB · C# · 450 lines · 284 code · 42 blank · 124 comment · 0 complexity · ac643764121ae6b1509f7751bcb79472 MD5 · raw file

  1. #region Math.NET Iridium (LGPL) by Ruegg
  2. // Math.NET Iridium, part of the Math.NET Project
  3. // http://mathnet.opensourcedotnet.info
  4. //
  5. // Copyright (c) 2002-2008, Christoph Rüegg, http://christoph.ruegg.name
  6. //
  7. // This program is free software; you can redistribute it and/or modify
  8. // it under the terms of the GNU Lesser General Public License as published
  9. // by the Free Software Foundation; either version 2 of the License, or
  10. // (at your option) any later version.
  11. //
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. // GNU Lesser General Public License for more details.
  16. //
  17. // You should have received a copy of the GNU Lesser General Public
  18. // License along with this program; if not, write to the Free Software
  19. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. #endregion
  21. using System;
  22. namespace MathNet.Numerics
  23. {
  24. /// <summary>
  25. /// Double-precision trigonometry toolkit.
  26. /// </summary>
  27. public static class Trig
  28. {
  29. #region Angle Conversion
  30. /// <summary>
  31. /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle.
  32. /// </summary>
  33. public static
  34. double
  35. DegreeToRadian(
  36. double degree
  37. )
  38. {
  39. return degree * Constants.Degree;
  40. }
  41. /// <summary>
  42. /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle.
  43. /// </summary>
  44. public static
  45. double
  46. RadianToDegree(
  47. double radian
  48. )
  49. {
  50. return radian / Constants.Degree;
  51. }
  52. /// <summary>
  53. /// Converts a newgrad (400-periodic) angle to a radian (2*Pi-periodic) angle.
  54. /// </summary>
  55. public static
  56. double
  57. GradToRadian(
  58. double newgrad
  59. )
  60. {
  61. return newgrad * Constants.Grad;
  62. }
  63. /// <summary>
  64. /// Converts a radian (2*Pi-periodic) angle to a newgrad (400-periodic) angle.
  65. /// </summary>
  66. public static
  67. double
  68. RadianToGrad(
  69. double radian
  70. )
  71. {
  72. return radian / Constants.Grad;
  73. }
  74. /// <summary>
  75. /// Converts a degree (360-periodic) angle to a newgrad (400-periodic) angle.
  76. /// </summary>
  77. public static
  78. double
  79. DegreeToGrad(
  80. double degree
  81. )
  82. {
  83. return degree / 9 * 10;
  84. }
  85. /// <summary>
  86. /// Converts a newgrad (400-periodic) angle to a degree (360-periodic) angle.
  87. /// </summary>
  88. public static
  89. double
  90. GradToDegree(
  91. double newgrad
  92. )
  93. {
  94. return newgrad / 10 * 9;
  95. }
  96. #endregion
  97. #region Trigonometric Functions
  98. /// <summary>
  99. /// Trigonometric Sine (Sinus) of an angle in radian
  100. /// </summary>
  101. public static
  102. double
  103. Sine(
  104. double radian
  105. )
  106. {
  107. return Math.Sin(radian);
  108. }
  109. /// <summary>
  110. /// Trigonometric Cosine (Cosinus) of an angle in radian
  111. /// </summary>
  112. public static
  113. double
  114. Cosine(
  115. double radian
  116. )
  117. {
  118. return Math.Cos(radian);
  119. }
  120. /// <summary>
  121. /// Trigonometric Tangent (Tangens) of an angle in radian
  122. /// </summary>
  123. public static
  124. double
  125. Tangent(
  126. double radian
  127. )
  128. {
  129. return Math.Tan(radian);
  130. }
  131. /// <summary>
  132. /// Trigonometric Cotangent (Cotangens) of an angle in radian
  133. /// </summary>
  134. public static
  135. double
  136. Cotangent(
  137. double radian
  138. )
  139. {
  140. return 1 / Math.Tan(radian);
  141. }
  142. /// <summary>
  143. /// Trigonometric Secant (Sekans) of an angle in radian
  144. /// </summary>
  145. public static
  146. double
  147. Secant(
  148. double radian
  149. )
  150. {
  151. return 1 / Math.Cos(radian);
  152. }
  153. /// <summary>
  154. /// Trigonometric Cosecant (Cosekans) of an angle in radian
  155. /// </summary>
  156. public static
  157. double
  158. Cosecant(
  159. double radian
  160. )
  161. {
  162. return 1 / Math.Sin(radian);
  163. }
  164. #endregion
  165. #region Trigonometric Inverse Functions
  166. /// <summary>
  167. /// Trigonometric Arcus Sine (Arkussinus) in radian
  168. /// </summary>
  169. public static
  170. double
  171. InverseSine(
  172. double real
  173. )
  174. {
  175. return Math.Asin(real);
  176. }
  177. /// <summary>
  178. /// Trigonometric Arcus Cosine (Arkuscosinus) in radian
  179. /// </summary>
  180. public static
  181. double
  182. InverseCosine(
  183. double real
  184. )
  185. {
  186. return Math.Acos(real);
  187. }
  188. /// <summary>
  189. /// Trigonometric Arcus Tangent (Arkustangens) in radian
  190. /// </summary>
  191. public static
  192. double
  193. InverseTangent(
  194. double real
  195. )
  196. {
  197. return Math.Atan(real);
  198. }
  199. /// <summary>
  200. /// The principal argument (in radian) of the complex number x+I*y
  201. /// </summary>
  202. /// <param name="nominator">y</param>
  203. /// <param name="denominator">x</param>
  204. public static
  205. double
  206. InverseTangentFromRational(
  207. double nominator,
  208. double denominator
  209. )
  210. {
  211. return Math.Atan2(nominator, denominator);
  212. }
  213. /// <summary>
  214. /// Trigonometric Arcus Cotangent (Arkuscotangens) in radian
  215. /// </summary>
  216. public static
  217. double
  218. InverseCotangent(
  219. double real
  220. )
  221. {
  222. return Math.Atan(1 / real);
  223. }
  224. /// <summary>
  225. /// Trigonometric Arcus Secant (Arkussekans) in radian
  226. /// </summary>
  227. public static
  228. double
  229. InverseSecant(
  230. double real
  231. )
  232. {
  233. return Math.Acos(1 / real);
  234. }
  235. /// <summary>
  236. /// Trigonometric Arcus Cosecant (Arkuscosekans) in radian
  237. /// </summary>
  238. public static
  239. double
  240. InverseCosecant(
  241. double real
  242. )
  243. {
  244. return Math.Asin(1 / real);
  245. }
  246. #endregion
  247. #region Hyperbolic Functions
  248. /// <summary>
  249. /// Trigonometric Hyperbolic Sine (Sinus hyperbolicus)
  250. /// </summary>
  251. public static
  252. double
  253. HyperbolicSine(
  254. double radian
  255. )
  256. {
  257. // NOT SUPPORTED BY COMPACT FRAMEWORK!!???
  258. // return Math.Sinh(x)
  259. return (Math.Exp(radian) - Math.Exp(-radian)) / 2;
  260. }
  261. /// <summary>
  262. /// Trigonometric Hyperbolic Cosine (Cosinus hyperbolicus)
  263. /// </summary>
  264. public static
  265. double
  266. HyperbolicCosine(
  267. double radian
  268. )
  269. {
  270. // NOT SUPPORTED BY COMPACT FRAMEWORK!!???
  271. // return Math.Cosh(x);
  272. return (Math.Exp(radian) + Math.Exp(-radian)) / 2;
  273. }
  274. /// <summary>
  275. /// Trigonometric Hyperbolic Tangent (Tangens hyperbolicus)
  276. /// </summary>
  277. public static
  278. double
  279. HyperbolicTangent(
  280. double radian
  281. )
  282. {
  283. // NOT SUPPORTED BY COMPACT FRAMEWORK!!???
  284. // return Math.Tanh(x);
  285. double e1 = Math.Exp(radian);
  286. double e2 = Math.Exp(-radian);
  287. return (e1 - e2) / (e1 + e2);
  288. }
  289. /// <summary>
  290. /// Trigonometric Hyperbolic Cotangent (Cotangens hyperbolicus)
  291. /// </summary>
  292. public static
  293. double
  294. HyperbolicCotangent(
  295. double radian
  296. )
  297. {
  298. // NOT SUPPORTED BY COMPACT FRAMEWORK!!???
  299. // return 1/Math.Tanh(x);
  300. double e1 = Math.Exp(radian);
  301. double e2 = Math.Exp(-radian);
  302. return (e1 + e2) / (e1 - e2);
  303. }
  304. /// <summary>
  305. /// Trigonometric Hyperbolic Secant (Sekans hyperbolicus)
  306. /// </summary>
  307. public static
  308. double
  309. HyperbolicSecant(
  310. double radian
  311. )
  312. {
  313. return 1 / HyperbolicCosine(radian);
  314. }
  315. /// <summary>
  316. /// Trigonometric Hyperbolic Cosecant (Cosekans hyperbolicus)
  317. /// </summary>
  318. public static
  319. double
  320. HyperbolicCosecant(
  321. double radian
  322. )
  323. {
  324. return 1 / HyperbolicSine(radian);
  325. }
  326. #endregion
  327. #region Hyperbolic Area Functions
  328. /// <summary>
  329. /// Trigonometric Hyperbolic Area Sine (Areasinus hyperbolicus)
  330. /// </summary>
  331. public static
  332. double
  333. InverseHyperbolicSine(
  334. double real
  335. )
  336. {
  337. return Math.Log(
  338. real + Math.Sqrt(real * real + 1),
  339. Math.E
  340. );
  341. }
  342. /// <summary>
  343. /// Trigonometric Hyperbolic Area Cosine (Areacosinus hyperbolicus)
  344. /// </summary>
  345. public static
  346. double
  347. InverseHyperbolicCosine(
  348. double real
  349. )
  350. {
  351. return Math.Log(
  352. real + Math.Sqrt(real - 1) * Math.Sqrt(real + 1),
  353. Math.E
  354. );
  355. }
  356. /// <summary>
  357. /// Trigonometric Hyperbolic Area Tangent (Areatangens hyperbolicus)
  358. /// </summary>
  359. public static
  360. double
  361. InverseHyperbolicTangent(
  362. double real
  363. )
  364. {
  365. return 0.5 * Math.Log(
  366. (1 + real) / (1 - real),
  367. Math.E
  368. );
  369. }
  370. /// <summary>
  371. /// Trigonometric Hyperbolic Area Cotangent (Areacotangens hyperbolicus)
  372. /// </summary>
  373. public static
  374. double
  375. InverseHyperbolicCotangent(
  376. double real
  377. )
  378. {
  379. return 0.5 * Math.Log(
  380. (real + 1) / (real - 1),
  381. Math.E
  382. );
  383. }
  384. /// <summary>
  385. /// Trigonometric Hyperbolic Area Secant (Areasekans hyperbolicus)
  386. /// </summary>
  387. public static
  388. double
  389. InverseHyperbolicSecant(
  390. double real
  391. )
  392. {
  393. return InverseHyperbolicCosine(1 / real);
  394. }
  395. /// <summary>
  396. /// Trigonometric Hyperbolic Area Cosecant (Areacosekans hyperbolicus)
  397. /// </summary>
  398. public static
  399. double
  400. InverseHyperbolicCosecant(
  401. double real
  402. )
  403. {
  404. return InverseHyperbolicSine(1 / real);
  405. }
  406. #endregion
  407. }
  408. }