-
Notifications
You must be signed in to change notification settings - Fork 1
/
RectangleFunctions.hpp
191 lines (148 loc) · 5.5 KB
/
RectangleFunctions.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#pragma once
#include <stdexcept>
#include "SDLW.hpp"
namespace TappyPlane {
constexpr void scale(SDLW::Video::Size& size, double factor);
constexpr void scaleToFit(SDLW::Video::Size& source,
const SDLW::Video::Size& destination);
constexpr SDLW::Video::Rectangle fittingRectangle(SDLW::Video::Size source,
const SDLW::Video::Rectangle& destination);
constexpr void scale(SDLW::Video::Rectangle& rectangle, double scaleFactor);
constexpr void scaleInPlace(SDLW::Video::Rectangle& rectangle,
double scaleFactor);
constexpr SDLW::Video::Point topLeftPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point topPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point topRightPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point leftPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point centerPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point rightPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point bottomLeftPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point bottomPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr SDLW::Video::Point bottomRightPointOf(const SDLW::Video::Rectangle&)
noexcept;
constexpr int leftOf(const SDLW::Video::Rectangle&) noexcept;
constexpr int rightOf(const SDLW::Video::Rectangle&) noexcept;
constexpr int topOf(const SDLW::Video::Rectangle&) noexcept;
constexpr int bottomOf(const SDLW::Video::Rectangle&) noexcept;
std::pair<SDLW::Video::Rectangle, SDLW::Video::Rectangle> horizontalSplit(
float splitPoint, const SDLW::Video::Rectangle&) noexcept;
std::pair<SDLW::Video::Rectangle, SDLW::Video::Rectangle> verticalSplit(
float splitPoint, const SDLW::Video::Rectangle&) noexcept;
SDLW::Video::Rectangle horizontalSlice(int leftX, int rightX,
const SDLW::Video::Rectangle&) noexcept;
constexpr void scale(SDLW::Video::Size& size, const double factor)
{
if (factor < 0) {
throw std::domain_error("negative factor");
}
size.setWidth(int(size.width() * factor));
size.setHeight(int(size.height() * factor));
}
constexpr void scaleToFit(SDLW::Video::Size& source,
const SDLW::Video::Size& destination)
{
auto factor = double(destination.width()) / source.width();
if (factor * source.height() > destination.height()) {
factor = double(destination.height()) / source.height();
}
scale(source, factor);
}
constexpr SDLW::Video::Rectangle fittingRectangle(SDLW::Video::Size size,
const SDLW::Video::Rectangle& destination)
{
scaleToFit(size, destination.size());
return SDLW::Video::Rectangle(
destination.x() + (destination.width() - size.width()) / 2,
destination.y() + (destination.height() - size.height()) / 2, size);
}
constexpr void scale(SDLW::Video::Rectangle& rectangle,
const double scaleFactor)
{
if (scaleFactor < 0) {
throw std::domain_error("negative scale factor");
}
rectangle.setWidth(int(rectangle.width() * scaleFactor));
rectangle.setHeight(int(rectangle.height() * scaleFactor));
}
constexpr void scaleInPlace(SDLW::Video::Rectangle& rectangle,
const double scaleFactor)
{
const auto oldSize = rectangle.size();
scale(rectangle, scaleFactor);
rectangle.setX(rectangle.x() + (oldSize.width() - rectangle.width()) / 2);
rectangle.setY(rectangle.y() + (oldSize.height() - rectangle.height()) / 2);
}
constexpr SDLW::Video::Point topLeftPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return rectangle.position();
}
constexpr SDLW::Video::Point topPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width() / 2, rectangle.y()};
}
constexpr SDLW::Video::Point topRightPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width(), rectangle.y()};
}
constexpr SDLW::Video::Point leftPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x(), rectangle.y() + rectangle.height() / 2};
}
constexpr SDLW::Video::Point centerPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width() / 2,
rectangle.y() + rectangle.height() / 2};
}
constexpr SDLW::Video::Point rightPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width(),
rectangle.y() + rectangle.height() / 2};
}
constexpr SDLW::Video::Point bottomLeftPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x(), rectangle.y() + rectangle.height()};
}
constexpr SDLW::Video::Point bottomPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width() / 2,
rectangle.y() + rectangle.height()};
}
constexpr SDLW::Video::Point bottomRightPointOf(
const SDLW::Video::Rectangle& rectangle) noexcept
{
return {rectangle.x() + rectangle.width(),
rectangle.y() + rectangle.height()};
}
constexpr int leftOf(const SDLW::Video::Rectangle& rectangle) noexcept
{
return rectangle.x();
}
constexpr int rightOf(const SDLW::Video::Rectangle& rectangle) noexcept
{
return rectangle.x() + rectangle.width();
}
constexpr int topOf(const SDLW::Video::Rectangle& rectangle) noexcept
{
return rectangle.y();
}
constexpr int bottomOf(const SDLW::Video::Rectangle& rectangle) noexcept
{
return rectangle.y() + rectangle.height();
}
} // namespace TappyPlane