Add TPlane.
This commit is contained in:
parent
626147b82c
commit
b0dbfc8fcc
@ -15,8 +15,184 @@ namespace Phanes::Core::Math {
|
|||||||
public:
|
public:
|
||||||
TVector3<T> normal;
|
TVector3<T> normal;
|
||||||
T d;
|
T d;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy constructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(const TPlane<T>& plane) : normal(plane.normal), d(plane.d) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move constructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(TPlane<T>&& plane) :
|
||||||
|
normal(std::move(plane.normal)),
|
||||||
|
d(std::move(plane.d))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct plane from normal and d
|
||||||
|
*
|
||||||
|
* @param(normal) Normal of plane
|
||||||
|
* @param(d) Scalar component
|
||||||
|
*
|
||||||
|
* @note Normal is NOT normalized, make sure to normalize [PARAM]normal, or use [FUNC]CreateFromVector. Otherwise unexpected results may occur using the plane.
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(const TVector3<T>& normal, T d) :
|
||||||
|
normal(normal),
|
||||||
|
d(d)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct plane from normal and base point.
|
||||||
|
*
|
||||||
|
* @param(normal) Normal of plane
|
||||||
|
* @param(base) Base point
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(const TVector3<T>& normal, const TVector3<T>& base) :
|
||||||
|
normal(normal)
|
||||||
|
{
|
||||||
|
this->d = DotP(this->normal, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct plane from coefficients
|
||||||
|
*
|
||||||
|
* @param(x) X coefficient
|
||||||
|
* @param(y) Y coefficient
|
||||||
|
* @param(z) Z coefficient
|
||||||
|
* @param(d) D coefficient
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(T x, T y, T z, T d) :
|
||||||
|
d(d)
|
||||||
|
{
|
||||||
|
this->normal = TVector3<T>(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct plane from 3 points
|
||||||
|
*
|
||||||
|
* @param(p1) Point one
|
||||||
|
* @param(p2) Point two
|
||||||
|
* @param(p3) Point three
|
||||||
|
*/
|
||||||
|
|
||||||
|
TPlane(const TVector3<T>& p1, const TVector3<T>& p2, const TVector3<T>& p3)
|
||||||
|
{
|
||||||
|
this->normal = Normalize(CrossP(p1, p2));
|
||||||
|
this->d = DotP(this->normal, p3);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get dot product between two planes
|
||||||
|
*
|
||||||
|
* @param(pl1) Plane one
|
||||||
|
* @param(pl2) Plane two
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
FORCEINLINE T PlaneDotP(const TPlane<T>& pl1, const TPlane<T>& pl2)
|
||||||
|
{
|
||||||
|
return DotP(pl1.normal, pl2.normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get angle between two planes
|
||||||
|
*
|
||||||
|
* @param(pl1) Plane one
|
||||||
|
* @param(pl2) Plane two
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
FORCEINLINE T PlaneAngle(const TPlane<T>& pl1, const TPlane<T>& pl2)
|
||||||
|
{
|
||||||
|
return Angle(pl1.normal, pl2.normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cosine of angle between two planes
|
||||||
|
*
|
||||||
|
* @param(pl1) Plane one
|
||||||
|
* @param(pl2) Plane two
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
FORCEINLINE T PlaneCosAngle(const TPlane<T>& pl1, const TPlane<T>& pl2)
|
||||||
|
{
|
||||||
|
return CosineAngle(pl1.normal, pl2.normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flip plane.
|
||||||
|
*
|
||||||
|
* @param(pl1) Plane
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
TPlane<T> FlipV(const TPlane<T>& pl1)
|
||||||
|
{
|
||||||
|
pl1.normal = -pl1.normal;
|
||||||
|
pl1.d = -pl1.d;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get flipped plane.
|
||||||
|
*
|
||||||
|
* @param(pl1) Plane
|
||||||
|
*
|
||||||
|
* @return Flipped plane
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
TPlane<T> Flip(const TPlane<T>& pl1)
|
||||||
|
{
|
||||||
|
return TPlane<T>(-pl1.normal, -pl1.d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform plane with Transform
|
||||||
|
*
|
||||||
|
* @param(pl) Plane
|
||||||
|
* @param(tr) Transform
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
FORCEINLINE TPlane<T> TransformV(TPlane<T>& pl, const TTransform<T>& tr)
|
||||||
|
{
|
||||||
|
// TODO: Do with operator*
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform plane with Transform
|
||||||
|
*
|
||||||
|
* @param(pl) Plane
|
||||||
|
* @param(tr) Transform
|
||||||
|
*
|
||||||
|
* @return Transformed plane.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
FORCEINLINE TPlane<T> Transform(const TPlane<T>& pl, const TTransform<T>& tr)
|
||||||
|
{
|
||||||
|
// TODO: Do with operator*
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Projects vector onto plane
|
* Projects vector onto plane
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user