From a1fcd1cb733ef3d2b180a863540ffeb7100d364f Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sat, 3 Jun 2023 03:55:36 -0400 Subject: [PATCH] Add OPoint::lerp --- src/base/interpolation.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/base/interpolation.rs b/src/base/interpolation.rs index 81b1a374..056bea1c 100644 --- a/src/base/interpolation.rs +++ b/src/base/interpolation.rs @@ -1,6 +1,7 @@ use crate::storage::Storage; use crate::{ - Allocator, DefaultAllocator, Dim, OVector, One, RealField, Scalar, Unit, Vector, Zero, + Allocator, DefaultAllocator, Dim, DimName, OPoint, OVector, One, RealField, Scalar, Unit, + Vector, Zero, }; use simba::scalar::{ClosedAdd, ClosedMul, ClosedSub}; @@ -58,6 +59,30 @@ impl OPoint +where + DefaultAllocator: Allocator, +{ + /// Returns `self * (1.0 - t) + rhs.coords * t`, i.e., the linear blend of the points x and y using the scalar value a. + /// + /// The value for a is not restricted to the range `[0, 1]`. + /// + /// # Examples: + /// + /// ``` + /// # use nalgebra::Point3; + /// let x = Point3::new(1.0, 2.0, 3.0); + /// let y = Point3::new(10.0, 20.0, 30.0); + /// assert_eq!(x.lerp(&y, 0.1), Point3::new(1.9, 3.8, 5.7)); + /// ``` + #[must_use] + pub fn lerp(&self, rhs: &OPoint, t: T) -> OPoint { + OPoint { + coords: self.coords.lerp(&rhs.coords, t), + } + } +} + /// # Interpolation between two unit vectors impl> Unit> { /// Computes the spherical linear interpolation between two unit vectors.