#pragma once
// class Scalar;
// class Vector;
// class Bivector;
// class Antivector;
// class Antiscalar;
class Scalar
{
double mValue;
};
template <size_t N1>
class Vector // 1D direction
{
double mValue[N1];
};
template <size_t N1, size_t N2>
class BiVector // 2D oriented area
{
// 2 directions + magnitude
Scalar mag;
Vector dir[2];
//double mValue[N1][N2];
};
template <size_t N1, size_t N2, size_t N3>
class TriVector // 3D oriented volume
{
double mValue[N1][N2][N3];
};
template <size_t Dimensions>
class AntiVector
{
double mValue[Dimensions];
};
// Left/Right, Interior/Exterior, Normal/Anti Products
Vector WedgeProduct(const Scalar& a, const Scalar& b);
Vector AntiWedgeProduct(const Scalar& a, const Scalar& b);
Vector WedgeDotProduct(const Scalar& a, const Scalar& b);
Vector AntiWedgeDotProduct(const Scalar& a, const Scalar& b);
Vector LeftInteriorProduct(const Scalar& a, const Scalar& b);
Vector RightInteriorProduct(const Scalar& a, const Scalar& b);
Vector LeftInteriorAntiProduct(const Scalar& a, const Scalar& b);
Vector RightInteriorAntiProduct(const Scalar& a, const Scalar& b);
BiVector WedgeProduct(const Vector& a, const Vector& b);
TriVector WedgeProduct(const Vector& a, const Vector& b, const Vector& c);
Vector AntiWedgeProduct(const Scalar& a, const Scalar& b);
Vector WedgeDotProduct(const Scalar& a, const Scalar& b);
Vector AntiWedgeDotProduct(const Scalar& a, const Scalar& b);
Vector LeftInteriorProduct(const Scalar& a, const Scalar& b);
Vector RightInteriorProduct(const Scalar& a, const Scalar& b);
Vector LeftInteriorAntiProduct(const Scalar& a, const Scalar& b);
Vector RightInteriorAntiProduct(const Scalar& a, const Scalar& b);
// Vector Scalar::operator^(Scalar);