Struct libreda_pnr::db::Vector
pub struct Vector<T> {
pub x: T,
pub y: T,
}
Expand description
Vector
defines a two dimensional vector with x and y components in the Euclidean plane.
Fields§
§x: T
x
coordinate.
y: T
y
coordinate.
Implementations§
§impl<T> Vector<T>where
T: Zero + PartialOrd<T> + Mul<T, Output = T> + Sub<T, Output = T> + Copy,
impl<T> Vector<T>where T: Zero + PartialOrd<T> + Mul<T, Output = T> + Sub<T, Output = T> + Copy,
pub fn orientation_of(&self, other: Vector<T>) -> Orientation
pub fn orientation_of(&self, other: Vector<T>) -> Orientation
Check if other
is oriented clockwise or counter-clockwise respective to self
.
Examples
use iron_shapes::vector::Vector;
use iron_shapes::types::Orientation;
let a = Vector::new(1, 0);
let b = Vector::new(1, 1);
let c = Vector::new(1, -1);
let d = Vector::new(2, 0);
assert_eq!(a.orientation_of(b), Orientation::CounterClockWise);
assert_eq!(a.orientation_of(c), Orientation::ClockWise);
assert_eq!(a.orientation_of(d), Orientation::Straight);
§impl<T> Vector<T>where
T: Mul<T, Output = T> + Add<T, Output = T> + Copy,
impl<T> Vector<T>where T: Mul<T, Output = T> + Add<T, Output = T> + Copy,
pub fn norm2_squared(&self) -> T
pub fn norm2_squared(&self) -> T
Get squared 2-norm of vector.
Examples
use iron_shapes::vector::Vector;
let a = Vector::new(2, 3);
assert_eq!(a.norm2_squared(), 2*2+3*3);
§impl<T> Vector<T>where
T: Mul<T, Output = T> + Sub<T, Output = T> + Copy,
impl<T> Vector<T>where T: Mul<T, Output = T> + Sub<T, Output = T> + Copy,
pub fn cross_prod(&self, other: Vector<T>) -> T
pub fn cross_prod(&self, other: Vector<T>) -> T
Calculate cross product.
Examples
use iron_shapes::vector::Vector;
let a = Vector::new(2, 0);
let b = Vector::new(0, 2);
assert_eq!(a.cross_prod(b), 4);
assert_eq!(b.cross_prod(a), -4);
§impl<T> Vector<T>where
T: CoordinateType + NumCast,
impl<T> Vector<T>where T: CoordinateType + NumCast,
pub fn cast_to_float<F>(&self) -> Vector<F>where
F: CoordinateType + Float + NumCast,
pub fn cast_to_float<F>(&self) -> Vector<F>where F: CoordinateType + Float + NumCast,
Convert vector into a vector with floating point data type.
§impl<T> Vector<T>where
T: Float<Output = T, Output = T> + Mul<T> + Add<T> + Copy,
impl<T> Vector<T>where T: Float<Output = T, Output = T> + Mul<T> + Add<T> + Copy,
pub fn norm2(&self) -> T
pub fn norm2(&self) -> T
Get 2-norm of vector (length of vector).
Examples
use iron_shapes::vector::Vector;
let a = Vector::new(2.0, 3.0);
let norm2 = a.norm2();
let norm2_sq = norm2 * norm2;
let expected = a.norm2_squared();
assert!(norm2_sq < expected + 1e-12);
assert!(norm2_sq > expected - 1e-12);
pub fn normalized(&self) -> Vector<T>
pub fn normalized(&self) -> Vector<T>
§impl<T> Vector<T>where
T: Copy + NumCast,
impl<T> Vector<T>where T: Copy + NumCast,
pub fn length<F>(&self) -> Fwhere
F: Float,
pub fn length<F>(&self) -> Fwhere F: Float,
Calculate length of vector.
Similar to Vector::norm2
but does potentially return another data type for the length.
Examples
use iron_shapes::vector::Vector;
let a = Vector::new(2.0, 3.0);
let length: f64 = a.length();
let norm2_sq = length * length;
let expected = a.norm2_squared();
assert!(norm2_sq < expected + 1e-12);
assert!(norm2_sq > expected - 1e-12);
Trait Implementations§
§impl<T> AddAssign<Vector<T>> for Vector<T>where
T: AddAssign<T>,
impl<T> AddAssign<Vector<T>> for Vector<T>where T: AddAssign<T>,
§fn add_assign(&mut self, rhs: Vector<T>)
fn add_assign(&mut self, rhs: Vector<T>)
+=
operation. Read more§impl<'de, T> Deserialize<'de> for Vector<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Vector<T>where T: Deserialize<'de>,
§fn deserialize<__D>(
__deserializer: __D
) -> Result<Vector<T>, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>( __deserializer: __D ) -> Result<Vector<T>, <__D as Deserializer<'de>>::Error>where __D: Deserializer<'de>,
§impl<T, D> DivAssign<D> for Vector<T>where
T: Copy + DivAssign<D>,
D: Copy,
impl<T, D> DivAssign<D> for Vector<T>where T: Copy + DivAssign<D>, D: Copy,
Assigning scalar division.
§fn div_assign(&mut self, rhs: D)
fn div_assign(&mut self, rhs: D)
/=
operation. Read more§impl<T> MapPointwise<T> for Vector<T>where
T: CoordinateType,
impl<T> MapPointwise<T> for Vector<T>where T: CoordinateType,
§impl<T, M> Mul<M> for Vector<T>where
T: CoordinateType<Output = T> + Mul<M>,
M: Copy,
impl<T, M> Mul<M> for Vector<T>where T: CoordinateType<Output = T> + Mul<M>, M: Copy,
Scalar multiplication.
§impl<T, M> MulAssign<M> for Vector<T>where
T: Copy + MulAssign<M>,
M: Copy,
impl<T, M> MulAssign<M> for Vector<T>where T: Copy + MulAssign<M>, M: Copy,
In-place scalar multiplication.
§fn mul_assign(&mut self, rhs: M)
fn mul_assign(&mut self, rhs: M)
*=
operation. Read more§impl<T> Serialize for Vector<T>where
T: Serialize,
impl<T> Serialize for Vector<T>where T: Serialize,
§fn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>( &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where __S: Serializer,
§impl<T> SubAssign<Vector<T>> for Vector<T>where
T: SubAssign<T>,
impl<T> SubAssign<Vector<T>> for Vector<T>where T: SubAssign<T>,
§fn sub_assign(&mut self, rhs: Vector<T>)
fn sub_assign(&mut self, rhs: Vector<T>)
-=
operation. Read more§impl<T> Sum<Vector<T>> for Vector<T>where
T: Zero<Output = T> + Add<T>,
impl<T> Sum<Vector<T>> for Vector<T>where T: Zero<Output = T> + Add<T>,
Compute the sum of all vectors in the iterator. If the iterator is empty, (0, 0) is returned.
§impl<T, Dst> TryCastCoord<T, Dst> for Vector<T>where
T: Copy + NumCast,
Dst: Copy + NumCast,
impl<T, Dst> TryCastCoord<T, Dst> for Vector<T>where T: Copy + NumCast, Dst: Copy + NumCast,
§fn try_cast(&self) -> Option<<Vector<T> as TryCastCoord<T, Dst>>::Output>
fn try_cast(&self) -> Option<<Vector<T> as TryCastCoord<T, Dst>>::Output>
Try to cast to vector of target data type.
Conversion from float to int can fail and will return None
.
Float values like infinity or non-a-number
have no integer representation.
Examples
use iron_shapes::vector::Vector;
use iron_shapes::traits::TryCastCoord;
let v_int = Vector::new(1,2);
let maybe_v_float: Option<Vector<f64>> = v_int.try_cast();
assert_eq!(maybe_v_float, Some(Vector::new(1.0, 2.0)));
// Conversion from float to int can fail.
let w_float = Vector::new(42.0, 0. / 0.);
let maybe_w_int: Option<Vector<i32>> = w_float.try_cast();
assert_eq!(maybe_w_int, None);
§impl<T> Zero for Vector<T>where
T: Zero,
impl<T> Zero for Vector<T>where T: Zero,
§fn zero() -> Vector<T>
fn zero() -> Vector<T>
Get zero-vector.
Examples
use iron_shapes::vector::{Vector, Zero};
let a = Vector::zero();
let b = Vector::new(0, 0);
assert_eq!(a, b);