GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
math_polygon2.h
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#ifndef DESIGNLAB_MATH_POLYGON2_H_
9#define DESIGNLAB_MATH_POLYGON2_H_
10
11#include <array>
12#include <optional>
13#include <string>
14#include <vector>
15
16#include "cassert_define.h"
17#include "math_vector2.h"
18
19
20namespace designlab
21{
22
38struct Polygon2 final
39{
40 constexpr Polygon2() : vertex_num(0)
41 {
42 }
43
44 explicit Polygon2(const std::vector<Vector2>& vertex);
45
46
50 constexpr void AddVertex(const Vector2& v)
51 {
52 vertex[static_cast<size_t>(vertex_num)] = v;
53 ++vertex_num;
54
55 assert(vertex_num <= kMaxVertexNum); // 頂点数は最大値を超えてはいけない.
56 }
57
65
66
71 void RemoveVertex(const int index);
72
75 constexpr void RemoveLastVertex()
76 {
77 if (GetVertexNum() == 0)
78 {
79 return;
80 }
81
82 --vertex_num;
83 }
84
87 constexpr void Reset()
88 {
89 vertex_num = 0;
90 }
91
94 constexpr int GetVertexNum() const
95 {
96 return vertex_num;
97 }
98
103 constexpr Vector2 GetVertex(const int i) const
104 {
105 if (i < 0 || i >= GetVertexNum())
106 {
107 return Vector2{ 0, 0 };
108 }
109
110 return vertex[static_cast<size_t>(i)];
111 }
112
117 constexpr std::optional<Vector2> GetVertexOpt(const int i) const
118 {
119 if (i < 0 || i >= GetVertexNum())
120 {
121 return std::nullopt;
122 }
123
124 return vertex[static_cast<size_t>(i)];
125 }
126
129 constexpr float GetMaxX() const
130 {
131 float max_x = vertex[0].x;
132
133 for (int i = 1; i < GetVertexNum(); ++i)
134 {
135 max_x = (std::max)(max_x, vertex[static_cast<size_t>(i)].x);
136 }
137
138 return max_x;
139 }
140
143 constexpr float GetMinX() const
144 {
145 float min_x = vertex[0].x;
146
147 for (int i = 1; i < GetVertexNum(); ++i)
148 {
149 min_x = (std::min)(min_x, vertex[static_cast<size_t>(i)].x);
150 }
151
152 return min_x;
153 }
154
157 constexpr float GetMaxY() const
158 {
159 float max_y = vertex[0].y;
160
161 for (int i = 1; i < GetVertexNum(); ++i)
162 {
163 max_y = (std::max)(max_y, vertex[static_cast<size_t>(i)].y);
164 }
165
166 return max_y;
167 }
168
171 constexpr float GetMinY() const
172 {
173 float min_y = vertex[0].y;
174
175 for (int i = 1; i < GetVertexNum(); ++i)
176 {
177 min_y = (std::min)(min_y, vertex[static_cast<size_t>(i)].y);
178 }
179
180 return min_y;
181 }
182
186 bool IsConvex() const;
187
195 bool IsInside(const Vector2& point) const;
196
197
200 std::string ToString() const;
201
202private:
204 static constexpr int kMaxVertexNum = 6;
205
206 std::array<Vector2, kMaxVertexNum> vertex;
207
208 int vertex_num;
209};
210
211
213template <class Char>
214inline std::basic_ostream<Char>& operator <<(
215 std::basic_ostream<Char>& os, const Polygon2& poly)
216{
217 os << poly.ToString();
218
219 return os;
220}
221
222} // namespace designlab
223
224
225#endif // DESIGNLAB_MATH_POLYGON2_H_
std::basic_ostream< Char > & operator<<(std::basic_ostream< Char > &os, const EulerXYZ &r)
出力ストリーム.Csv形式で出力する.カンマ区切り.単位は [rad].
Definition math_euler.h:117
2次元の多角形を表す構造体.
constexpr float GetMaxX() const
頂点の中で最大のx座標を返す関数.
std::string ToString() const
多角形のデータを文字列で出力する
constexpr float GetMinY() const
頂点の中で最小のy座標を返す関数.
bool IsInside(const Vector2 &point) const
点が多角形の内部にあるかどうか調べる関数. 多角形が凸でない場合は正しく判定できない.
constexpr std::optional< Vector2 > GetVertexOpt(const int i) const
頂点の座標を返す関数.std::optional を使っているので, 存在しない頂点を指定した場合は std::nullopt を返す.
constexpr void AddVertex(const Vector2 &v)
頂点を追加する関数.
bool AddVertexCheckForDuplicates(const Vector2 &v)
頂点を追加する関数.他の頂点と重なっている場合は追加しない.
constexpr int GetVertexNum() const
多角形の頂点数を返す関数.
constexpr float GetMaxY() const
頂点の中で最大のy座標を返す関数.
constexpr void RemoveLastVertex()
1番最後の頂点を削除する関数.
void RemoveVertex(const int index)
頂点を削除する関数.遅いので多用するべきではない.
constexpr Vector2 GetVertex(const int i) const
頂点の座標を返す関数.
constexpr float GetMinX() const
頂点の中で最小のx座標を返す関数.
bool IsConvex() const
多角形が凸かどうか調べる関数.
constexpr void Reset()
多角形をリセットする関数. 頂点を削除して,頂点数を0にする.
2次元の位置ベクトルを表す構造体.