Tetrapod Project
terrain.cpp
Go to the documentation of this file.
2 
3 Terrain::Terrain(Eigen::Array<bool, Eigen::Dynamic, 1> bool_bridge)
4 {
5  SteppingStone initial = addStone(Eigen::Vector3d::Zero(), 1.2, 1.2, "initial");
6 
7  double width_bridge = 0.24;
8 
9  Eigen::Vector3d center = initial.getBottomRight() + Eigen::Vector3d(width_bridge*1.5, initial.getHeight()/2, 0);
10 
11  int num_stones = bool_bridge.colwise().count()(0);
12 
13  Eigen::Array<Eigen::Vector3d, Eigen::Dynamic, 1> centers(num_stones);
14 
15  for (int i = 0; i < bool_bridge.rows(); ++i)
16  {
17  if (bool_bridge(i))
18  {
19  centers(i) = center + Eigen::Vector3d(i*2*width_bridge, 0, 0);
20  }
21  }
22 
23  addStones(centers,
24  Eigen::Array<double, Eigen::Dynamic, 1>::Constant(num_stones, 1, width_bridge*1.5),
25  Eigen::Array<double, Eigen::Dynamic, 1>::Constant(num_stones, 1, initial.getHeight()),
26  "bridge");
27 
28  center = initial.getCenter() + Eigen::Vector3d(initial.getWidth() + (bool_bridge.rows()*2 + 1)*width_bridge, 0, 0);
29 
30  SteppingStone goal = addStone(center, initial.getWidth(), initial.getHeight(), "goal");
31 
32  double height = 0.8;
33 
34  double clearance = 0.1;
35 
36  Eigen::Vector3d c2g = goal.getCenter() - initial.getCenter();
37 
38  double width = initial.getWidth() + c2g(0);
39 
40  center = initial.getCenter() + Eigen::Vector3d(0, (initial.getHeight() + height)/2 + clearance, 0);
41 
42  addStone(center, width, height, "lateral");
43 }
44 
46 {
47  SteppingStone initial = addStone(Eigen::Vector3d(0, 0, 0), 1.2, 1.2, "initial");
48 
49  for (int i = 0; i < 2; ++i)
50  {
51  addStone(Eigen::Vector3d(1 + 2*i, 0, 0), 1.2, 4.2, "vertical");
52  addStone(Eigen::Vector3d(2, -1.5 + 3*i, 0), 3.2, 1.2, "lateral");
53  }
54 
55  SteppingStone goal = addStone(Eigen::Vector3d(4, 0, 0.1), 1.2, 1.2, "goal");
56 }
57 
59 {}
60 
61 SteppingStone Terrain::addStone(Eigen::Vector3d center, double width, double height, std::string name)
62 {
63  SteppingStone stone(center, width, height, name);
64 
65  stepping_stones.conservativeResize(stepping_stones.rows() + 1, Eigen::NoChange);
66 
67  stepping_stones(stepping_stones.rows() - 1, 0) = stone;
68 
69  return stone;
70 }
71 
72 Eigen::Array<SteppingStone, Eigen::Dynamic, 1> Terrain::addStones(Eigen::Array<Eigen::Vector3d, Eigen::Dynamic, 1> centers, Eigen::Array<double, Eigen::Dynamic, 1> widths, Eigen::Array<double, Eigen::Dynamic, 1> heights, std::string name)
73 {
74  int n = centers.rows();
75 
76  if ((widths.rows() != n) || (heights.rows() != n))
77  {
78  throw "Arguments have incoherent size.";
79  }
80 
81  Eigen::Array<SteppingStone, Eigen::Dynamic, 1> stones;
82 
83  stones.conservativeResize(stones.rows() + n, Eigen::NoChange);
84 
85  for (int i = 0; i < n; ++i)
86  {
87  std::string stone_name = (name.empty()) ? name : name + std::to_string(i);
88 
89  stones(stones.rows() - n + i) = addStone(centers(i), widths(i), heights(i), stone_name);
90  }
91 
92  return stones;
93 }
94 
95 SteppingStone const &Terrain::getStoneByName(std::string name) const
96 {
97  for (int i = 0; i < stepping_stones.rows(); ++i)
98  {
99  if (stepping_stones(i).getName() == name)
100  {
101  return stepping_stones(i);
102  }
103  }
104 
105  throw "No stone in the terrain has the name " + name + ".";
106 }
const Eigen::Vector3d & getBottomRight() const
const double & getWidth()
const double & getHeight()
const Eigen::Vector3d & getCenter() const
SteppingStone addStone(Eigen::Vector3d center, double width, double height, std::string name=nullptr)
Definition: terrain.cpp:61
virtual ~Terrain()
Definition: terrain.cpp:58
Eigen::Array< SteppingStone, Eigen::Dynamic, 1 > stepping_stones
Definition: terrain.h:26
Terrain()
Definition: terrain.cpp:45
Eigen::Array< SteppingStone, Eigen::Dynamic, 1 > addStones(Eigen::Array< Eigen::Vector3d, Eigen::Dynamic, 1 > centers, Eigen::Array< double, Eigen::Dynamic, 1 > widths, Eigen::Array< double, Eigen::Dynamic, 1 > heights, std::string name="")
Definition: terrain.cpp:72
const SteppingStone & getStoneByName(std::string name) const
Definition: terrain.cpp:95
Eigen::Vector3d Vector3d
Definition: kinematics.h:49