nphysics3d/volumetric/
volumetric_cylinder.rs1use num::Zero;
2
3use crate::math::{AngularInertia, Point, DIM};
4use na::{self, RealField};
5
6#[inline]
8pub fn cylinder_volume<N: RealField + Copy>(half_height: N, radius: N) -> N {
9    if DIM == 2 {
10        half_height * radius * na::convert(4.0f64)
11    } else {
12        half_height * radius * radius * N::pi() * na::convert(2.0f64)
13    }
14}
15
16#[inline]
18pub fn cylinder_area<N: RealField + Copy>(half_height: N, radius: N) -> N {
19    if DIM == 2 {
20        (half_height + radius) * na::convert(2.0f64)
21    } else {
22        let _pi = N::pi();
23        let basis = radius * radius * _pi;
24        let side = _pi * radius * (half_height + half_height) * na::convert(2.0f64);
25
26        side + basis + basis
27    }
28}
29
30#[inline]
32pub fn cylinder_center_of_mass<N: RealField + Copy>() -> Point<N> {
33    Point::origin()
34}
35
36#[inline]
38pub fn cylinder_unit_angular_inertia<N: RealField + Copy>(half_height: N, radius: N) -> AngularInertia<N> {
39    if DIM == 2 {
40        let _2: N = na::convert(2.0f64);
42        let _i12: N = na::convert(1.0f64 / 12.0);
43        let w = _i12 * _2 * _2;
44        let ix = w * half_height * half_height;
45        let iy = w * radius * radius;
46
47        let mut res = AngularInertia::zero();
48
49        res[(0, 0)] = ix + iy;
50
51        res
52    } else {
53        let sq_radius = radius * radius;
54        let sq_height = half_height * half_height * na::convert(4.0f64);
55        let off_principal = (sq_radius * na::convert(3.0f64) + sq_height) / na::convert(12.0f64);
56
57        let mut res = AngularInertia::zero();
58
59        res[(0, 0)] = off_principal.clone();
60        res[(1, 1)] = sq_radius / na::convert(2.0f64);
61        res[(2, 2)] = off_principal;
62
63        res
64    }
65}
66
67