visualizer.cpp
Go to the documentation of this file.
1 //=============================================================================
2 // Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
3 // Author: Gonzalo Mier
4 // BSD-3 License
5 //=============================================================================
6 
7 
8 #include <matplot/matplot.h>
10 
11 namespace plt = matplot;
12 
13 namespace f2c {
14 
16  const std::vector<double>& t, const std::vector<double>& d,
17  const std::vector<double>& color) {
18  auto a = plt::plot(t, d);
19  a->line_width(getLineWidth());
20  a->color(plt::to_array(color));
21 }
22 
23 void Visualizer::plot(double x, double y, const std::vector<double>& color) {
24  auto s = plt::scatter(std::vector<double>({x}), std::vector<double>({y}));
25  if (color.size() >= 3) {
26  std::array<float, 3> fc;
27  for (int i = 0; i < color.size(); ++i) {
28  fc[i] = color[i];
29  }
30  s->marker_color(fc);
31  }
32 }
33 
34 void Visualizer::plot(const F2CPoint& p, const std::vector<double>& color) {
35  plot(p.getX(), p.getY(), color);
36 }
37 
39  const F2CSwath& s, const std::vector<double>& color) {
40  F2CLineString line = s.getPath();
41  size_t n = line.size();
42  if (n < 2) {
43  return;
44  }
45  plot(line, color);
46  auto a = plt::arrow(
47  line.getX(n - 2), line.getY(n - 2),
48  line.getX(n - 1), line.getY(n - 1));
49  a->line_width(getLineWidth());
50  a->color(plt::to_array(color));
51 }
52 
54  const F2CSwaths& s, const std::vector<std::vector<double>>& color) {
55  auto colors = color;
56  if (color.empty()) {
57  colors = color_linspace(
58  std::vector({0x00, 0xff, 0x0}),
59  std::vector({0x15, 0x0f, 0x0b}),
60  s.size());
61  }
62  for (int i = 0; i < s.size(); ++i) {
63  plot(s[i], colors[i]);
64  }
65 }
66 
68  const F2CSwathsByCells& s, const std::vector<std::vector<double>>& color) {
69  auto colors = color;
70  if (colors.empty()) {
71  colors = color_linspace(
72  std::vector({0x00, 0xff, 0x0}),
73  std::vector({0x15, 0x0f, 0x0b}),
74  s.sizeTotal());
75  }
76  for (int i = 0; i < s.sizeTotal(); ++i) {
77  plot(s.getSwath(i), colors[i]);
78  }
79 }
80 
81 void Visualizer::plot(const std::vector<F2CSwathsByCells>& vs,
82  const std::vector<std::vector<double>>& color) {
83  std::vector<std::vector<int>> color_palette {
84  std::vector({0x00, 0xff, 0x00}), std::vector({0x0f, 0x15, 0x0b}),
85  std::vector({0xff, 0x00, 0x00}), std::vector({0x15, 0x0f, 0x0b}),
86  std::vector({0x00, 0x00, 0xff}), std::vector({0x0b, 0x0f, 0x15}),
87  std::vector({0xff, 0x00, 0xff}), std::vector({0x15, 0x0f, 0x15}),
88  std::vector({0x00, 0xff, 0xff}), std::vector({0x00, 0x15, 0x15}),
89  std::vector({0xff, 0xff, 0x00}), std::vector({0x15, 0x15, 0x00})
90  };
91  const size_t CS = color_palette.size();
92  for (int i = 0; i < vs.size(); ++i) {
93  auto colors = color_linspace(
94  color_palette[(2*i)%CS], color_palette[((2*i)+1)%CS],
95  vs[i].sizeTotal());
96  plot(vs[i], colors);
97  }
98 }
99 
101  const F2CLineString& line, const std::vector<double>& color) {
102  auto comps = getComponents(data2vector(line));
103  auto l = plt::plot(comps[0], comps[1]);
104  if (color.size() >= 3) {
105  l->color(plt::to_array(color));
106  }
107  l->line_width(getLineWidth());
108 }
109 
111  const F2CMultiPoint& multipoint, const std::vector<double>& color) {
112  for (size_t i = 0; i < multipoint.size(); ++i) {
113  plot(multipoint.getGeometry(i), color);
114  }
115 }
116 
118  const F2CMultiLineString& multiline, const std::vector<double>& color) {
119  for (size_t i = 0; i < multiline.size(); ++i) {
120  plot(multiline.getGeometry(i), color);
121  }
122 }
123 
125  const F2CLinearRing& ring, const std::vector<double>& color) {
126  plot(F2CLineString(ring), color);
127 }
128 
130  const F2CCell& cell, const std::vector<double>& color) {
131  for (auto&& r : cell) {
132  plot(r, color);
133  }
134 }
135 
137  const F2CCells& cells, const std::vector<double>& color) {
138  for (auto&& c : cells) {
139  plot(c, color);
140  }
141 }
142 
143 
144 void Visualizer::plot(const std::vector<F2CRoute>& route,
145  const std::vector<std::vector<double>>& color) {
146  std::vector<F2CSwathsByCells> swaths;
147  for (auto&& r : route) {
148  plot(r.asLineString());
149  swaths.emplace_back(r.getVectorSwaths());
150  }
151  plot(swaths, color);
152 }
154  const std::vector<std::vector<double>>& color) {
155  plot(route.asLineString());
156  plot(F2CSwathsByCells(route.getVectorSwaths()), color);
157 }
158 
160  const F2CPath& path, const std::vector<std::vector<double>>& color) {
161  if (path.size() <= 1) {
162  return;
163  }
164 
165  std::vector<std::vector<double>> X(1), Y(1);
166  auto prev_state = path[0].type;
167  auto prev_dir = path[0].dir;
168  for (auto&& s : path) {
169  X.back().emplace_back(s.point.getX());
170  Y.back().emplace_back(s.point.getY());
171  X.back().emplace_back(s.atEnd().getX());
172  Y.back().emplace_back(s.atEnd().getY());
173  if (s.type != prev_state || s.dir != prev_dir) {
174  X.emplace_back();
175  Y.emplace_back();
176  prev_state = s.type;
177  prev_dir = s.dir;
178  }
179  }
180 
181  auto colors = color;
182  if (color.empty()) {
183  colors = color_linspace(
184  std::vector({0x00, 0xff, 0x0}),
185  std::vector({0x15, 0x0f, 0x0b}),
186  X.size());
187  }
188 
189  for (size_t i = 0; i < X.size(); ++i) {
190  auto a = plt::plot(X[i], Y[i]);
191  a->color(plt::to_array(colors[i]));
192  a->line_width(getLineWidth());
193  }
194 }
195 
197  const std::vector<double>& color) {
198  plot(field.getField(), color);
199 }
201  const std::vector<double>& color) {
202  plot(field.getField(), color);
203 }
204 
205 
207  const std::vector<double>& poly_color) {
208  for (auto&& c : cells) {
209  plotFilled(c, poly_color, {1.0, 1.0, 1.0});
210  }
211 }
212 
214  const std::vector<double>& poly_color,
215  const std::vector<double>& holes_color) {
216  for (auto&& c : cells) {
217  plotFilled(c, poly_color, holes_color);
218  }
219 }
220 
222  const std::vector<double>& poly_color) {
223  plotFilled(cell.getExteriorRing(), poly_color);
224 }
225 
227  const std::vector<double>& poly_color,
228  const std::vector<double>& holes_color) {
229  if (cell.size() < 1) {
230  return;
231  }
232  plotFilled(cell.getExteriorRing(), poly_color);
233  for (size_t i = 0; i < cell.size() - 1; ++i) {
234  plotFilled(cell.getInteriorRing(i), holes_color);
235  }
236 }
237 
239  const std::vector<double>& color) {
240  std::vector<double> b_x, b_y;
241  for (auto&& p : ring) {
242  b_x.emplace_back(p.getX());
243  b_y.emplace_back(p.getY());
244  }
245  auto l = plt::polygon(b_x, b_y)->color(plt::to_array(color));
246  l.line_width(getLineWidth());
247 }
248 
249 
251  plt::axis(plt::equal);
252 }
253 
255  plt::figure(true);
256  plt::hold(plt::on);
257  axis_equal();
258 }
259 
260 void Visualizer::figure_size(const unsigned int width, const unsigned int height) {
261  auto cf = plt::gcf(true);
262  if (cf != nullptr) {
263  cf->width(width);
264  cf->height(height);
265  }
266 }
267 
269  plt::show();
270 }
271 
272 void Visualizer::save(const std::string& file) {
273  plt::save(file);
274 }
275 
276 void Visualizer::title(const std::string& text) {
277  plt::title(text);
278 }
279 
280 void Visualizer::xlim(double min, double max) {
281  plt::xlim({min, max});
282 }
283 
284 void Visualizer::ylim(double min, double max) {
285  plt::ylim({min, max});
286 }
287 
288 std::vector<std::vector<double>> Visualizer::getComponents(
289  const std::vector<F2CPoint>& points) {
290  std::vector<double> x, y;
291  std::transform(points.begin(), points.end(), std::back_inserter(x),
292  [](const F2CPoint& c) -> double { return c.getX();});
293  std::transform(points.begin(), points.end(), std::back_inserter(y),
294  [](const F2CPoint& c) -> double { return c.getY();});
295  return {x, y};
296 }
297 
298 std::vector<double> Visualizer::linspace(double min, double max, size_t N) {
299  double h = (max - min) / (N - 1.0);
300  std::vector<double> x(N);
301  for (size_t i = 0; i < N; ++i) {
302  x[i] = min + i * h;
303  }
304  return x;
305 }
306 
307 std::vector<std::vector<double>> Visualizer::color_linspace(
308  const std::vector<int>& min, const std::vector<int>& max,
309  size_t N) {
310  auto v_r = linspace(min[0], max[0], N);
311  auto v_g = linspace(min[1], max[1], N);
312  auto v_b = linspace(min[2], max[2], N);
313  std::vector<std::vector<double>> v;
314  for (size_t i = 0; i < N; ++i) {
315  v.emplace_back(
316  std::vector<double>({v_r[i]/255.0, v_g[i]/255.0, v_b[i]/255.0}));
317  }
318  return v;
319 }
320 
321 
322 } // namespace f2c
f2c::types::Swaths::size
size_t size() const
Definition: Swaths.cpp:78
f2c::types::LineString::getX
double getX(size_t i) const
Definition: LineString.cpp:44
5_route_planning.swaths
swaths
Definition: 5_route_planning.py:58
1_basic_types.cells
cells
Definition: 1_basic_types.py:93
f2c::Visualizer::getLineWidth
static double getLineWidth()
Definition: visualizer.h:22
f2c::Visualizer::plot
static void plot(double x, double y, const std::vector< double > &color={})
Definition: visualizer.cpp:23
2_objective_functions.path
path
Definition: 2_objective_functions.py:88
f2c::Visualizer::linspace
static std::vector< double > linspace(double min, double max, size_t N)
Definition: visualizer.cpp:298
1_basic_types.points
points
Definition: 1_basic_types.py:97
f2c::types::Field
Definition: Field.h:18
1_basic_types.cell
cell
Definition: 1_basic_types.py:88
f2c::Visualizer::data2vector
static std::vector< F2CPoint > data2vector(const T &t)
Definition: visualizer.h:120
f2c::Visualizer::title
static void title(const std::string &text)
Definition: visualizer.cpp:276
f2c::types::Swath
Definition: Swath.h:23
f2c::types::SwathsByCells::sizeTotal
size_t sizeTotal() const
Definition: SwathsByCells.cpp:100
f2c::Visualizer::xlim
static void xlim(double min, double max)
Definition: visualizer.cpp:280
f2c::Visualizer::axis_equal
static void axis_equal()
Definition: visualizer.cpp:250
f2c::types::Swath::getPath
LineString getPath() const
Definition: Swath.cpp:159
f2c::types::MultiLineString
Definition: MultiLineString.h:18
f2c::Visualizer::getComponents
static std::vector< std::vector< double > > getComponents(const std::vector< F2CPoint > &points)
Definition: visualizer.cpp:288
f2c::types::LinearRing
Definition: LinearRing.h:18
5_route_planning.route
route
Definition: 5_route_planning.py:29
f2c::types::Cell
Definition: Cell.h:32
f2c::types::MultiPoint::getGeometry
void getGeometry(size_t i, Point &point)
Definition: MultiPoint.cpp:34
f2c::Visualizer::figure_size
static void figure_size(unsigned int width, unsigned int height)
Change size of current figure.
Definition: visualizer.cpp:260
1_basic_types.ring
ring
Definition: 1_basic_types.py:68
f2c::types::Path
Definition: Path.h:23
2_objective_functions.width
float width
Definition: 2_objective_functions.py:29
visualizer.h
f2c::types::MultiPoint
Definition: MultiPoint.h:18
f2c::types::LineString
Definition: LineString.h:19
f2c::types::MultiLineString::size
size_t size() const
Definition: MultiLineString.cpp:31
f2c::types::SwathsByCells::getSwath
Swath & getSwath(size_t i)
Definition: SwathsByCells.cpp:74
f2c::types::MultiLineString::getGeometry
void getGeometry(size_t i, LineString &line)
Definition: MultiLineString.cpp:71
f2c::types::Cells
Definition: Cells.h:21
F2CLineString
f2c::types::LineString F2CLineString
Definition: types.h:40
f2c::types::Route
Definition: Route.h:23
f2c::types::Point
Definition: Point.h:21
f2c::types::LineString::getY
double getY(size_t i) const
Definition: LineString.cpp:45
f2c::types::LineString::size
size_t size() const
Definition: LineString.cpp:49
2_objective_functions.field
field
Definition: 2_objective_functions.py:16
f2c::types::MultiPoint::size
size_t size() const
Definition: MultiPoint.cpp:30
f2c::Visualizer::show
static void show()
Definition: visualizer.cpp:268
f2c
Main namespace of the fields2cover library.
Definition: boustrophedon_decomp.h:14
f2c::types::SwathsByCells
Definition: SwathsByCells.h:17
f2c::Visualizer::plotFilled
static void plotFilled(const F2CField &field, const std::vector< double > &color={})
Definition: visualizer.cpp:200
f2c::types::Point::getY
double getY() const
Definition: Point.cpp:96
F2CSwathsByCells
f2c::types::SwathsByCells F2CSwathsByCells
Definition: types.h:52
f2c::types::Point::getX
double getX() const
Definition: Point.cpp:95
f2c::Visualizer::figure
static void figure()
Create figure to plot on.
Definition: visualizer.cpp:254
f2c::Visualizer::save
static void save(const std::string &file)
Definition: visualizer.cpp:272
f2c::types::Swaths
Definition: Swaths.h:20
f2c::Visualizer::ylim
static void ylim(double min, double max)
Definition: visualizer.cpp:284
f2c::Visualizer::color_linspace
static std::vector< std::vector< double > > color_linspace(const std::vector< int > &min, const std::vector< int > &max, size_t N)
Definition: visualizer.cpp:307


fields2cover
Author(s):
autogenerated on Fri Apr 25 2025 02:18:31