trig.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. use crate::consts::{ PROJECTION_PLANE_WIDTH, MAX_RAY_LENGTH };
  2. use core::f64::consts::PI;
  3. include!(concat!(env!("OUT_DIR"), "/lookup.rs"));
  4. pub const ANGLE_60: i32 = PROJECTION_PLANE_WIDTH;
  5. pub const ANGLE_0: i32 = 0;
  6. pub const ANGLE_5: i32 = ANGLE_60 / 12;
  7. pub const ANGLE_10: i32 = ANGLE_60 / 6;
  8. pub const ANGLE_30: i32 = ANGLE_60 / 2;
  9. pub const ANGLE_90: i32 = ANGLE_30 * 3;
  10. pub const ANGLE_180: i32 = ANGLE_60 * 3;
  11. pub const ANGLE_270: i32 = ANGLE_90 * 3;
  12. pub const ANGLE_360: i32 = ANGLE_60 * 6;
  13. pub fn radian(angle: i32) -> f64 {
  14. angle as f64 * PI / ANGLE_180 as f64
  15. }
  16. pub fn cos(degrees: i32) -> i32 {
  17. COS[degrees as usize]
  18. }
  19. pub fn sin(degrees: i32) -> i32 {
  20. SIN[degrees as usize]
  21. }
  22. pub fn tan(degrees: i32) -> i32 {
  23. TAN[degrees as usize]
  24. }
  25. pub fn icos(degrees: i32) -> i32 {
  26. ICOS[degrees as usize]
  27. }
  28. pub fn isin(degrees: i32) -> i32 {
  29. ISIN[degrees as usize]
  30. }
  31. pub fn itan(degrees: i32) -> i32 {
  32. ITAN[degrees as usize]
  33. }
  34. pub fn xstep(degrees: i32) -> i32 {
  35. X_STEP[degrees as usize]
  36. }
  37. pub fn ystep(degrees: i32) -> i32 {
  38. Y_STEP[degrees as usize]
  39. }
  40. pub fn fisheye_correction(degrees: i32) -> i32 {
  41. FISHEYE[degrees as usize]
  42. }
  43. pub fn wall_height(dist: i32) -> i32 {
  44. WALL_HEIGHT[dist.min(MAX_RAY_LENGTH) as usize]
  45. }
  46. // #[cfg(test)]
  47. // mod tests {
  48. // use float_cmp;
  49. // use super::*;
  50. // #[test]
  51. // fn test_cos_values() {
  52. // let tests = [
  53. // ("ANGLE_0", ANGLE_0, 1.0),
  54. // ("ANGLE_30", ANGLE_30, 0.8660254),
  55. // ("ANGLE_60", ANGLE_60, 0.5),
  56. // ("ANGLE_90", ANGLE_90, 0.0),
  57. // ("ANGLE_180", ANGLE_180, -1.0),
  58. // ("ANGLE_270", ANGLE_270, 0.0),
  59. // ("ANGLE_360", ANGLE_360, 1.0),
  60. // ];
  61. // for (label, angle, result) in tests {
  62. // println!("cos({label})");
  63. // float_cmp::assert_approx_eq!(f64, cos(angle), result, epsilon = 0.00000003, ulps = 2);
  64. // }
  65. // }
  66. // #[test]
  67. // fn test_sin_values() {
  68. // let tests = [
  69. // ("ANGLE_0", ANGLE_0, 0.0),
  70. // ("ANGLE_30", ANGLE_30, 0.5),
  71. // ("ANGLE_60", ANGLE_60, 0.8660254),
  72. // ("ANGLE_90", ANGLE_90, 1.0),
  73. // ("ANGLE_180", ANGLE_180, 0.0),
  74. // ("ANGLE_270", ANGLE_270, -1.0),
  75. // ("ANGLE_360", ANGLE_360, 0.0),
  76. // ];
  77. // for (label, angle, result) in tests {
  78. // println!("sin({label})");
  79. // float_cmp::assert_approx_eq!(f64, sin(angle), result, epsilon = 0.00000003, ulps = 2);
  80. // }
  81. // }
  82. // #[test]
  83. // fn test_tan_values() {
  84. // let tests = [
  85. // ("ANGLE_0", ANGLE_0, 0.0),
  86. // ("ANGLE_30", ANGLE_30, 0.577350269),
  87. // ("ANGLE_60", ANGLE_60, 1.732050808),
  88. // ("ANGLE_90", ANGLE_90, f64::INFINITY),
  89. // ("ANGLE_180", ANGLE_180, 0.0),
  90. // ("ANGLE_270", ANGLE_270, f64::NEG_INFINITY),
  91. // ("ANGLE_360", ANGLE_360, 0.0),
  92. // ];
  93. // for (label, angle, result) in tests {
  94. // println!("tan({label})");
  95. // float_cmp::assert_approx_eq!(f64, tan(angle), result, epsilon = 0.00000003, ulps = 2);
  96. // }
  97. // }
  98. // #[test]
  99. // fn test_icos_values() {
  100. // let tests = [
  101. // ("ANGLE_0", ANGLE_0, 1.0),
  102. // ("ANGLE_30", ANGLE_30, 1.154700538),
  103. // ("ANGLE_60", ANGLE_60, 2.0),
  104. // ("ANGLE_90", ANGLE_90, f64::INFINITY),
  105. // ("ANGLE_180", ANGLE_180, -1.0),
  106. // ("ANGLE_270", ANGLE_270, f64::INFINITY),
  107. // ("ANGLE_360", ANGLE_360, 1.0),
  108. // ];
  109. // for (label, angle, result) in tests {
  110. // println!("icos({label})");
  111. // float_cmp::assert_approx_eq!(f64, icos(angle), result, epsilon = 0.00000003, ulps = 2);
  112. // }
  113. // }
  114. // #[test]
  115. // fn test_isin_values() {
  116. // let tests = [
  117. // ("ANGLE_0", ANGLE_0, f64::INFINITY),
  118. // ("ANGLE_30", ANGLE_30, 2.0),
  119. // ("ANGLE_60", ANGLE_60, 1.154700538),
  120. // ("ANGLE_90", ANGLE_90, 1.0),
  121. // ("ANGLE_180", ANGLE_180, f64::INFINITY),
  122. // ("ANGLE_270", ANGLE_270, -1.0),
  123. // ("ANGLE_360", ANGLE_360, f64::INFINITY),
  124. // ];
  125. // for (label, angle, result) in tests {
  126. // println!("isin({label})");
  127. // float_cmp::assert_approx_eq!(f64, isin(angle), result, epsilon = 0.00000003, ulps = 2);
  128. // }
  129. // }
  130. // #[test]
  131. // fn test_itan_values() {
  132. // let tests = [
  133. // ("ANGLE_0", ANGLE_0, f64::INFINITY),
  134. // ("ANGLE_30", ANGLE_30, 1.732050808),
  135. // ("ANGLE_60", ANGLE_60, 0.577350269),
  136. // ("ANGLE_90", ANGLE_90, 0.0),
  137. // ("ANGLE_180", ANGLE_180, f64::NEG_INFINITY),
  138. // ("ANGLE_270", ANGLE_270, 0.0),
  139. // ("ANGLE_360", ANGLE_360, f64::INFINITY),
  140. // ];
  141. // for (label, angle, result) in tests {
  142. // println!("itan({label})");
  143. // float_cmp::assert_approx_eq!(f64, itan(angle), result, epsilon = 0.00000003, ulps = 2);
  144. // }
  145. // }
  146. // }