Newer
Older
Import / research / units / ProjectiveGeometry.hpp


#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);