Board  0.9.5
Polyline.h
Go to the documentation of this file.
1 /* -*- mode: c++ -*- */
26 #ifndef BOARD_POLYLINE_H
27 #define BOARD_POLYLINE_H
28 
29 #include "board/ShapeWithStyle.h"
30 
31 namespace LibBoard
32 {
33 
38 struct Polyline : public ShapeWithStyle {
39 
40  inline Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(),
41  double lineWidth = Style::defaultLineWidth(), const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(),
42  const LineJoin join = Style::defaultLineJoin());
43 
44  inline Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, const Style & style);
45 
46  inline Polyline(const Path & path, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(), double lineWidth = Style::defaultLineWidth(),
47  const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
48 
49  inline Polyline(const Path & path, const Style & style);
50 
51  inline Polyline(Path::OpenClosed openClosed, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(), double lineWidth = Style::defaultLineWidth(),
52  const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
53 
54  inline Polyline(Path::OpenClosed openClosed, const Style & style);
55 
61  const std::string & name() const override;
62 
70  Polyline & operator<<(const Point & p);
71 
77  Point & operator[](const std::size_t n) { return _path[n]; }
78 
85  const Point & operator[](const std::size_t n) const { return _path[n]; }
86 
87  Polyline & rotate(double angle, const Point & center) override;
88 
97  Polyline rotated(double angle, const Point & center) const;
98 
99  Polyline & rotate(double angle) override;
100 
108  Polyline rotated(double angle) const;
109 
118  Polyline & translate(double dx, double dy) override;
119 
128  Polyline translated(double dx, double dy) const;
129 
138  Polyline & scale(double sx, double sy) override;
139 
147  Polyline & scale(double s) override;
148 
157  Polyline scaled(double sx, double sy) const;
158 
166  Polyline scaled(double s) const;
167 
174  void scaleAll(double s) override;
175 
184  Polyline resized(double w, double h, LineWidthFlag lineWidthFlag) const;
185 
190  void addHole(const Path & path);
191 
192  void flushPostscript(std::ostream & stream, const TransformEPS & transform) const override;
193 
194  void flushFIG(std::ostream & stream, const TransformFIG & transform, std::map<Color, int> & colormap) const override;
195 
196  void flushSVG(std::ostream & stream, const TransformSVG & transform) const override;
197 
198  void flushTikZ(std::ostream & stream, const TransformTikZ & transform) const override;
199 
205  virtual void accept(ShapeVisitor & visitor) override;
206 
212  virtual void accept(const ShapeVisitor & visitor) override;
213 
219  virtual void accept(ConstShapeVisitor & visitor) const override;
220 
226  virtual void accept(const ConstShapeVisitor & visitor) const override;
227 
233  virtual Shape * accept(CompositeShapeTransform & transform) const override;
234 
240  virtual Shape * accept(const CompositeShapeTransform & transform) const override;
241 
242  Rect boundingBox(LineWidthFlag) const override;
243 
244  Polyline * clone() const override;
245 
246  inline std::size_t vertexCount() const;
247 
248  inline const Path & path() const;
249 
250  void setRectangleFlag();
251 
252  Polyline(const Polyline &) = default;
253  Polyline(Polyline &&) = default;
254  Polyline & operator=(Polyline &&) = default;
255  Polyline & operator=(const Polyline &) = default;
256  ~Polyline() override = default;
257 
258 private:
259  static const std::string _name;
260  bool _isCreatedRectangle;
261  void flushRectangleFIG(std::ostream & stream, const TransformFIG & transform, std::map<Color, int> & colormap) const;
262  void flushRectangleSVG(std::ostream & stream, const TransformSVG & transform) const;
263 
264 protected:
265  Path _path;
266  std::vector<Path> _holes;
267 };
268 
269 Polyline rectangle(double left, double top, double width, double height, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(),
270  double lineWidth = Style::defaultLineWidth(), const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(),
271  const LineJoin join = Style::defaultLineJoin());
272 
273 Polyline rectangle(double left, double top, double width, double height, const Style & style);
274 
275 Polyline rectangle(const Rect & rect, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(), double lineWidth = Style::defaultLineWidth(),
276  const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
277 
278 Polyline rectangle(const Rect & rect, const Style & style);
279 
280 Polyline triangle(const Point & p1, const Point & p2, const Point & p3, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(),
281  double lineWidth = Style::defaultLineWidth(), const LineStyle lineStyle = Style::defaultLineStyle(), const LineCap cap = Style::defaultLineCap(),
282  const LineJoin join = Style::defaultLineJoin());
283 
284 Polyline triangle(const double x1, const double y1, const double x2, const double y2, const double x3, const double y3, Color penColor = Style::defaultPenColor(),
285  Color fillColor = Style::defaultFillColor(), double lineWidth = Style::defaultLineWidth(), const LineStyle lineStyle = Style::defaultLineStyle(),
286  const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
287 
288 Polyline triangle(const Point & p1, const Point & p2, const Point & p3, const Style & style);
289 
294 struct GouraudTriangle : public Polyline {
295 
296  GouraudTriangle(const Point & p0, const Color & color0, const Point & p1, const Color & color1, const Point & p2, const Color & color2, int subdivisions);
297 
298  GouraudTriangle(const Point & p0, float brightness0, const Point & p1, float brightness1, const Point & p2, float brightness2, const Color & fillColor, int subdivisions);
299 
305  const std::string & name() const override;
306 
307  GouraudTriangle & rotate(double angle, const Point & center) override;
308 
309  GouraudTriangle rotated(double angle, const Point & center) const;
310 
311  GouraudTriangle & rotate(double angle) override;
312 
313  GouraudTriangle rotated(double angle) const;
314 
323  GouraudTriangle translated(double dx, double dy) const;
324 
333  GouraudTriangle scaled(double sx, double sy) const;
334 
342  GouraudTriangle scaled(double s) const;
343 
350  void scaleAll(double s) override;
351 
360  GouraudTriangle resized(double w, double h, LineWidthFlag lineWidthFlag) const;
361 
368  void flushPostscript(std::ostream & stream, const TransformEPS & transform) const override;
369 
381  void flushFIG(std::ostream & stream, const TransformFIG & transform, std::map<Color, int> & colormap) const override;
382 
383  void flushSVG(std::ostream & stream, const TransformSVG & transform) const override;
384 
385  void flushTikZ(std::ostream & stream, const TransformTikZ & transform) const override;
386 
387  GouraudTriangle * clone() const override;
388 
389 private:
390  static const std::string _name;
392 protected:
393  Color _color0;
394  Color _color1;
395  Color _color2;
396  int _subdivisions;
397 };
398 
406 Polyline mid(const Polyline & a, const Polyline & b, double time);
407 
408 } // namespace LibBoard
409 
410 /*
411  * Inline methods
412  */
413 namespace LibBoard
414 {
415 
416 Polyline::Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, //
417  Color penColor, Color fillColor, double lineWidth, //
418  const LineStyle lineStyle, const LineCap cap, const LineJoin join)
419  : ShapeWithStyle(penColor, fillColor, lineWidth, lineStyle, cap, join), _path(points, openClosed)
420 {
421  _isCreatedRectangle = false;
422 }
423 
424 Polyline::Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, const Style & style) //
425  : ShapeWithStyle(style), _path(points, openClosed)
426 {
427  _isCreatedRectangle = false;
428 }
429 
430 Polyline::Polyline(const Path & path, Color penColor, Color fillColor, //
431  double lineWidth, const LineStyle lineStyle, const LineCap cap, const LineJoin join)
432  : ShapeWithStyle(penColor, fillColor, lineWidth, lineStyle, cap, join), _path(path)
433 {
434  _isCreatedRectangle = false;
435 }
436 
437 Polyline::Polyline(const Path & path, const Style & style) //
438  : ShapeWithStyle(style), _path(path)
439 {
440  _isCreatedRectangle = false;
441 }
442 
443 Polyline::Polyline(Path::OpenClosed openClosed, Color penColor, Color fillColor, double lineWidth, //
444  const LineStyle lineStyle, const LineCap cap, const LineJoin join)
445  : ShapeWithStyle(penColor, fillColor, lineWidth, lineStyle, cap, join), _path(openClosed)
446 {
447  _isCreatedRectangle = false;
448 }
449 
450 Polyline::Polyline(Path::OpenClosed openClosed, const Style & style) //
451  : ShapeWithStyle(style), _path(openClosed)
452 {
453  _isCreatedRectangle = false;
454 }
455 
456 std::size_t Polyline::vertexCount() const
457 {
458  return _path.size();
459 }
460 
461 const Path & Polyline::path() const
462 {
463  return _path;
464 }
465 } // namespace LibBoard
466 
467 #endif /* BOARD_POLYLINE_H */
LibBoard::Polyline::boundingBox
Rect boundingBox(LineWidthFlag) const override
Definition: Polyline.cpp:328
LibBoard::Style::defaultPenColor
static const Color & defaultPenColor()
defaultPenColor
Definition: Style.h:281
LibBoard::Style
Definition: Style.h:69
LibBoard::Polyline::scale
Polyline & scale(double sx, double sy) override
Definition: Polyline.cpp:104
ShapeWithStyle.h
@copyright This source code is part of the Board project, a C++ library whose purpose is to allow sim...
LibBoard::Style::defaultLineWidth
static const double & defaultLineWidth()
defaultLineWidth
Definition: Style.h:276
LibBoard::Polyline
A polygonal line described by a series of 2D points.
Definition: Polyline.h:38
LibBoard::Polyline::operator<<
Polyline & operator<<(const Point &p)
Definition: Polyline.cpp:55
LibBoard::Polyline::flushTikZ
void flushTikZ(std::ostream &stream, const TransformTikZ &transform) const override
Definition: Polyline.cpp:287
LibBoard::GouraudTriangle::scaled
GouraudTriangle scaled(double sx, double sy) const
Definition: Polyline.cpp:463
LibBoard::GouraudTriangle::resized
GouraudTriangle resized(double w, double h, LineWidthFlag lineWidthFlag) const
Definition: Polyline.cpp:478
LibBoard::Polyline::flushFIG
void flushFIG(std::ostream &stream, const TransformFIG &transform, std::map< Color, int > &colormap) const override
Definition: Polyline.cpp:202
LibBoard::mid
Path mid(const Path &a, const Path &b, double time)
Definition: Path.cpp:387
LibBoard::GouraudTriangle::flushPostscript
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const override
Definition: Polyline.cpp:488
LibBoard::Polyline::name
const std::string & name() const override
Definition: Polyline.cpp:50
LibBoard::GouraudTriangle::rotate
GouraudTriangle & rotate(double angle, const Point &center) override
Definition: Polyline.cpp:437
LibBoard::Rect
Struct representing a rectangle on the plane.
Definition: Rect.h:39
LibBoard::GouraudTriangle::clone
GouraudTriangle * clone() const override
Definition: Polyline.cpp:483
LibBoard::Polyline::rotated
Polyline rotated(double angle, const Point &center) const
Definition: Polyline.cpp:72
LibBoard::Style::defaultFillColor
static const Color & defaultFillColor()
defaultFillColor
Definition: Style.h:286
LibBoard::GouraudTriangle::scaleAll
void scaleAll(double s) override
Definition: Polyline.cpp:473
LibBoard::Polyline::operator[]
Point & operator[](const std::size_t n)
Definition: Polyline.h:77
LibBoard::Polyline::translate
Polyline & translate(double dx, double dy) override
Definition: Polyline.cpp:88
LibBoard::CompositeShapeTransform
A CompositeShapeTransform may be used to duplicate/transform a composite shape tree.
Definition: ShapeVisitor.h:103
LibBoard::Polyline::scaleAll
void scaleAll(double s) override
Definition: Polyline.cpp:137
LibBoard::Point
Struct representing a 2D point.
Definition: Point.h:42
LibBoard::Polyline::resized
Polyline resized(double w, double h, LineWidthFlag lineWidthFlag) const
Definition: Polyline.cpp:147
LibBoard::TransformEPS
Structure representing a scaling and translation suitable for an EPS output.
Definition: Transforms.h:71
LibBoard::Style::defaultLineCap
static const LineCap & defaultLineCap()
defaultLineCap
Definition: Style.h:296
LibBoard::Shape
Abstract structure for a 2D shape.
Definition: Shape.h:63
LibBoard::GouraudTriangle
A triangle with shaded filling according to colors given for each vertex.
Definition: Polyline.h:294
LibBoard::ConstShapeVisitor
A ConstShapeVisitor may visit const shapes of a composite shape tree in back-to-front order.
Definition: ShapeVisitor.h:78
LibBoard::GouraudTriangle::flushTikZ
void flushTikZ(std::ostream &stream, const TransformTikZ &transform) const override
Definition: Polyline.cpp:563
LibBoard::Path
A path, according to Postscript and SVG definition.
Definition: Path.h:45
LibBoard::Polyline::flushPostscript
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const override
Definition: Polyline.cpp:168
LibBoard::Polyline::flushSVG
void flushSVG(std::ostream &stream, const TransformSVG &transform) const override
Definition: Polyline.cpp:243
LibBoard::GouraudTriangle::flushFIG
void flushFIG(std::ostream &stream, const TransformFIG &transform, std::map< Color, int > &colormap) const override
Definition: Polyline.cpp:509
LibBoard::Polyline::translated
Polyline translated(double dx, double dy) const
Definition: Polyline.cpp:99
LibBoard::TransformTikZ
Structure representing a scaling and translation suitable for an TikZ output.
Definition: Transforms.h:126
LibBoard::Polyline::operator[]
const Point & operator[](const std::size_t n) const
Definition: Polyline.h:85
LibBoard::Polyline::rotate
Polyline & rotate(double angle, const Point &center) override
Definition: Polyline.cpp:61
LibBoard::TransformFIG
Structure representing a scaling and translation suitable for an XFig output.
Definition: Transforms.h:87
LibBoard::Shape::center
virtual Point center(LineWidthFlag lineWidthFlag=IgnoreLineWidth) const
Definition: Shape.cpp:59
LibBoard::Polyline::addHole
void addHole(const Path &path)
Add a hole to the path. Warning: Hole share the polyline line style.
Definition: Polyline.cpp:152
LibBoard::Polyline::scaled
Polyline scaled(double sx, double sy) const
Definition: Polyline.cpp:127
LibBoard::GouraudTriangle::translated
GouraudTriangle translated(double dx, double dy) const
Definition: Polyline.cpp:458
LibBoard::Style::defaultLineJoin
static const LineJoin & defaultLineJoin()
defaultLineJoin
Definition: Style.h:301
LibBoard::Polyline::clone
Polyline * clone() const override
Definition: Polyline.cpp:158
LibBoard::Style::defaultLineStyle
static const LineStyle & defaultLineStyle()
defaultLineStyle
Definition: Style.h:291
LibBoard::GouraudTriangle::flushSVG
void flushSVG(std::ostream &stream, const TransformSVG &transform) const override
Definition: Polyline.cpp:542
LibBoard::GouraudTriangle::name
const std::string & name() const override
Definition: Polyline.cpp:391
LibBoard::ShapeVisitor
A ShapeVisitor visits all shapes in a composite shape tree in back-to-front order.
Definition: ShapeVisitor.h:53
LibBoard::Polyline::accept
virtual void accept(ShapeVisitor &visitor) override
Accepts a visitor object.
Definition: Polyline.cpp:299
LibBoard::TransformSVG
Structure representing a scaling and translation suitable for an SVG output.
Definition: Transforms.h:109
LibBoard::Color
Structure representing an RGB triple.
Definition: Color.h:43
LibBoard::ShapeWithStyle
Abstract structure for a 2D shape.
Definition: ShapeWithStyle.h:38