12#include <magic_enum.hpp>
26 const std::vector<RobotStateNode>*
const p_graph,
27 size_t*
const p_display_node_index,
28 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr) :
30 display_node_index_ptr_(p_display_node_index),
31 setting_ptr_(setting_ptr)
40 ChangeDisplayNodeIndex();
49 DrawNodeControlPanel();
51 if (graph_ptr_->size() != 0 && *display_node_index_ptr_ < graph_ptr_->size())
58void GraphViewerGUIController::DrawGraphData()
const
60 const int kBoxSizeX = 250;
61 const int kBoxSizeY = 200;
62 const int kBoxMinX = setting_ptr_->window_size_x - kBoxSizeX - 10;
63 const int kBoxMinY = setting_ptr_->window_size_y - kBoxSizeY - 10;
64 const unsigned int kBaseColor = GetColor(255, 255, 255);
67 SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
68 DrawBox(kBoxMinX, kBoxMinY, kBoxMinX + kBoxSizeX, kBoxMinY + kBoxSizeY,
70 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
72 const unsigned int kTextColor = GetColor(10, 10, 10);
75 if (graph_ptr_->size() == 0)
77 DrawString(kBoxMinX + 10, kBoxMinY + 10,
78 "ノード数 : 0", kTextColor);
79 DrawString(kBoxMinX + 10, kBoxMinY + 30,
80 "グラフを生成してください", kTextColor);
84 DrawFormatString(kBoxMinX + 10, kBoxMinY + 10, kTextColor,
85 "総ノード数:%d", graph_ptr_->size());
86 DrawFormatString(kBoxMinX + 10, kBoxMinY + 30, kTextColor,
87 "表示ノード:%d番", *display_node_index_ptr_);
90 for (
size_t i = 0; i < graph_node_depth_data_.size(); i++)
94 kBoxMinY + 50 + 20 *
static_cast<int>(i),
97 static_cast<int>(i),
static_cast<int>(graph_node_depth_data_.at(i)));
103void GraphViewerGUIController::DrawNodeControlPanel()
const
105 const int kBoxSizeX = 350;
106 const int kBoxSizeY = 250;
107 const int kBoxMinX = 10;
108 const int kBoxMinY = 10;
109 const unsigned int kBaseColor = GetColor(255, 255, 255);
112 SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
113 DrawBox(kBoxMinX, kBoxMinY,
114 kBoxMinX + kBoxSizeX, kBoxMinY + kBoxSizeY,
116 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
118 const unsigned int kTextColor = GetColor(10, 10, 10);
121 DrawFormatString(kBoxMinX + 10, kBoxMinY + 10,
122 kTextColor,
"input ( C でクリア)");
124 if (input_number_ < 0)
127 kBoxMinX + 10, kBoxMinY + 30,
128 kTextColor,
" 数字を入力してください");
133 kBoxMinX + 10, kBoxMinY + 30,
134 kTextColor,
" %d", input_number_);
137 if (graph_ptr_->size() > *display_node_index_ptr_)
140 kBoxMinX + 10, kBoxMinY + 60, kTextColor,
142 *display_node_index_ptr_,
143 graph_ptr_->at(*display_node_index_ptr_).parent_index);
146 kBoxMinX + 10, kBoxMinY + 90, kTextColor,
148 children_list_.first,
149 children_list_.second.size());
151 std::string str = children_list_.second.size() == 0 ?
"None" :
" ";
153 for (
size_t i = 0; i < children_list_.second.size(); i++)
155 if (i > (
size_t)6 * 5 - 1)
161 str += std::to_string(children_list_.second.at(i)) +
",";
163 if (i % 6 == 0 && i != 0)
170 kBoxMinX + 10, kBoxMinY + 110,
172 "%d番ノードの子ノードリスト", children_list_.first);
173 DrawFormatString(kBoxMinX + 10, kBoxMinY + 130, kTextColor, str.c_str());
178void GraphViewerGUIController::DrawNodeData(
const RobotStateNode& node)
const
183 const int kBoxSizeX = 400;
184 const int KBoxSizeY = 300;
185 const int kBoxMinX = setting_ptr_->window_size_x - 25 - kBoxSizeX;
186 const int kBoxMinY = 25;
187 const unsigned int kBoxColor = GetColor(255, 255, 255);
188 const unsigned int kBoxAlpha = 128;
191 SetDrawBlendMode(DX_BLENDMODE_ALPHA, kBoxAlpha);
195 kBoxMinX + kBoxSizeX, kBoxMinY + KBoxSizeY, kBoxColor, TRUE);
197 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
200 const unsigned int kTextColor = GetColor(10, 10, 10);
201 const int kTextXPos = kBoxMinX + 10;
202 const int kTextYMinPos = kBoxMinY + 10;
203 const int kTextYInterval = 30;
209 kTextYMinPos + kTextYInterval * (text_line++),
211 "重心:%d,脚位置:%d,%d,%d,%d,%d,%d",
223 kTextYMinPos + kTextYInterval * (text_line++),
225 "重心位置(x:%5.3f,y:%5.3f,z:%5.3f)",
226 node.center_of_mass_global_coord.x,
227 node.center_of_mass_global_coord.y,
228 node.center_of_mass_global_coord.z);
231 std::string str =
"";
246 kTextYMinPos + kTextYInterval * (text_line++),
256 kTextYMinPos + kTextYInterval * (text_line++),
258 "%d番脚の位置(x:%5.3f,y:%5.3f,z:%5.3f)",
259 i, node.leg_pos[i].x,
267 kTextYMinPos + kTextYInterval * (text_line++),
271 static_cast<std::string
>(magic_enum::enum_name(node.next_move)).c_str());
275void GraphViewerGUIController::InputNumber()
285 int input_number = -1;
328 if (input_number >= 0)
330 if (input_number_ < 0)
332 input_number_ = input_number;
337 input_number_ += input_number;
343void GraphViewerGUIController::ChangeDisplayNodeIndex()
345 if (graph_ptr_->size() == 0)
352 (*display_node_index_ptr_)--;
356 (*display_node_index_ptr_)++;
360 (*display_node_index_ptr_) = input_number_;
365 if (graph_ptr_->size() > *display_node_index_ptr_)
367 (*display_node_index_ptr_) =
368 graph_ptr_->at(*display_node_index_ptr_).parent_index;
372 !children_list_.second.empty())
374 display_children_list_index_--;
376 if (display_children_list_index_ < 0)
378 display_children_list_index_ =
379 static_cast<int>(children_list_.second.size()) - 1;
382 display_children_list_index_ =
383 (display_children_list_index_ < 0) ? 0 : display_children_list_index_;
385 (*display_node_index_ptr_) =
386 children_list_.second.at(display_children_list_index_);
389 !children_list_.second.empty())
391 display_children_list_index_++;
393 if (display_children_list_index_ >= children_list_.second.size())
395 display_children_list_index_ = 0;
398 (*display_node_index_ptr_) =
399 children_list_.second.at(display_children_list_index_);
403 if (*display_node_index_ptr_ < 0)
405 *display_node_index_ptr_ = graph_ptr_->size() - 1;
407 else if (*display_node_index_ptr_ >= graph_ptr_->size())
409 *display_node_index_ptr_ = 0;
414void GraphViewerGUIController::UpdateChildrenList()
416 if (graph_ptr_->size() == 0)
423 children_list_.first =
static_cast<int>(*display_node_index_ptr_);
424 children_list_.second.clear();
426 const size_t kGraphSize = graph_ptr_->size();
428 for (
size_t i = 0; i < kGraphSize; i++)
430 if (graph_ptr_->at(i).parent_index == children_list_.first)
432 children_list_.second.push_back(
static_cast<int>(i));
441 graph_node_depth_data_.clear();
443 if (graph_ptr_->size() > 0)
447 for (
size_t i = 0; i < graph_ptr_->size(); ++i)
449 const auto index =
static_cast<size_t>(graph_ptr_->at(i).depth);
450 graph_node_depth_data_.at(index)++;
static const int kMaxDepth
グラフ探索の最大深さ.
void UpdateGraphNodeDepthData()
GraphViewerGUIController(const std::vector< RobotStateNode > *const graph_ptr, size_t *const display_node_index_ptr, const std::shared_ptr< const ApplicationSettingRecord > &setting_ptr)
static constexpr int kLegNum
void Update()
キー入力を更新する. これを毎フレーム実行しないと,キー入力を取得できない.
int GetPressingCount(const int key_code) const
keyCodeのキーが押されているフレーム数を取得する.
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
enums::DiscreteComPos GetDiscreteComPos(const LegStateBit &leg_state)
現在の脚状態から重心パターンを取得する.
enums::DiscreteLegPos GetDiscreteLegPos(const LegStateBit &leg_state, const int leg_index)
脚状態を取得する.