pub struct Cone {
pub radius: Real,
pub half_height: Real,
}Expand description
A cone defined by radius and half-height along the Y axis. Base is at y = -half_height, apex at y = +half_height.
Fields§
§radius: RealRadius of the base.
half_height: RealHalf-height along the Y axis.
Implementations§
Source§impl Cone
impl Cone
Sourcepub fn volume_explicit(&self) -> Real
pub fn volume_explicit(&self) -> Real
Volume: πr²h/3 (h = full height = 2*half_height).
Sourcepub fn surface_area(&self) -> Real
pub fn surface_area(&self) -> Real
Surface area: base disk + lateral surface = πr² + πr*slant. slant = sqrt(r² + h²) where h = full height.
Sourcepub fn inertia_tensor_array(&self, mass: f64) -> [[f64; 3]; 3]
pub fn inertia_tensor_array(&self, mass: f64) -> [[f64; 3]; 3]
Inertia tensor as [[f64;3\];3] row-major.
Sourcepub fn ray_cast_array(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> Option<(f64, [f64; 3])>
pub fn ray_cast_array( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> Option<(f64, [f64; 3])>
Ray cast returning (t, normal) as plain arrays.
Sourcepub fn closest_point(&self, p: [f64; 3]) -> [f64; 3]
pub fn closest_point(&self, p: [f64; 3]) -> [f64; 3]
Closest point on (or inside) the cone to point p.
Sourcepub fn support(&self, direction: [f64; 3]) -> [f64; 3]
pub fn support(&self, direction: [f64; 3]) -> [f64; 3]
GJK support function using plain arrays. Returns the farthest point on the cone in the given direction.
Sourcepub fn slant_height(&self) -> f64
pub fn slant_height(&self) -> f64
Slant height of the cone: sqrt(r² + h²).
Sourcepub fn half_angle(&self) -> f64
pub fn half_angle(&self) -> f64
Half angle of the cone in radians: atan(r / h).
Sourcepub fn lateral_surface_area(&self) -> f64
pub fn lateral_surface_area(&self) -> f64
Lateral (side) surface area only: πr * slant.
Sourcepub fn contains_point(&self, p: [f64; 3]) -> bool
pub fn contains_point(&self, p: [f64; 3]) -> bool
Returns true if p is inside the cone.
Sourcepub fn signed_distance(&self, p: [f64; 3]) -> f64
pub fn signed_distance(&self, p: [f64; 3]) -> f64
Signed distance from a point to the cone surface. Negative inside, positive outside.
Sourcepub fn radius_at_y(&self, y: f64) -> f64
pub fn radius_at_y(&self, y: f64) -> f64
Radius at a given y coordinate (clamped to cone range).
Sourcepub fn truncated_cone(&self, cut_ratio: f64) -> (f64, f64, f64)
pub fn truncated_cone(&self, cut_ratio: f64) -> (f64, f64, f64)
Create a truncated cone (frustum) by cutting at a given height ratio.
cut_ratio is in [0, 1] where 0 = base, 1 = apex.
Returns (top_radius, bottom_radius, half_height).
Sourcepub fn truncated_cone_volume(&self, cut_ratio: f64) -> f64
pub fn truncated_cone_volume(&self, cut_ratio: f64) -> f64
Volume of a truncated cone (frustum).
cut_ratio is in [0, 1].
Sourcepub fn ray_cast_base_cap(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> Option<(f64, [f64; 3])>
pub fn ray_cast_base_cap( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> Option<(f64, [f64; 3])>
Ray cast against only the base cap at y = -half_height.
Sourcepub fn closest_point_on_lateral(&self, p: [f64; 3]) -> [f64; 3]
pub fn closest_point_on_lateral(&self, p: [f64; 3]) -> [f64; 3]
Closest point on the cone’s lateral surface to a point. This projects onto the side surface only (ignoring base cap).
Sourcepub fn ray_cone_analytic(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> Option<(f64, [f64; 3], bool)>
pub fn ray_cone_analytic( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> Option<(f64, [f64; 3], bool)>
Analytic ray-cone intersection (same as ray_cast but returns plain arrays).
Identical to ray_cast_array but additionally returns a boolean indicating
whether the hit is on the lateral surface (true) or base cap (false).
Sourcepub fn intersects_plane(&self, plane_normal: [f64; 3], plane_d: f64) -> bool
pub fn intersects_plane(&self, plane_normal: [f64; 3], plane_d: f64) -> bool
Cone-plane intersection.
Tests whether the cone intersects a plane defined by plane_normal (unit)
and plane_d (signed distance from origin: dot(n, x) = plane_d).
Returns true if any part of the cone (including base disk) is on or
crosses the plane.
Sourcepub fn frustum_from_cone(&self, y_bottom: f64, y_top: f64) -> (f64, f64, f64)
pub fn frustum_from_cone(&self, y_bottom: f64, y_top: f64) -> (f64, f64, f64)
Compute a frustum (truncated cone) from this cone.
Cuts the cone at heights y_bottom and y_top (in cone-local space,
where -half_height ≤ y_bottom < y_top ≤ half_height).
Returns (bottom_radius, top_radius, frustum_half_height).
Sourcepub fn sdf(&self, p: [f64; 3]) -> f64
pub fn sdf(&self, p: [f64; 3]) -> f64
Cone SDF (Signed Distance Function).
Returns negative inside the cone, positive outside.
Same as signed_distance but exposed under the SDF naming convention.
Sourcepub fn intersects_sphere(
&self,
sphere_center: [f64; 3],
sphere_radius: f64,
) -> bool
pub fn intersects_sphere( &self, sphere_center: [f64; 3], sphere_radius: f64, ) -> bool
Cone-sphere intersection test.
Returns true if the sphere (center + radius) overlaps the cone.
Uses the closest-point approach: if the closest point on the cone to
the sphere center is within sphere_radius, they intersect.
Sourcepub fn frustum_lateral_area(&self, y_bottom: f64, y_top: f64) -> f64
pub fn frustum_lateral_area(&self, y_bottom: f64, y_top: f64) -> f64
Lateral surface area of a frustum derived from this cone.
y_bottom and y_top are in cone-local Y coordinates.
Lateral area = π * (r_bottom + r_top) * slant_height_frustum.
Sourcepub fn apex_angle(&self) -> f64
pub fn apex_angle(&self) -> f64
Apex angle of the cone (full angle at the apex), in radians.
The full apex angle is 2 * atan(r / h) where h is the full height.
Sourcepub fn double_cone_params(&self) -> (f64, f64)
pub fn double_cone_params(&self) -> (f64, f64)
Create a double cone (bicone) by reflecting this cone across its base.
Returns the parameters of the upper half (this cone) and the lower half
(same dimensions, mirrored). Both have apex at ±half_height.
Sourcepub fn contains_point_double_cone(&self, p: [f64; 3]) -> bool
pub fn contains_point_double_cone(&self, p: [f64; 3]) -> bool
Returns true if p is inside the double cone (both upper and lower).
The double cone is symmetric about y=0. Upper half: apex at
+half_height, lower half: apex at -half_height.
Sourcepub fn unfold_lateral(&self, u: f64, t_slant: f64) -> [f64; 2]
pub fn unfold_lateral(&self, u: f64, t_slant: f64) -> [f64; 2]
Lateral surface unfolding: convert (u, t) to a point in the unrolled
lateral surface plane.
In the unrolled sector the slant height becomes the radial distance and
the azimuth u is scaled by sin(half_angle). Returns (x_unrolled, y_unrolled).
Sourcepub fn bounding_cone_of_points(points: &[[f64; 3]]) -> (f64, f64)
pub fn bounding_cone_of_points(points: &[[f64; 3]]) -> (f64, f64)
Bounding cone for a set of points: returns the smallest half-angle cone with its apex at the origin and axis along +Y that contains all points.
Returns (axis_half_angle_radians, axis_elevation) where the axis is
fixed to +Y.
Sourcepub fn volume_swept(&self, delta: [f64; 3]) -> f64
pub fn volume_swept(&self, delta: [f64; 3]) -> f64
Volume swept when the cone translates by vector delta.
Approximate: V_cone + base_area * |delta|.
Sourcepub fn sdf_gradient(&self, p: [f64; 3]) -> [f64; 3]
pub fn sdf_gradient(&self, p: [f64; 3]) -> [f64; 3]
Cone SDF gradient (approximate unit normal direction).
Returns the gradient of the SDF at p, suitable as the collision normal.
Sourcepub fn ray_intersection_count(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> usize
pub fn ray_intersection_count( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> usize
Ray-cone intersection count (lateral + base cap).
Returns the number of valid positive-t intersections within [0, max_toi].
Sourcepub fn solid_angle(&self) -> f64
pub fn solid_angle(&self) -> f64
Compute the solid angle subtended by the cone at the apex.
For a cone with half-angle α, the solid angle is 2π(1 - cos α).
Sourcepub fn base_rim_points(&self, n: usize) -> Vec<[f64; 3]>
pub fn base_rim_points(&self, n: usize) -> Vec<[f64; 3]>
Generate points on the base circle of the cone.
Returns n equally-spaced points on the base rim at y = -half_height.
Sourcepub fn sphere_inside_cone(&self, center: [f64; 3], sphere_radius: f64) -> bool
pub fn sphere_inside_cone(&self, center: [f64; 3], sphere_radius: f64) -> bool
Test whether a sphere at center with sphere_radius is entirely
inside the cone (a stricter test than intersects_sphere).
Sourcepub fn random_lateral_surface_point(&self, seed: u64) -> [f64; 3]
pub fn random_lateral_surface_point(&self, seed: u64) -> [f64; 3]
Sample a random point on the cone’s lateral surface using a deterministic PRNG.
Trait Implementations§
Source§impl Shape for Cone
impl Shape for Cone
Source§fn bounding_box(&self) -> Aabb
fn bounding_box(&self) -> Aabb
Source§fn support_point(&self, direction: &Vec3) -> Vec3
fn support_point(&self, direction: &Vec3) -> Vec3
Source§fn center_of_mass(&self) -> Vec3
fn center_of_mass(&self) -> Vec3
Source§fn inertia_tensor(&self, mass: Real) -> Mat3
fn inertia_tensor(&self, mass: Real) -> Mat3
Source§fn ray_cast(
&self,
ray_origin: &Vec3,
ray_direction: &Vec3,
max_toi: Real,
) -> Option<RayHit>
fn ray_cast( &self, ray_origin: &Vec3, ray_direction: &Vec3, max_toi: Real, ) -> Option<RayHit>
max_toi.Source§fn mass_properties(&self, density: Real) -> MassProperties
fn mass_properties(&self, density: Real) -> MassProperties
Auto Trait Implementations§
impl Freeze for Cone
impl RefUnwindSafe for Cone
impl Send for Cone
impl Sync for Cone
impl Unpin for Cone
impl UnsafeUnpin for Cone
impl UnwindSafe for Cone
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.