pub struct Torus {
pub major_radius: Real,
pub minor_radius: Real,
}Expand description
A torus defined by major radius R (center to tube center) and minor radius r (tube radius).
The torus lies in the XZ plane (Y is the axis of symmetry).
Fields§
§major_radius: RealMajor radius: distance from the center of the torus to the center of the tube.
minor_radius: RealMinor radius: radius of the tube.
Implementations§
Source§impl Torus
impl Torus
Sourcepub fn new(major_radius: Real, minor_radius: Real) -> Self
pub fn new(major_radius: Real, minor_radius: Real) -> Self
Create a new torus with the given major and minor radii.
Sourcepub fn surface_area(&self) -> Real
pub fn surface_area(&self) -> Real
Surface area = 4π²Rr
Sourcepub fn bounding_box_extents(&self) -> Vec3
pub fn bounding_box_extents(&self) -> Vec3
Approximate bounding box half-extents: outer radius = R+r, height = r.
Returns half-extents as [R+r, r, R+r] (torus in XZ plane, Y is up).
Sourcepub fn inertia_tensor_array(&self, mass: Real) -> [[f64; 3]; 3]
pub fn inertia_tensor_array(&self, mass: Real) -> [[f64; 3]; 3]
Inertia tensor for a solid torus of given mass.
Axis of symmetry is Y. Standard formulas: I_y = m*(R² + (3/4)r²) (but commonly written as m(3R²+4r²)/4 – equivalent) I_xz = m*((5/8)r² + R²/2) (= m(5r²+4R²)/8)
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])>
Cast a ray against the torus using an iterative quartic solver approach.
The torus implicit equation (centered at origin, axis = Y): (x²+y²+z² + R²−r²)² − 4R²(x²+z²) = 0
Substituting P+t*D gives a quartic in t which is solved by Ferrari’s method.
Returns Some((t, normal)) or None.
Sourcepub fn closest_point(&self, p: [f64; 3]) -> [f64; 3]
pub fn closest_point(&self, p: [f64; 3]) -> [f64; 3]
Closest point on the torus surface to point p.
Projects p onto the nearest point on the ring circle (in XZ), then
moves from that circle point toward p (or outward if p is inside tube)
by the minor radius.
Sourcepub fn contains_point(&self, p: [f64; 3]) -> bool
pub fn contains_point(&self, p: [f64; 3]) -> bool
Returns true if point p is inside (or on the surface of) the torus tube.
Sourcepub fn sample_surface(&self, u: f64, v: f64) -> [f64; 3]
pub fn sample_surface(&self, u: f64, v: f64) -> [f64; 3]
Parametric surface sample: u ∈ [0,2π), v ∈ [0,2π).
Returns a point (x,y,z) on the torus surface.
x = (R + rcos(v)) * cos(u)
y = r * sin(v)
z = (R + rcos(v)) * sin(u)
Sourcepub fn sdf(&self, p: [f64; 3]) -> f64
pub fn sdf(&self, p: [f64; 3]) -> f64
Torus SDF (signed distance to torus surface).
Negative inside the tube, positive outside.
Sourcepub fn ray_torus_analytic(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> Option<(f64, [f64; 3])>
pub fn ray_torus_analytic( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> Option<(f64, [f64; 3])>
Torus-ray analytic intersection (same as ray_cast_array but explicit name).
Sourcepub fn support_array(&self, direction: [f64; 3]) -> [f64; 3]
pub fn support_array(&self, direction: [f64; 3]) -> [f64; 3]
Torus support function (plain array).
Sourcepub fn surface_parameters(&self, p: [f64; 3]) -> (f64, f64)
pub fn surface_parameters(&self, p: [f64; 3]) -> (f64, f64)
Surface parameterization: returns the (u, v) angles for the point on
the torus surface closest to p.
u is the angle around the major circle (XZ plane), v is the angle
around the tube (in the plane through the Y axis and the ring point).
Sourcepub fn random_surface_points(&self, n: usize, seed: u64) -> Vec<[f64; 3]>
pub fn random_surface_points(&self, n: usize, seed: u64) -> Vec<[f64; 3]>
Generate n random points uniformly distributed on the torus surface.
Uses a deterministic xorshift64 PRNG seeded with seed.
Sampling: uniform in u and v, weighted by area element (R + r cos v).
Sourcepub fn inertia_raw(&self, mass: f64) -> [[f64; 3]; 3]
pub fn inertia_raw(&self, mass: f64) -> [[f64; 3]; 3]
Approximate solid torus inertia tensor from inertia_tensor_array.
Sourcepub fn outer_radius(&self) -> f64
pub fn outer_radius(&self) -> f64
Outer radius of the torus (major + minor).
Sourcepub fn inner_radius(&self) -> f64
pub fn inner_radius(&self) -> f64
Inner radius of the torus (major - minor, clamped to 0).
Sourcepub fn uv_map(&self, p: [f64; 3]) -> [f64; 2]
pub fn uv_map(&self, p: [f64; 3]) -> [f64; 2]
UV mapping for the torus surface.
Maps a surface point p to texture coordinates (u, v) in [0, 1)².
u corresponds to the major (longitudinal) angle and v to the minor
(latitudinal) angle, both normalised to the range [0, 1).
Sourcepub fn geodesic_distance_flat(&self, a: [f64; 3], b: [f64; 3]) -> f64
pub fn geodesic_distance_flat(&self, a: [f64; 3], b: [f64; 3]) -> f64
Approximate geodesic distance between two surface points a and b
via the flat-torus metric.
The flat-torus metric: d = sqrt((R Δθ)² + (r Δφ)²) where Δθ and
Δφ are the wrapped angular differences on the major and minor circles.
Sourcepub fn area_element_factor(&self, v: f64) -> f64
pub fn area_element_factor(&self, v: f64) -> f64
Area element at angle v on the tube: (R + r cos v) r dv du.
Returns the area-weighted factor R + r*cos(v) for the given tube angle v.
Sourcepub fn surface_area_numeric(&self, n_steps: usize) -> f64
pub fn surface_area_numeric(&self, n_steps: usize) -> f64
Approximate surface area by numerical integration (cross-check of closed form).
Uses n_steps Gauss-Legendre-like sampling along each angular dimension.
Sourcepub fn tube_cross_section(&self, u: f64, n: usize) -> Vec<[f64; 3]>
pub fn tube_cross_section(&self, u: f64, n: usize) -> Vec<[f64; 3]>
Tube cross-section: return a list of n points on the tube circle at angle u.
The circle lies in the plane through the ring point at angle u and the Y axis.
Sourcepub fn torus_knot_path(&self, p: i32, q: i32, n_pts: usize) -> Vec<[f64; 3]>
pub fn torus_knot_path(&self, p: i32, q: i32, n_pts: usize) -> Vec<[f64; 3]>
Generate a torus knot path with winding numbers (p, q).
A (p, q)-torus knot winds around the major circle p times while
winding around the tube q times. Returns n_pts sampled points.
Sourcepub fn winding_number_major(&self, curve: &[[f64; 3]]) -> i32
pub fn winding_number_major(&self, curve: &[[f64; 3]]) -> i32
Winding number of a closed curve projected onto the torus major circle.
Counts how many times the sequence of (u, _) angles (extracted from the
points via surface_parameters) winds around the major circle.
Returns an integer winding count (positive = counter-clockwise).
Sourcepub fn tangent_u(&self, u: f64, v: f64) -> [f64; 3]
pub fn tangent_u(&self, u: f64, v: f64) -> [f64; 3]
Parametric tangent vector on the torus surface in the u direction.
dP/du at (u, v): partial derivative with respect to the major angle.
Sourcepub fn tangent_v(&self, u: f64, v: f64) -> [f64; 3]
pub fn tangent_v(&self, u: f64, v: f64) -> [f64; 3]
Parametric tangent vector on the torus surface in the v direction.
dP/dv at (u, v): partial derivative with respect to the tube angle.
Sourcepub fn normal_from_tangents(&self, u: f64, v: f64) -> [f64; 3]
pub fn normal_from_tangents(&self, u: f64, v: f64) -> [f64; 3]
Surface normal via cross product of tangents dP/du × dP/dv.
Should agree with torus_normal up to sign conventions.
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
Test whether a ray intersects the torus and return the hit count.
A finite ray with origin o, direction d, and parameter max_toi can
intersect the torus at 0, 2, or 4 points. This counts all positive-t
intersections within [0, max_toi].
Sourcepub fn intersects_aabb(&self, aabb_min: [f64; 3], aabb_max: [f64; 3]) -> bool
pub fn intersects_aabb(&self, aabb_min: [f64; 3], aabb_max: [f64; 3]) -> bool
Approximate torus-AABB overlap test via SDF.
Returns true if the AABB [min, max] overlaps the torus.
Uses the 8 corners of the AABB as sample points.
Sourcepub fn aspect_ratio(&self) -> f64
pub fn aspect_ratio(&self) -> f64
Aspect ratio of the torus: major_radius / minor_radius.
Returns the ratio R/r. A value close to 1 means the torus is nearly self-intersecting; large values mean a thin tube.
Trait Implementations§
Source§impl Shape for Torus
impl Shape for Torus
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 mass_properties(&self, density: Real) -> MassProperties
fn mass_properties(&self, density: Real) -> MassProperties
Auto Trait Implementations§
impl Freeze for Torus
impl RefUnwindSafe for Torus
impl Send for Torus
impl Sync for Torus
impl Unpin for Torus
impl UnsafeUnpin for Torus
impl UnwindSafe for Torus
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.