DigitalCurling3  1.0.0
A curling simulation system for curling AIs
i_simulator.hpp
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2022 UEC Takeshi Ito Laboratory
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
25 
26 #ifndef DIGITALCURLING3_I_SIMULATOR_HPP
27 #define DIGITALCURLING3_I_SIMULATOR_HPP
28 
29 #include <cstdint>
30 #include <array>
31 #include <vector>
32 #include <optional>
33 #include <memory>
34 #include <string>
35 #include "vector2.hpp"
36 #include "transform.hpp"
37 
38 namespace digitalcurling3 {
39 
40 class ISimulatorFactory;
41 class ISimulatorStorage;
42 
57 class ISimulator {
58 public:
59 
60  // constants ---
61 
63  static constexpr std::uint8_t kStoneMax = 16;
64 
66  static constexpr float kStoneRadius = 0.145f;
67 
68 
69  // types ---
70 
72  struct Stone : public Transform {
75 
78  : Transform()
79  , linear_velocity()
80  , angular_velocity(0.f) {}
81 
92  };
93 
97  using AllStones = std::array<std::optional<Stone>, kStoneMax>;
98 
100  struct Collision {
102  struct Stone {
103  std::uint8_t id;
105 
107  Stone() : id(0), transform() {}
108 
113  Stone(std::uint8_t id, Transform const& transform) : id(id), transform(transform) {}
114  };
119 
122  : a()
123  , b()
124  , normal_impulse(0.f)
125  , tangent_impulse(0.f) {}
126 
135  Collision(std::uint8_t a_id, std::uint8_t b_id, Transform const& a_transform, Transform const& b_transform, float normal_impulse, float tangent_impulse)
136  : a(a_id, a_transform)
137  , b(b_id, b_transform)
140 
145  {
146  return (a.transform.position + b.transform.position) * 0.5f;
147  }
148  };
149 
150 
151  // member functions ---
152 
153 protected:
154  ISimulator() = default;
155  ISimulator(ISimulator const&) = default;
156  ISimulator& operator = (ISimulator const&) = default;
157 
158 public:
159  virtual ~ISimulator() = default;
160 
164  virtual void SetStones(AllStones const& stones) = 0;
165 
169  virtual void Step() = 0;
170 
179  virtual AllStones const& GetStones() const = 0;
180 
189  virtual std::vector<Collision> const& GetCollisions() const = 0;
190 
194  virtual bool AreAllStonesStopped() const = 0;
195 
199  virtual float GetSecondsPerFrame() const = 0;
200 
206  virtual std::string GetSimulatorId() const = 0;
207 
221  virtual ISimulatorFactory const& GetFactory() const = 0;
222 
226  virtual std::unique_ptr<ISimulatorStorage> CreateStorage() const = 0;
227 
231  virtual void Save(ISimulatorStorage & storage) const = 0;
232 
236  virtual void Load(ISimulatorStorage const& storage) = 0;
237 };
238 
239 
240 // json
241 
242 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(
243  ISimulator::Stone,
244  position,
245  angle,
246  linear_velocity,
247  angular_velocity
248 )
249 
250 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(
251  ISimulator::Collision::Stone,
252  id,
253  transform
254 )
255 
256 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(
257  ISimulator::Collision,
258  a,
259  b,
260  normal_impulse,
261  tangent_impulse
262 )
263 
264 } // namespace digitalcurling3
265 
266 #endif // DIGITALCURLING3_I_SIMULATOR_HPP
digitalcurling3::ISimulator::Collision
ストーンどうしの衝突の情報
Definition: i_simulator.hpp:100
digitalcurling3::ISimulator::Stone::linear_velocity
Vector2 linear_velocity
速度(m/s)
Definition: i_simulator.hpp:73
digitalcurling3::Transform
位置,角度を格納します.
Definition: transform.hpp:37
digitalcurling3::ISimulator::Save
virtual void Save(ISimulatorStorage &storage) const =0
ストレージに現在の状態を保存する
digitalcurling3::ISimulator::Collision::Stone::Stone
Stone(std::uint8_t id, Transform const &transform)
与えられたデータで初期化します
Definition: i_simulator.hpp:113
digitalcurling3::ISimulator::Step
virtual void Step()=0
1フレーム進める.
digitalcurling3::Vector2
2次元ベクトル
Definition: vector2.hpp:37
digitalcurling3::ISimulator::Stone::angular_velocity
float angular_velocity
角速度(radian/s)
Definition: i_simulator.hpp:74
digitalcurling3::ISimulator::GetSimulatorId
virtual std::string GetSimulatorId() const =0
シミュレータIDを得る.
digitalcurling3::ISimulator::Collision::Collision
Collision(std::uint8_t a_id, std::uint8_t b_id, Transform const &a_transform, Transform const &b_transform, float normal_impulse, float tangent_impulse)
与えられたパラメータで初期化します
Definition: i_simulator.hpp:135
digitalcurling3::ISimulator::kStoneRadius
static constexpr float kStoneRadius
ストーンの半径(m)
Definition: i_simulator.hpp:66
digitalcurling3::ISimulator::GetFactory
virtual ISimulatorFactory const & GetFactory() const =0
ファクトリーを得る
digitalcurling3::ISimulator::GetStones
virtual AllStones const & GetStones() const =0
全ストーンの情報を取得する.
digitalcurling3::ISimulator::Collision::a
Stone a
衝突したストーン
Definition: i_simulator.hpp:115
digitalcurling3::ISimulator::AllStones
std::array< std::optional< Stone >, kStoneMax > AllStones
全ストーンの位置と速度
Definition: i_simulator.hpp:97
digitalcurling3::ISimulator::GetCollisions
virtual std::vector< Collision > const & GetCollisions() const =0
直前の Step() の呼出しで発生したすべての衝突の情報を得る.
digitalcurling3::ISimulator::Collision::Stone::Stone
Stone()
デフォルトコンストラクタ
Definition: i_simulator.hpp:107
digitalcurling3::ISimulator::CreateStorage
virtual std::unique_ptr< ISimulatorStorage > CreateStorage() const =0
ストレージを生成し,現在の状態を保存する
digitalcurling3::ISimulator::Stone::Stone
Stone(Vector2 position, float angle, Vector2 linear_velocity, float angular_velocity)
与えられたデータで初期化します
Definition: i_simulator.hpp:88
digitalcurling3::ISimulator::Collision::b
Stone b
衝突したストーン
Definition: i_simulator.hpp:116
digitalcurling3::ISimulator
ストーンの挙動を再現する物理シミュレータを扱うためのインターフェイス
Definition: i_simulator.hpp:57
digitalcurling3::ISimulatorFactory
ISimulator を構築するためのクラスです
Definition: i_simulator_factory.hpp:42
digitalcurling3::ISimulatorStorage
ISimulator の状態を保存するストレージ
Definition: i_simulator_storage.hpp:46
digitalcurling3::ISimulator::Collision::normal_impulse
float normal_impulse
法線方向の撃力
Definition: i_simulator.hpp:117
digitalcurling3::ISimulator::Collision::Stone::id
std::uint8_t id
ストーンのID
Definition: i_simulator.hpp:103
digitalcurling3::ISimulator::operator=
ISimulator & operator=(ISimulator const &)=default
コピー代入演算子.何もコピーしません.サブクラスでのdefault実装をサポートするためのものです.
digitalcurling3::ISimulator::AreAllStonesStopped
virtual bool AreAllStonesStopped() const =0
全ストーンが停止しているかをチェックする.
digitalcurling3::ISimulator::Collision::Collision
Collision()
全パラメータを 0 で初期化します
Definition: i_simulator.hpp:121
digitalcurling3::ISimulator::Stone
ストーンの位置,角度,速度,角速度を格納します
Definition: i_simulator.hpp:72
digitalcurling3
Digital Curling ライブラリはこの名前空間の中に定義されます
Definition: polymorphic_json.hpp:37
digitalcurling3::ISimulator::SetStones
virtual void SetStones(AllStones const &stones)=0
全ストーンの情報を設定する.
digitalcurling3::ISimulator::Collision::tangent_impulse
float tangent_impulse
接線方向の撃力
Definition: i_simulator.hpp:118
transform.hpp
Transform を定義します
vector2.hpp
Vector2 を定義します
digitalcurling3::ISimulator::GetSecondsPerFrame
virtual float GetSecondsPerFrame() const =0
1回 Step() の呼出しで進む時間を得る.
digitalcurling3::Transform::position
Vector2 position
位置
Definition: transform.hpp:38
digitalcurling3::ISimulator::Collision::Stone::transform
Transform transform
ストーンの位置と角度
Definition: i_simulator.hpp:104
digitalcurling3::ISimulator::Collision::Stone
衝突に関するストーンの情報
Definition: i_simulator.hpp:102
digitalcurling3::ISimulator::kStoneMax
static constexpr std::uint8_t kStoneMax
シミュレータ上に配置可能なストーンの最大数
Definition: i_simulator.hpp:63
digitalcurling3::Transform::angle
float angle
角度
Definition: transform.hpp:39
digitalcurling3::ISimulator::Load
virtual void Load(ISimulatorStorage const &storage)=0
ストレージから状態を復元する
digitalcurling3::ISimulator::Stone::Stone
Stone()
全データを0で初期化します
Definition: i_simulator.hpp:77
digitalcurling3::ISimulator::Collision::GetContactPoint
Vector2 GetContactPoint() const
ストーンどうしが接した座標を得る。
Definition: i_simulator.hpp:144