Files
lime/legacy/project/include/nme/Extent.h
2014-11-12 22:20:57 -08:00

172 lines
3.2 KiB
C++

#ifndef NME_EXTENT_H
#define NME_EXTENT_H
namespace nme
{
template<typename T_>
struct Extent2D
{
T_ minX,maxX;
T_ minY,maxY;
bool validX,validY;
Extent2D() : validX(false), validY(false)
{
minX = minY = maxX = maxY = 0;
}
template<typename P_>
inline void AddX(P_ inX)
{
if (validX)
{
if (inX<minX) minX = (T_)inX;
else if (inX>maxX) maxX = (T_)inX;
}
else
{
minX = maxX = (T_)inX;
validX = true;
}
}
template<typename P_>
inline void AddY(P_ inY)
{
if (validY)
{
if (inY<minY) minY = (T_)inY;
else if (inY>maxY) maxY = (T_)inY;
}
else
{
minY = maxY = (T_)inY;
validY = true;
}
}
template<typename P_>
inline void Add(P_ inX, P_ inY)
{
AddX(inX);
AddY(inY);
}
template<typename P_>
inline void Add(const P_ &inPoint)
{
AddX(inPoint.x);
AddY(inPoint.y);
}
inline void Add(const Extent2D<T_> &inExtent)
{
if (inExtent.validX)
{
AddX(inExtent.minX);
AddX(inExtent.maxX);
}
if (inExtent.validY)
{
AddY(inExtent.minY);
AddY(inExtent.maxY);
}
}
bool Intersect(T_ inX0,T_ inY0, T_ inX1, T_ inY1)
{
if (!validX)
{
minX = inX0;
maxX = inX1;
validX = true;
}
else
{
if (inX0 > minX) minX = inX0;
if (inX1 < maxX) maxX = inX1;
}
if (!validY)
{
minY = inY0;
maxY = inY1;
validY = true;
}
else
{
if (inY0 > minY) minY = inY0;
if (inY1 < maxY) maxY = inY1;
}
return minX<maxX && minY<maxY;
}
template<typename O_>
bool Contains(const O_ &inOther) const
{
return validX && validY && inOther.x>=minX && inOther.x<maxX &&
inOther.y>=minY && inOther.y<maxY;
}
void Translate(int inTX,int inTY)
{
minX += inTX;
maxX += inTX;
minY += inTY;
maxY += inTY;
}
void Transform(double inSX, double inSY, double inTX, double inTY)
{
minX = inTX + inSX*(minX);
maxX = inTX + inSX*(maxX);
minY = inTY + inSY*(minY);
maxY = inTY + inSY*(maxY);
}
TRect<T_> Rect() const
{
if (!Valid()) return TRect<T_>(0,0,0,0);
return TRect<T_>(minX,minY,maxX,maxY,true);
}
template<typename RECT>
bool GetRect(RECT &outRect,double inExtraX=0,double inExtraY=0)
{
if (!Valid())
{
outRect = RECT(0,0,0,0);
return false;
}
outRect = RECT(minX,minY,maxX+inExtraX,maxY+inExtraY,true);
return true;
}
inline bool Valid() const { return validX && validY; }
void Invalidate() { validX = validY = false; }
T_ Width() const { return maxX-minX; }
T_ Height() const { return maxY-minY; }
};
typedef Extent2D<int> Extent2DI;
typedef Extent2D<float> Extent2DF;
} // end namespace nme
#endif