# Rectangle Math Functions

## Intersects

``````bool bit::RectangleMath::intersects(float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
return intersectsPlane(Axis::X, x1, y1, width1, height1, x2, y2, width2, height2) && intersectsPlane(Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
}``````

## Intersects Plane

``````bool bit::RectangleMath::intersectsPlane(Axis axis, float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
float top1 = y1;
float top2 = y2;
float bottom1 = y1 + height1;
float bottom2 = y2 + height2;
float left1 = x1;
float left2 = x2;
float right1 = x1 + width1;
float right2 = x2 + width2;

switch(axis)
{
case Axis::X:
{
bool notInXPlane = (left1 >= right2 || right1 <= left2);
return !notInXPlane;
}
case Axis::Y:
{
bool notInYPlane = (bottom1 <= top2 || top1 >= bottom2);
return !notInYPlane;
}
}

return false;
}``````

## Axis Distance

``````float bit::RectangleMath::axisDistance(Axis axis, float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
float top1 = y1;
float top2 = y2;
float bottom1 = y1 + height1;
float bottom2 = y2 + height2;
float left1 = x1;
float left2 = x2;
float right1 = x1 + width1;
float right2 = x2 + width2;

switch(axis)
{
case Axis::X:
{
float xDiffA = std::abs(left1 - right2); // distance between my leftmost X and their rightmost X
float xDiffB = std::abs(right1 - left2); // distance between my rightmost X and their leftmost X
float xMin = std::min(xDiffA, xDiffB);
return xMin;
}
case Axis::Y:
{
float yDiffA = std::abs(bottom1 - top2); // distance between my bottom and their top
float yDiffB = std::abs(top1 - bottom2); // distance between my top and their bottom
float yMin = std::min(yDiffA, yDiffB);
return yMin;
}
}

return 0;
}``````

## Distance

``````float bit::RectangleMath::distance(float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
float x = axisDistance(Axis::X, x1, y1, width1, height1, x2, y2, width2, height2);
float y = axisDistance(Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
return std::sqrt(x*x  + y*y);
}
``````

``````bool bit::RectangleMath::isCardinallyAdjacent(float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
int xDistance = axisDistance(bit::RectangleMath::Axis::X, x1, y1, width1, height1, x2, y2, width2, height2);
int yDistance = axisDistance(bit::RectangleMath::Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
bool inYPlane = intersectsPlane(bit::RectangleMath::Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
bool inXPlane = intersectsPlane(bit::RectangleMath::Axis::X, x1, y1, width1, height1, x2, y2, width2, height2);

return (inXPlane || inYPlane) && (xDistance == 0 || yDistance == 0);
}``````

## Is Cardinally or Diagonally Adjacent

``````bool bit::RectangleMath::isCardinallyOrDiagonallyAdjacent(float x1, float y1, float width1, float height1, float x2, float y2, float width2, float height2)
{
// THIS IS REALLY USED FOR TILE MAPS
// example 1x1s
// 0,0 | 1,0 | 2,0
// 0,1 | 1,1 | 2,1
// 0,2 | 1,2 | 2,2

int xDistance = axisDistance(bit::RectangleMath::Axis::X, x1, y1, width1, height1, x2, y2, width2, height2);
int yDistance = axisDistance(bit::RectangleMath::Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
bool inYPlane = intersectsPlane(bit::RectangleMath::Axis::Y, x1, y1, width1, height1, x2, y2, width2, height2);
bool inXPlane = intersectsPlane(bit::RectangleMath::Axis::X, x1, y1, width1, height1, x2, y2, width2, height2);

bool isCardinal = (inXPlane || inYPlane) && (xDistance == 0 || yDistance == 0);

bool isDiagonal = xDistance < width1 && yDistance < height1;

return isCardinal || isDiagonal;
}``````