23#ifndef SCMATH_GEOM_VECTORS_H 
   24#define SCMATH_GEOM_VECTORS_H 
   30#include <initializer_list> 
   56template<
typename T, 
size_t N>
 
   63        for (
size_t i          = 0; i < 
N; i++) {
 
 
   92    T At(
size_t index)
 const 
   94        if (index > this->arr.size()) {
 
   95            throw std::out_of_range(
"index " +
 
   96                        std::to_string(index) + 
" > " +
 
   97                        std::to_string(this->arr.size()));
 
   99        return this->arr.at(index);
 
 
  113        if (index > this->arr.size()) {
 
  114            throw std::out_of_range(
"index " +
 
  115                        std::to_string(index) + 
" > " +
 
  116                        std::to_string(this->arr.size()));
 
  119        this->arr[index] = 
value;
 
 
  133        for (
size_t i = 0; i < 
N; i++) {
 
  134            result += (this->arr[i] * this->arr[i]);
 
 
  160        for (
size_t i = 0; i < 
N; i++) {
 
  161            if (!scmp::WithinTolerance(this->arr[i], (
T) 0.0, this->epsilon)) {
 
 
  185        return scmp::WithinTolerance(this->
Magnitude(), (
T) 1.0, this->epsilon);
 
 
  250        return scmp::WithinTolerance(*
this * 
other, (
T) 0.0, this->epsilon);
 
 
  296            throw std::out_of_range(
"Cross-product can only called on Vector<T, 3>.");
 
  302            (this->arr[0] * 
other.arr[1]) - (
other.arr[0] * this->arr[1])
 
 
  317        for (
size_t i = 0; i < 
N; i++) {
 
  318            vec.arr[i] = this->arr[i] + 
other.arr[i];
 
 
  335        for (
size_t i = 0; i < 
N; i++) {
 
  336            vec.arr[i] = this->arr[i] - 
other.arr[i];
 
 
  352        for (
size_t i = 0; i < 
N; i++) {
 
  353            vec.arr[i] = this->arr[i] * 
k;
 
 
  369        for (
size_t i = 0; i < 
N; i++) {
 
  370            vec.arr[i] = this->arr[i] / 
k;
 
 
  386        for (
size_t i = 0; i < 
N; i++) {
 
 
  402        for (
size_t i = 0; i < 
N; i++) {
 
  403            if (!scmp::WithinTolerance(this->arr[i], 
other.arr[i], 
this->epsilon)) {
 
 
  419        return !(*
this == 
other);
 
 
  447    friend std::ostream &
 
  451        for (
size_t i = 0; i < 
N; i++) {
 
 
  462    static const size_t dim = 
N;
 
  464    std::array<T, N>    arr;
 
 
Vectors represent a direction and Magnitude.
Definition Vector.h:57
Vector ProjectOrthogonal(const Vector< T, N > &basis)
Project this vector perpendicularly onto some basis vector.
Definition Vector.h:276
Vector operator/(const T k) const
Scalar division.
Definition Vector.h:365
T Magnitude() const
Compute the length of the vector.
Definition Vector.h:129
Vector Cross(const Vector< T, N > &other) const
Compute the cross product of two vectors.
Definition Vector.h:292
bool IsUnitVector() const
Determine if this is a unit vector.
Definition Vector.h:183
void Set(size_t index, T value)
Set a new value for the vector.
Definition Vector.h:111
bool IsZero() const
Determine whether this is a zero vector.
Definition Vector.h:158
bool operator==(const Vector< T, N > &other) const
Vector equivalence.
Definition Vector.h:400
void SetEpsilon(T eps)
Set equivalence tolerance.
Definition Vector.h:148
Vector operator*(const T k) const
Scalar multiplication.
Definition Vector.h:348
T At(size_t index) const
Return the element At index i.
Definition Vector.h:92
Vector UnitVector() const
Obtain the unit vector for this vector.
Definition Vector.h:173
bool IsParallel(const Vector< T, N > &other) const
Determine whether two vectors are parallel.
Definition Vector.h:211
Vector operator-(const Vector< T, N > &other) const
Vector subtraction.
Definition Vector.h:331
T operator*(const Vector< T, N > &other) const
Compute the Dot product between two vectors.
Definition Vector.h:382
T Angle(const Vector< T, N > &other) const
Compute the Angle between two vectors.
Definition Vector.h:194
Vector()
Construct a unit vector of a given type and size.
Definition Vector.h:60
const T & operator[](size_t i) const
Array indexing into vector.
Definition Vector.h:436
friend std::ostream & operator<<(std::ostream &outs, const Vector< T, N > &vec)
Write a vector a stream in the form "<i, j, ...>".
Definition Vector.h:448
bool operator!=(const Vector< T, N > &other) const
Vector non-equivalence.
Definition Vector.h:417
Vector operator+(const Vector< T, N > &other) const
Vector addition.
Definition Vector.h:313
Vector ProjectParallel(const Vector< T, N > &basis) const
Project this vector onto some basis vector.
Definition Vector.h:260
Vector(std::initializer_list< T > ilst)
Construct a Vector with initial values.
Definition Vector.h:77
bool IsOrthogonal(const Vector< T, N > &other) const
Determine if two vectors are orthogonal or perpendicular to each other.
Definition Vector.h:244
Vector< float, 3 > Vector3F
Type alias for a three-dimensional float vector.
Definition Vector.h:482
Vector< double, 2 > Vector2D
Type alias for a two-dimensional double vector.
Definition Vector.h:490
Vector< double, 3 > Vector3D
Type alias for a three-dimensional double vector.
Definition Vector.h:494
Vector< double, 4 > Vector4D
Type alias for a four-dimensional double vector.
Definition Vector.h:498
Vector< float, 4 > Vector4F
Type alias for a four-dimensional float vector.
Definition Vector.h:486
Vector< float, 2 > Vector2F
Type alias for a two-dimensional float vector.
Definition Vector.h:478
Quaternionf MakeQuaternion(Vector3F axis, float angle)
Convenience Quaternion construction function.
Shimmering Clarity Math & Physics toolkit.
Definition estimation.h:31
void DefaultEpsilon(double &epsilon)
Get the default epsilon value.