19 assert(vertex.size() <= kMaxVertexNum);
21 for (
int i = 0; i < static_cast<int>(vertex.size()); ++i)
29 for (
int i = 0; i < vertex_num; i++)
31 if (vertex[
static_cast<size_t>(i)] == v)
37 vertex[
static_cast<size_t>(vertex_num)] = v;
40 assert(vertex_num <= kMaxVertexNum);
55 vertex[j] = vertex[j + 1];
58 vertex[vertex_num - 1] =
Vector2(0.0f, 0.0f);
74 const auto v1 = vertex[1] - vertex[0];
75 const auto v2 = vertex[2] - vertex[1];
77 bool is_left_turn = v1.Cross(v2) > 0.0f;
79 for (
int i = 1; i < num; ++i)
81 const auto& v1_2 = vertex[(i + 1) % num] - vertex[i];
82 const auto& v2_2 = vertex[(i + 2) % num] - vertex[(i + 1) % num];
84 if (is_left_turn && v1_2.Cross(v2_2) < 0.0f)
88 else if (!is_left_turn && v1_2.Cross(v2_2) > 0.0f)
110 bool is_left_turn = (vertex[1] - vertex[0]).Cross(vertex[2] - vertex[1]) > 0.0f;
114 for (
int i = 0; i < num; ++i)
116 const auto& v1 = vertex[i] - point;
117 const auto& v2 = vertex[(i + 1) % num] - point;
119 if (v1.Cross(v2) == 0.0f && v1.Dot(v2) <= 0.0f)
126 if (v1.y < 0.0f && 0.0f <= v2.y && v1.Cross(v2) > 0.0f)
133 if (v2.y < 0.0f && 0.0f <= v1.y && v1.Cross(v2) < 0.0f)
142 for (
int i = 0; i < num; ++i)
144 const auto& v1 = vertex[i] - point;
145 const auto& v2 = vertex[(i + 1) % num] - point;
147 if (v1.Cross(v2) == 0.0f && v1.Dot(v2) <= 0.0f)
154 if (v2.y < 0.0f && 0.0f <= v1.y && v1.Cross(v2) < 0.0f)
161 if (v1.y < 0.0f && 0.0f <= v2.y && v1.Cross(v2) > 0.0f)
169 return (cnt % 2 == 1);
176 res +=
"Vertex Num : " + std::to_string(
GetVertexNum()) +
"\n";
180 res +=
"Vertex " + std::to_string(i) +
" : " +
190 res += (
IsConvex() ?
"TRUE" :
"FALSE");
std::string FloatingPointNumToString(const T num, const int digit=kDigit, const int width=kWidth)
小数を文字列に変換する関数. C++ では C のフォーマットのように %3.3f とかで小数を文字列に変換できないため自作する.
constexpr float GetMaxX() const
頂点の中で最大のx座標を返す関数.
std::string ToString() const
多角形のデータを文字列で出力する
constexpr float GetMinY() const
頂点の中で最小のy座標を返す関数.
bool IsInside(const Vector2 &point) const
点が多角形の内部にあるかどうか調べる関数. 多角形が凸でない場合は正しく判定できない.
constexpr void AddVertex(const Vector2 &v)
頂点を追加する関数.
bool AddVertexCheckForDuplicates(const Vector2 &v)
頂点を追加する関数.他の頂点と重なっている場合は追加しない.
constexpr int GetVertexNum() const
多角形の頂点数を返す関数.
constexpr float GetMaxY() const
頂点の中で最大のy座標を返す関数.
void RemoveVertex(const int index)
頂点を削除する関数.遅いので多用するべきではない.
constexpr Vector2 GetVertex(const int i) const
頂点の座標を返す関数.
constexpr float GetMinX() const
頂点の中で最小のx座標を返す関数.
bool IsConvex() const
多角形が凸かどうか調べる関数.
std::string ToString() const
このベクトルを文字列にして返す. (x, y) の形式,小数点以下3桁まで.