#include "pch.h"
//////////////////////////////////////////////////////////////////////////////
//
// Bounds2
//
//////////////////////////////////////////////////////////////////////////////
Bounds2 g_bounds2Empty(Rect(0, 0, 0, 0));
const Bounds2& Bounds2::GetEmpty()
{
return g_bounds2Empty;
}
Bounds2::Bounds2(const Rect& rect) :
m_rect(rect)
{
}
Bounds2::Bounds2(const Bounds2& bounds) :
m_rect(bounds.m_rect)
{
}
void Bounds2::SetRect(const Rect& rect)
{
m_rect = rect;
}
Bounds2 Bounds2::Transform(const Matrix2& mat) const
{
Point vec1 = mat.Transform(m_rect.Min());
Point vec2 = mat.Transform(m_rect.Max());
return
Bounds2(
Rect(
min(vec1.X(), vec2.X()),
min(vec1.Y(), vec2.Y()),
max(vec1.X(), vec2.X()),
max(vec1.Y(), vec2.Y())
)
);
}
Bounds2 Union(const Bounds2& bounds1, const Bounds2& bounds2)
{
return
Bounds2(
Rect(
min(bounds1.GetRect().XMin(), bounds2.GetRect().XMin()),
min(bounds1.GetRect().YMin(), bounds2.GetRect().YMin()),
max(bounds1.GetRect().XMax(), bounds2.GetRect().XMax()),
max(bounds1.GetRect().YMax(), bounds2.GetRect().YMax())
)
);
}
Bounds2 Intersect(const Bounds2& bounds1, const Bounds2& bounds2)
{
return
Bounds2(
Rect(
max(bounds1.GetRect().XMin(), bounds2.GetRect().XMin()),
max(bounds1.GetRect().YMin(), bounds2.GetRect().YMin()),
min(bounds1.GetRect().XMax(), bounds2.GetRect().XMax()),
min(bounds1.GetRect().YMax(), bounds2.GetRect().YMax())
)
);
}
//////////////////////////////////////////////////////////////////////////////
//
// Bounds
//
//////////////////////////////////////////////////////////////////////////////
/*
Bounds g_boundsEmpty(Vector::GetZero(), Vector::GetZero());
const Bounds& Bounds::GetEmpty()
{
return g_boundsEmpty;
}
Bounds::Bounds(const Vector& vecMin, const Vector& vecMax) :
m_vecMin(vecMin),
m_vecMax(vecMax)
{
CalcDiagonal();
}
Bounds::Bounds(const Bounds& bounds) :
m_vecMin(bounds.m_vecMin),
m_vecMax(bounds.m_vecMax)
{
CalcDiagonal();
}
void Bounds::CalcDiagonal()
{
m_diagonal = (m_vecMax - m_vecMin).Length();
}
void Bounds::SetVectors(const Vector& vecMin, const Vector& vecMax)
{
m_vecMin = vecMin;
m_vecMax = vecMax;
CalcDiagonal();
}
Bounds Bounds::Transform(const Matrix& mat)
{
Vertex vec[8] = {
mat.Transform(Vertex(m_vecMin.X(), m_vecMin.Y(), m_vecMin.Z())),
mat.Transform(Vertex(m_vecMin.X(), m_vecMin.Y(), m_vecMax.Z())),
mat.Transform(Vertex(m_vecMin.X(), m_vecMax.Y(), m_vecMin.Z())),
mat.Transform(Vertex(m_vecMin.X(), m_vecMax.Y(), m_vecMax.Z())),
mat.Transform(Vertex(m_vecMax.X(), m_vecMin.Y(), m_vecMin.Z())),
mat.Transform(Vertex(m_vecMax.X(), m_vecMin.Y(), m_vecMax.Z())),
mat.Transform(Vertex(m_vecMax.X(), m_vecMax.Y(), m_vecMin.Z())),
mat.Transform(Vertex(m_vecMax.X(), m_vecMax.Y(), m_vecMax.Z()))
};
Vector vecMin(vec[0].X(), vec[0].Y(), vec[0].Z());
Vector vecMax(vec[0].X(), vec[0].Y(), vec[0].Z());
for(int index = 1; index < 8; index++) {
if (vec[index].X() < vecMin.X()) vecMin.SetX(vec[index].X());
if (vec[index].X() > vecMax.X()) vecMax.SetX(vec[index].X());
if (vec[index].Y() < vecMin.Y()) vecMin.SetY(vec[index].Y());
if (vec[index].Y() > vecMax.Y()) vecMax.SetY(vec[index].Y());
if (vec[index].Z() < vecMin.Z()) vecMin.SetZ(vec[index].Z());
if (vec[index].Z() > vecMax.Z()) vecMax.SetZ(vec[index].Z());
}
return Bounds(vecMin, vecMax);
}
Bounds Union(const Bounds& bounds1, const Bounds& bounds2)
{
return
Bounds(
Vector(
min(bounds1.GetMin().X(), bounds2.GetMin().X()),
min(bounds1.GetMin().Y(), bounds2.GetMin().Y()),
min(bounds1.GetMin().Z(), bounds2.GetMin().Z())
),
Vector(
max(bounds1.GetMax().X(), bounds2.GetMax().X()),
max(bounds1.GetMax().Y(), bounds2.GetMax().Y()),
max(bounds1.GetMax().Z(), bounds2.GetMax().Z())
)
);
}
*/