HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
rectangle.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../rapid/numeric_array.hpp"
8#include "axis_aligned_rectangle.hpp"
9#include "../alignment.hpp"
10#include <array>
11
12namespace tt {
13
16class rectangle {
20
21public:
22 rectangle() noexcept : corners() {}
23 rectangle(rectangle const &rhs) noexcept = default;
24 rectangle &operator=(rectangle const &rhs) noexcept = default;
25 rectangle(rectangle &&rhs) noexcept = default;
26 rectangle &operator=(rectangle &&rhs) noexcept = default;
27
28 rectangle(point3 corner0, point3 corner1, point3 corner2, point3 corner3) noexcept : corners{corner0, corner1, corner2, corner3} {}
29
30 rectangle(aarectangle rhs) noexcept : corners{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs)} {}
31
32 rectangle &operator=(aarectangle rhs) noexcept
33 {
34 std::get<0>(corners) = get<0>(rhs);
35 std::get<1>(corners) = get<1>(rhs);
36 std::get<2>(corners) = get<2>(rhs);
37 std::get<3>(corners) = get<3>(rhs);
38 return *this;
39 }
40
41 rectangle(point3 corner0, extent2 extent) noexcept :
42 corners{corner0, corner0 + extent.right(), corner0 + extent.up(), corner0 + extent.right() + extent.up()}
43 {
44 }
45
46 [[nodiscard]] explicit operator aarectangle() const noexcept
47 {
48 // XXX - Should actually check maximum and minimums of all points.
49 return aarectangle{point2{std::get<0>(corners)}, point2{std::get<3>(corners)}};
50 }
51
54 vector3 right_vector() const noexcept
55 {
56 return std::get<1>(corners) - std::get<0>(corners);
57 }
58
61 vector3 up_vector() const noexcept
62 {
63 return std::get<2>(corners) - std::get<0>(corners);
64 }
65
66 float width() const noexcept
67 {
68 return hypot(right_vector());
69 }
70
71 float height() const noexcept
72 {
73 return hypot(up_vector());
74 }
75
76 extent2 extent() const noexcept
77 {
78 return {width(), height()};
79 }
80
81 [[nodiscard]] point3 constexpr operator[](size_t i) const noexcept
82 {
83 tt_axiom(i < 4);
84 return corners[i];
85 }
86
87 template<size_t I>
88 [[nodiscard]] friend constexpr point3 get(rectangle const &rhs) noexcept
89 {
90 static_assert(I < 4);
91 return std::get<I>(rhs.corners);
92 }
93
94 [[nodiscard]] friend rectangle expand(rectangle const &lhs, float rhs) noexcept
95 {
96 ttlet rightDirection = normalize(lhs.right_vector());
97 ttlet upDirection = normalize(lhs.up_vector());
98
99 return {
100 get<0>(lhs) + rhs * -rightDirection + rhs * -upDirection,
101 get<1>(lhs) + rhs * rightDirection + rhs * -upDirection,
102 get<2>(lhs) + rhs * -rightDirection + rhs * upDirection,
103 get<3>(lhs) + rhs * rightDirection + rhs * upDirection};
104 }
105
106 [[nodiscard]] friend rectangle shrink(rectangle const &lhs, float rhs) noexcept
107 {
108 return expand(lhs, -rhs);
109 }
110};
111
112} // namespace tt
Class which represents an axis-aligned rectangle.
Definition axis_aligned_rectangle.hpp:20
Class which represents an rectangle.
Definition rectangle.hpp:16
vector3 up_vector() const noexcept
Get the up vector of a rectangle.
Definition rectangle.hpp:61
vector3 right_vector() const noexcept
Get the right vector of a rectangle.
Definition rectangle.hpp:54
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector.hpp:20