|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "engine/point.hpp"
|
|
|
|
|
#include "engine/size.hpp"
|
|
|
|
|
|
|
|
|
|
namespace devilution {
|
|
|
|
|
|
|
|
|
|
struct Rectangle {
|
|
|
|
|
Point position;
|
|
|
|
|
Size size;
|
|
|
|
|
|
|
|
|
|
Rectangle() = default;
|
|
|
|
|
|
|
|
|
|
constexpr Rectangle(Point position, Size size)
|
|
|
|
|
: position(position)
|
|
|
|
|
, size(size)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Constructs a rectangle centered on the given point and including all tiles within the given radius.
|
|
|
|
|
*
|
|
|
|
|
* The resulting rectangle will be square with an odd size equal to 2*radius + 1.
|
|
|
|
|
*
|
|
|
|
|
* @param center center point of the target rectangle
|
|
|
|
|
* @param radius a non-negative value indicating how many tiles to include around the center
|
|
|
|
|
*/
|
|
|
|
|
explicit constexpr Rectangle(Point center, int radius)
|
|
|
|
|
: position(center - Displacement { radius })
|
|
|
|
|
, size(2 * radius + 1)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constexpr bool Contains(Point point) const
|
|
|
|
|
{
|
|
|
|
|
return point.x >= this->position.x
|
|
|
|
|
&& point.x < (this->position.x + this->size.width)
|
|
|
|
|
&& point.y >= this->position.y
|
|
|
|
|
&& point.y < (this->position.y + this->size.height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Computes the center of this rectangle in integer coordinates. Values are truncated towards zero.
|
|
|
|
|
*/
|
|
|
|
|
constexpr Point Center() const
|
|
|
|
|
{
|
|
|
|
|
return position + Displacement(size / 2);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace devilution
|