| @@ -538,6 +538,53 @@ public: | |||
| return r; | |||
| } | |||
| //============================================================================== | |||
| /** Returns the nearest point to the specified point that lies within this rectangle. */ | |||
| Point<ValueType> getConstrainedPoint (Point<ValueType> point) const noexcept | |||
| { | |||
| return Point<ValueType> (jlimit (pos.x, pos.x + w, point.x), | |||
| jlimit (pos.y, pos.y + h, point.y)); | |||
| } | |||
| /** Returns a point within this rectangle, specified as proportional coordinates. | |||
| The relative X and Y values should be between 0 and 1, where 0 is the left or | |||
| top of this rectangle, and 1 is the right or bottom. (Out-of-bounds values | |||
| will return a point outside the rectangle). | |||
| */ | |||
| template <typename FloatType> | |||
| Point<ValueType> getRelativePoint (FloatType relativeX, FloatType relativeY) const noexcept | |||
| { | |||
| return Point<ValueType> (pos.x + static_cast<ValueType> (w * relativeX), | |||
| pos.y + static_cast<ValueType> (h * relativeY)); | |||
| } | |||
| /** Returns a proportion of the width of this rectangle. */ | |||
| template <typename FloatType> | |||
| ValueType proportionOfWidth (FloatType proportion) const noexcept | |||
| { | |||
| return static_cast<ValueType> (w * proportion); | |||
| } | |||
| /** Returns a proportion of the height of this rectangle. */ | |||
| template <typename FloatType> | |||
| ValueType proportionOfHeight (FloatType proportion) const noexcept | |||
| { | |||
| return static_cast<ValueType> (h * proportion); | |||
| } | |||
| /** Returns a rectangle based on some proportional coordinates relative to this one. | |||
| So for example getProportion ({ 0.25f, 0.25f, 0.5f, 0.5f }) would return a rectangle | |||
| of half the original size, with the same centre. | |||
| */ | |||
| template <typename FloatType> | |||
| Rectangle getProportion (Rectangle<FloatType> proportionalRect) const noexcept | |||
| { | |||
| return Rectangle (pos.x + static_cast<ValueType> (w * proportionalRect.pos.x), | |||
| pos.y + static_cast<ValueType> (h * proportionalRect.pos.y), | |||
| proportionOfWidth (proportionalRect.w), | |||
| proportionOfWidth (proportionalRect.h)); | |||
| } | |||
| //============================================================================== | |||
| /** Returns true if the two rectangles are identical. */ | |||
| bool operator== (const Rectangle& other) const noexcept { return pos == other.pos && w == other.w && h == other.h; } | |||
| @@ -564,24 +611,6 @@ public: | |||
| && pos.x + w >= other.pos.x + other.w && pos.y + h >= other.pos.y + other.h; | |||
| } | |||
| /** Returns the nearest point to the specified point that lies within this rectangle. */ | |||
| Point<ValueType> getConstrainedPoint (Point<ValueType> point) const noexcept | |||
| { | |||
| return Point<ValueType> (jlimit (pos.x, pos.x + w, point.x), | |||
| jlimit (pos.y, pos.y + h, point.y)); | |||
| } | |||
| /** Returns a point within this rectangle, specified as proportional coordinates. | |||
| The relative X and Y values should be between 0 and 1, where 0 is the left or | |||
| top of this rectangle, and 1 is the right or bottom. (Out-of-bounds values | |||
| will return a point outside the rectangle). | |||
| */ | |||
| Point<ValueType> getRelativePoint (double relativeX, double relativeY) const noexcept | |||
| { | |||
| return Point<ValueType> (pos.x + static_cast<ValueType> (w * relativeX), | |||
| pos.y + static_cast<ValueType> (h * relativeY)); | |||
| } | |||
| /** Returns true if any part of another rectangle overlaps this one. */ | |||
| bool intersects (const Rectangle& other) const noexcept | |||
| { | |||