Implement AABB::CornerPoint/ExtremePoint/PointOnEdge/FaceCenterPoint/FacePoint

This commit is contained in:
2024-02-02 15:59:05 -05:00
parent 9a5f12e505
commit cb5e6b4f99
2 changed files with 159 additions and 60 deletions

View File

@@ -44,71 +44,32 @@ namespace J3ML::Geometry
static int NumFaces() { return 6; }
static int NumEdges() { return 12;}
static int NumVertices() { return 8;}
static AABB FromCenterAndSize(const Vector3& center, const Vector3& size)
{
Vector3 halfSize = size * 0.5f;
return {center - halfSize, center + halfSize};
}
float MinX() const { return minPoint.x; }
float MinY() const { return minPoint.y; }
float MinZ() const { return minPoint.z; }
float MaxX() const { return maxPoint.x; }
float MaxY() const { return maxPoint.y; }
float MaxZ() const { return maxPoint.z; }
static AABB FromCenterAndSize(const Vector3& center, const Vector3& size);
float MinX() const;
float MinY() const;
float MinZ() const;
float MaxX() const;
float MaxY() const;
float MaxZ() const;
/// Returns the smallest sphere that contains this AABB.
/// This function computes the minimal volume sphere that contains all the points inside this AABB
Sphere MinimalEnclosingSphere() const
{
return Sphere(Centroid(), Size().Length()*0.5f);
}
Vector3 HalfSize() const {
return this->Size()/2.f;
}
// Returns the largest sphere that can fit inside this AABB
// This function computes the largest sphere that can fit inside this AABB.
Sphere MaximalContainedSphere() const
{
Vector3 halfSize = HalfSize();
return Sphere(Centroid(), std::min(halfSize.x, std::min(halfSize.y, halfSize.z)));
}
bool IsFinite() const
{
return minPoint.IsFinite() && maxPoint.IsFinite();
}
Vector3 Centroid() const
{
return (minPoint+maxPoint) * 0.5f;
}
Vector3 Size() const
{
return this->maxPoint - this->minPoint;
}
Sphere MinimalEnclosingSphere() const;
Vector3 HalfSize() const;
/// Returns the largest sphere that can fit inside this AABB
/// This function computes the largest sphere that can fit inside this AABB.
Sphere MaximalContainedSphere() const;
bool IsFinite() const;
Vector3 Centroid() const;
Vector3 Size() const;
// Quickly returns an arbitrary point inside this AABB
Vector3 AnyPointFast() const;
Vector3 PointInside(float x, float y, float z) const
{
Vector3 d = maxPoint - minPoint;
return minPoint + d.Mul({x, y, z});
}
Vector3 PointInside(float x, float y, float z) const;
// Returns an edge of this AABB
LineSegment Edge(int edgeIndex) const
{
switch(edgeIndex)
{
default:
case 0: return LineSegment(minPoint, {minPoint.x, minPoint.y, maxPoint.z});
}
}
Vector3 CornerPoint(int cornerIndex);
LineSegment Edge(int edgeIndex) const;
Vector3 CornerPoint(int cornerIndex) const;
Vector3 ExtremePoint(const Vector3& direction) const;
Vector3 ExtremePoint(const Vector3& direction, float projectionDistance);
Vector3 ExtremePoint(const Vector3& direction, float &projectionDistance);
Vector3 PointOnEdge(int edgeIndex, float u) const;
Vector3 FaceCenterPoint(int faceIndex) const;
Vector3 FacePoint(int faceIndex, float u, float v) const;