Board 0.9.6
Polyline.h
Go to the documentation of this file.
1/* -*- mode: c++ -*- */
26#ifndef BOARD_POLYLINE_H
27#define BOARD_POLYLINE_H
28
30
31namespace LibBoard
32{
33
38struct Polyline : public ShapeWithStyle {
39
40 inline Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, Color penColor = Style::defaultPenColor(), Color fillColor = Style::defaultFillColor(),
42 const LineJoin join = Style::defaultLineJoin());
43
44 inline Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, const Style & style);
45
48
49 inline Polyline(const Path & path, const Style & style);
50
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
258private:
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
264protected:
266 std::vector<Path> _holes;
267};
268
269Polyline 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
273Polyline rectangle(double left, double top, double width, double height, const Style & style);
274
275Polyline 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
278Polyline rectangle(const Rect & rect, const Style & style);
279
280Polyline 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
284Polyline 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
288Polyline triangle(const Point & p1, const Point & p2, const Point & p3, const Style & style);
289
294struct 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
389private:
390 static const std::string _name;
392protected:
397};
398
406Polyline mix(const Polyline & a, const Polyline & b, double time);
407
408} // namespace LibBoard
409
410/*
411 * Inline methods
412 */
413namespace LibBoard
414{
415
416Polyline::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
424Polyline::Polyline(const std::vector<Point> & points, Path::OpenClosed openClosed, const Style & style) //
425 : ShapeWithStyle(style), _path(points, openClosed)
426{
427 _isCreatedRectangle = false;
428}
429
430Polyline::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
437Polyline::Polyline(const Path & path, const Style & style) //
438 : ShapeWithStyle(style), _path(path)
439{
440 _isCreatedRectangle = false;
441}
442
443Polyline::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
450Polyline::Polyline(Path::OpenClosed openClosed, const Style & style) //
451 : ShapeWithStyle(style), _path(openClosed)
452{
453 _isCreatedRectangle = false;
454}
455
456std::size_t Polyline::vertexCount() const
457{
458 return _path.size();
459}
460
461const Path & Polyline::path() const
462{
463 return _path;
464}
465} // namespace LibBoard
466
467#endif /* BOARD_POLYLINE_H */
@copyright This source code is part of the Board project, a C++ library whose purpose is to allow sim...
Structure representing an RGB triple.
Definition Color.h:43
Definition Board.h:55
Path mix(const Path &a, const Path &b, double time)
Interpolate two paths according to a time (0 is a, 1 is b)
Definition Path.cpp:390
LineStyle
Definition Style.h:47
Polyline triangle(const Point &p1, const Point &p2, const Point &p3, Color penColor=Style::defaultPenColor(), Color fillColor=Style::defaultFillColor(), double lineWidth=Style::defaultLineWidth(), const LineStyle lineStyle=Style::defaultLineStyle(), const LineCap cap=Style::defaultLineCap(), const LineJoin join=Style::defaultLineJoin())
Definition Polyline.cpp:610
Polyline rectangle(double left, double top, double width, double height, Color penColor=Style::defaultPenColor(), Color fillColor=Style::defaultFillColor(), double lineWidth=Style::defaultLineWidth(), const LineStyle lineStyle=Style::defaultLineStyle(), const LineCap cap=Style::defaultLineCap(), const LineJoin join=Style::defaultLineJoin())
Definition Polyline.cpp:569
LineCap
Definition Style.h:35
LineWidthFlag
Definition Style.h:57
LineJoin
Definition Style.h:41
A CompositeShapeTransform may be used to duplicate/transform a composite shape tree.
Definition ShapeVisitor.h:104
A ConstShapeVisitor may visit const shapes of a composite shape tree in back-to-front order.
Definition ShapeVisitor.h:79
A triangle with shaded filling according to colors given for each vertex.
Definition Polyline.h:294
Color _color1
Definition Polyline.h:394
void flushSVG(std::ostream &stream, const TransformSVG &transform) const override
Definition Polyline.cpp:542
GouraudTriangle rotated(double angle, const Point &center) const
Definition Polyline.cpp:443
int _subdivisions
Definition Polyline.h:396
void flushFIG(std::ostream &stream, const TransformFIG &transform, std::map< Color, int > &colormap) const override
Definition Polyline.cpp:509
const std::string & name() const override
Definition Polyline.cpp:391
Color _color2
Definition Polyline.h:395
GouraudTriangle resized(double w, double h, LineWidthFlag lineWidthFlag) const
Definition Polyline.cpp:478
GouraudTriangle scaled(double sx, double sy) const
Definition Polyline.cpp:463
GouraudTriangle translated(double dx, double dy) const
Definition Polyline.cpp:458
GouraudTriangle * clone() const override
Definition Polyline.cpp:483
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const override
Definition Polyline.cpp:488
Color _color0
Definition Polyline.h:393
void flushTikZ(std::ostream &stream, const TransformTikZ &transform) const override
Definition Polyline.cpp:563
void scaleAll(double s) override
Definition Polyline.cpp:473
GouraudTriangle & rotate(double angle, const Point &center) override
Definition Polyline.cpp:437
A path, according to Postscript and SVG definition.
Definition Path.h:45
std::size_t size() const
The number of points in the path.
Definition Path.h:448
OpenClosed
The OpenClosed enum.
Definition Path.h:53
Struct representing a 2D point.
Definition Point.h:42
A polygonal line described by a series of 2D points.
Definition Polyline.h:38
Polyline(const Polyline &)=default
void flushSVG(std::ostream &stream, const TransformSVG &transform) const override
Definition Polyline.cpp:243
Polyline rotated(double angle, const Point &center) const
Definition Polyline.cpp:72
Polyline * clone() const override
Definition Polyline.cpp:158
Polyline(const std::vector< Point > &points, Path::OpenClosed openClosed, Color penColor=Style::defaultPenColor(), Color fillColor=Style::defaultFillColor(), double lineWidth=Style::defaultLineWidth(), const LineStyle lineStyle=Style::defaultLineStyle(), const LineCap cap=Style::defaultLineCap(), const LineJoin join=Style::defaultLineJoin())
Definition Polyline.h:416
void setRectangleFlag()
Definition Polyline.cpp:163
Polyline & operator<<(const Point &p)
Definition Polyline.cpp:55
Polyline translated(double dx, double dy) const
Definition Polyline.cpp:99
Polyline resized(double w, double h, LineWidthFlag lineWidthFlag) const
Definition Polyline.cpp:147
Polyline & scale(double sx, double sy) override
Definition Polyline.cpp:104
Polyline & operator=(const Polyline &)=default
const Point & operator[](const std::size_t n) const
Definition Polyline.h:85
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const override
Definition Polyline.cpp:168
void flushTikZ(std::ostream &stream, const TransformTikZ &transform) const override
Definition Polyline.cpp:287
virtual void accept(ShapeVisitor &visitor) override
Accepts a visitor object.
Definition Polyline.cpp:299
const Path & path() const
Definition Polyline.h:461
Polyline & operator=(Polyline &&)=default
Polyline(Polyline &&)=default
std::vector< Path > _holes
Definition Polyline.h:266
Polyline & rotate(double angle, const Point &center) override
Definition Polyline.cpp:61
void flushFIG(std::ostream &stream, const TransformFIG &transform, std::map< Color, int > &colormap) const override
Definition Polyline.cpp:202
const std::string & name() const override
Definition Polyline.cpp:50
Rect boundingBox(LineWidthFlag) const override
Definition Polyline.cpp:328
Point & operator[](const std::size_t n)
Definition Polyline.h:77
Polyline & translate(double dx, double dy) override
Definition Polyline.cpp:88
~Polyline() override=default
void scaleAll(double s) override
Definition Polyline.cpp:137
void addHole(const Path &path)
Add a hole to the path. Warning: Hole share the polyline line style.
Definition Polyline.cpp:152
Polyline scaled(double sx, double sy) const
Definition Polyline.cpp:127
std::size_t vertexCount() const
Definition Polyline.h:456
Path _path
Definition Polyline.h:265
Struct representing a rectangle on the plane.
Definition Rect.h:40
A ShapeVisitor visits all shapes in a composite shape tree in back-to-front order.
Definition ShapeVisitor.h:54
Abstract structure for a 2D shape.
Definition ShapeWithStyle.h:38
const Color & penColor() const
Definition ShapeWithStyle.h:143
Style style() const
Definition ShapeWithStyle.h:215
double lineWidth() const
Definition ShapeWithStyle.h:165
const Color & fillColor() const
Definition ShapeWithStyle.h:154
LineStyle lineStyle() const
Definition ShapeWithStyle.h:176
Abstract structure for a 2D shape.
Definition Shape.h:64
virtual Point center(LineWidthFlag lineWidthFlag=IgnoreLineWidth) const
Definition Shape.cpp:59
Definition Style.h:69
static const Color & defaultPenColor()
defaultPenColor
Definition Style.h:279
static const Color & defaultFillColor()
defaultFillColor
Definition Style.h:284
static const double & defaultLineWidth()
defaultLineWidth
Definition Style.h:274
static const LineStyle & defaultLineStyle()
defaultLineStyle
Definition Style.h:289
static const LineCap & defaultLineCap()
defaultLineCap
Definition Style.h:294
static const LineJoin & defaultLineJoin()
defaultLineJoin
Definition Style.h:299
Structure representing a scaling and translation suitable for an EPS output.
Definition Transforms.h:71
Structure representing a scaling and translation suitable for an XFig output.
Definition Transforms.h:87
Structure representing a scaling and translation suitable for an SVG output.
Definition Transforms.h:109
Structure representing a scaling and translation suitable for an TikZ output.
Definition Transforms.h:126