box2d_rust/math_functions/
scalar.rs1use super::*;
5
6pub fn min_int(a: i32, b: i32) -> i32 {
8 if a < b {
9 a
10 } else {
11 b
12 }
13}
14
15pub fn max_int(a: i32, b: i32) -> i32 {
17 if a > b {
18 a
19 } else {
20 b
21 }
22}
23
24pub fn abs_int(a: i32) -> i32 {
26 if a < 0 {
27 -a
28 } else {
29 a
30 }
31}
32
33pub fn clamp_int(a: i32, lower: i32, upper: i32) -> i32 {
35 if a < lower {
36 lower
37 } else if a > upper {
38 upper
39 } else {
40 a
41 }
42}
43
44pub fn ceiling_int(numerator: i32, denominator: i32) -> i32 {
46 debug_assert!(denominator > 0 && numerator >= 0);
47 (numerator + denominator - 1) / denominator
48}
49
50pub fn min_float(a: f32, b: f32) -> f32 {
53 if a < b {
54 a
55 } else {
56 b
57 }
58}
59
60pub fn max_float(a: f32, b: f32) -> f32 {
62 if a > b {
63 a
64 } else {
65 b
66 }
67}
68
69pub fn abs_float(a: f32) -> f32 {
71 if a < 0.0 {
72 -a
73 } else {
74 a
75 }
76}
77
78pub fn clamp_float(a: f32, lower: f32, upper: f32) -> f32 {
80 if a < lower {
81 lower
82 } else if a > upper {
83 upper
84 } else {
85 a
86 }
87}
88
89pub fn atan2(y: f32, x: f32) -> f32 {
95 if x == 0.0 && y == 0.0 {
97 return 0.0;
98 }
99
100 let ax = abs_float(x);
101 let ay = abs_float(y);
102 let mx = max_float(ay, ax);
103 let mn = min_float(ay, ax);
104 let a = mn / mx;
105
106 let s = a * a;
108 let c = s * a;
109 let q = s * s;
110 let mut r = 0.024840285 * q + 0.18681418;
111 let t = -0.094097948 * q - 0.33213072;
112 r = r * s + t;
113 r = r * c + a;
114
115 if ay > ax {
117 r = 1.57079637 - r;
118 }
119
120 if x < 0.0 {
121 r = 3.14159274 - r;
122 }
123
124 if y < 0.0 {
125 r = -r;
126 }
127
128 r
129}
130
131pub fn compute_cos_sin(radians: f32) -> CosSin {
138 let x = unwind_angle(radians);
139 let pi2 = PI * PI;
140
141 let c: f32 = if x < -0.5 * PI {
143 let y = x + PI;
144 let y2 = y * y;
145 -(pi2 - 4.0 * y2) / (pi2 + y2)
146 } else if x > 0.5 * PI {
147 let y = x - PI;
148 let y2 = y * y;
149 -(pi2 - 4.0 * y2) / (pi2 + y2)
150 } else {
151 let y2 = x * x;
152 (pi2 - 4.0 * y2) / (pi2 + y2)
153 };
154
155 let s: f32 = if x < 0.0 {
157 let y = x + PI;
158 -16.0 * y * (PI - y) / (5.0 * pi2 - 4.0 * y * (PI - y))
159 } else {
160 16.0 * x * (PI - x) / (5.0 * pi2 - 4.0 * x * (PI - x))
161 };
162
163 let mag = (s * s + c * c).sqrt();
164 let inv_mag = if mag > 0.0 { 1.0 / mag } else { 0.0 };
165 CosSin {
166 cosine: c * inv_mag,
167 sine: s * inv_mag,
168 }
169}