shooter/engine/physics/Simplex.h

62 lines
1.2 KiB
C
Raw Normal View History

2021-09-13 15:53:43 +03:00
//
// Created by Иван Ильин on 08.03.2021.
//
#ifndef ENGINE_SIMPLEX_H
#define ENGINE_SIMPLEX_H
#include <list>
2021-10-31 11:39:08 +03:00
#include "../Vec3D.h"
enum class SimplexType {
Zero,
Point,
Line,
Triangle,
Tetrahedron
};
2021-09-13 15:53:43 +03:00
struct Simplex final {
2021-09-13 15:53:43 +03:00
private:
std::list<Vec3D> _points{};
2021-09-13 15:53:43 +03:00
public:
Simplex() = default;
Simplex(std::initializer_list<Vec3D> list) {
2021-10-31 11:39:08 +03:00
for (const auto &v : list) {
_points.push_back(v);
2021-10-31 11:39:08 +03:00
if (_points.size() > 4) {
_points.pop_front();
2021-10-31 11:39:08 +03:00
}
2021-09-13 15:53:43 +03:00
}
}
2021-10-31 11:39:08 +03:00
void push_front(const Vec3D &point) {
_points.push_front(point);
2021-10-31 11:39:08 +03:00
if (_points.size() > 4) {
_points.pop_back();
2021-10-31 11:39:08 +03:00
}
2021-09-13 15:53:43 +03:00
}
Vec3D operator[](unsigned i) const {
auto it = _points.begin();
2021-10-31 11:39:08 +03:00
for (unsigned k = 0; k < i; k++) {
++it;
2021-10-31 11:39:08 +03:00
}
return *it;
}
2021-10-31 11:39:08 +03:00
[[nodiscard]] unsigned size() const { return _points.size(); }
[[nodiscard]] auto begin() const { return _points.begin(); }
2021-10-31 11:39:08 +03:00
[[nodiscard]] auto end() const { return _points.end(); }
2021-09-13 15:53:43 +03:00
[[nodiscard]] SimplexType type() const { return static_cast<SimplexType>(_points.size()); }
2021-09-13 15:53:43 +03:00
};
#endif //INC_3DZAVR_SIMPLEX_H