| ... | ... | @@ -292,6 +292,34 @@ pub inline fn tan(value: anytype) @TypeOf(value) { |
| 292 | 292 | return @tan(value); |
| 293 | 293 | } |
| 294 | 294 | |
| 295 | // Convert an angle in radians to degrees. T must be a float type. |
| 296 | pub fn radiansToDegrees(comptime T: type, angle_in_radians: T) T { |
| 297 | if (@typeInfo(T) != .Float) |
| 298 | @compileError("T must be a float type."); |
| 299 | return angle_in_radians * 180.0 / pi; |
| 300 | } |
| 301 | |
| 302 | test "radiansToDegrees" { |
| 303 | try std.testing.expectApproxEqAbs(@as(f32, 0), radiansToDegrees(f32, 0), 1e-6); |
| 304 | try std.testing.expectApproxEqAbs(@as(f32, 90), radiansToDegrees(f32, pi / 2.0), 1e-6); |
| 305 | try std.testing.expectApproxEqAbs(@as(f32, -45), radiansToDegrees(f32, -pi / 4.0), 1e-6); |
| 306 | try std.testing.expectApproxEqAbs(@as(f32, 180), radiansToDegrees(f32, pi), 1e-6); |
| 307 | try std.testing.expectApproxEqAbs(@as(f32, 360), radiansToDegrees(f32, 2.0 * pi), 1e-6); |
| 308 | } |
| 309 | |
| 310 | // Convert an angle in degrees to radians. T must be a float type. |
| 311 | pub fn degreesToRadians(comptime T: type, angle_in_degrees: T) T { |
| 312 | if (@typeInfo(T) != .Float) |
| 313 | @compileError("T must be a float type."); |
| 314 | return angle_in_degrees * pi / 180.0; |
| 315 | } |
| 316 | |
| 317 | test "degreesToRadians" { |
| 318 | try std.testing.expectApproxEqAbs(@as(f32, pi / 2.0), degreesToRadians(f32, 90), 1e-6); |
| 319 | try std.testing.expectApproxEqAbs(@as(f32, -3 * pi / 2.0), degreesToRadians(f32, -270), 1e-6); |
| 320 | try std.testing.expectApproxEqAbs(@as(f32, 2 * pi), degreesToRadians(f32, 360), 1e-6); |
| 321 | } |
| 322 | |
| 295 | 323 | /// Base-e exponential function on a floating point number. |
| 296 | 324 | /// Uses a dedicated hardware instruction when available. |
| 297 | 325 | /// This is the same as calling the builtin @exp |