Board 0.9.6
Bezier.h
Go to the documentation of this file.
1/* -*- mode: c++ -*- */
26#ifndef BOARD_BEZIER_H
27#define BOARD_BEZIER_H
28
30
31// TODO : Add a merge (+=) operation to link to bezier curve
32
33namespace LibBoard
34{
35
42struct Bezier : public ShapeWithStyle {
43
57 Bezier(const std::vector<Point> & points, const std::vector<Point> & controls, //
60 const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
61
69 Bezier(const std::vector<Point> & points, const std::vector<Point> & controls, //
70 const Style & style);
71
86 Bezier(Point p0, Point control0, Point p1, Point control1, //
89 const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
90
100 Bezier(Point p0, Point control0, Point p1, Point control1, //
101 const Style & style);
102
121 Bezier(double x0, double y0, double xc0, double yc0, double x1, double y1, double xc1, double yc1, //
124 const LineCap cap = Style::defaultLineCap(), const LineJoin join = Style::defaultLineJoin());
125
139 Bezier(double x0, double y0, double xc0, double yc0, double x1, double y1, double xc1, double yc1, //
140 const Style & style);
141
147 const std::string & name() const override;
148
156 Bezier & rotate(double angle, const Point & center) override;
157
164 Bezier rotated(double angle, const Point & center) const;
165
171 Bezier & rotate(double angle) override;
172
178 Bezier rotated(double angle) const;
179
187 Bezier & translate(double dx, double dy) override;
188
196 Bezier translated(double dx, double dy) const;
197
205 Bezier & scale(double sx, double sy) override;
206
213 Bezier & scale(double s) override;
214
222 Bezier scaled(double sx, double sy) const;
223
230 Bezier scaled(double s) const;
231
238 void scaleAll(double s) override;
239
248 Bezier resized(double w, double h, LineWidthFlag lineWidthFlag) const;
249
250 void flushPostscript(std::ostream & stream, const TransformEPS & transform) const override;
251
252 void flushFIG(std::ostream & stream, const TransformFIG & transform, std::map<Color, int> & colormap) const override;
253
254 void flushSVG(std::ostream & stream, const TransformSVG & transform) const override;
255
256 void flushTikZ(std::ostream & stream, const TransformTikZ & transform) const override;
257
263 virtual void accept(ShapeVisitor & visitor) override;
264
270 virtual void accept(const ShapeVisitor & visitor) override;
271
277 virtual void accept(ConstShapeVisitor & visitor) const override;
278
284 virtual void accept(const ConstShapeVisitor & visitor) const override;
285
291 virtual Shape * accept(CompositeShapeTransform & transform) const override;
292
298 virtual Shape * accept(const CompositeShapeTransform & transform) const override;
299
304 Rect boundingBox(LineWidthFlag) const override;
305
310 Bezier * clone() const override;
311
316 inline const Path & path() const;
317
322 inline const Path & controls() const;
323
328 Path discretizedPath() const;
329
334 std::vector<Point> pathThroughLocalExtremums() const;
335
341 Bezier & operator+=(const Bezier & other);
342
348 Bezier operator+(const Bezier & other) const;
349
357 static Bezier smoothedPolyline(const std::vector<Point> & path, double roundness, const Style & style = Style::defaultStyle());
358
366 static Bezier smoothedPolyline(const Path & path, double roundness, const Style & style = Style::defaultStyle());
367
377 static Bezier interpolation(const Point & a, const Point & b, const Point & c, const Point & d, const Style & style = Style::defaultStyle());
378
385 Point eval(Path::size_type interval, double t) const;
386
387 Bezier(const Bezier &) = default;
388 Bezier(Bezier &&) = default;
389 Bezier & operator=(Bezier &&) = default;
390 Bezier & operator=(const Bezier &) = default;
391 ~Bezier() override = default;
392
393private:
394 Point eval(const Point & p0, const Point & p1, const Point & p2, const Point & p3, double t) const;
395 static const std::string _name;
397protected:
400};
401
402// Inline methods
403
404const Path & Bezier::path() const
405{
406 return _path;
407}
408
409const Path & Bezier::controls() const
410{
411 return _controls;
412}
413
414} // namespace LibBoard
415
416#endif /* BOARD_BEZIER_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
LineStyle
Definition Style.h:47
LineCap
Definition Style.h:35
LineWidthFlag
Definition Style.h:57
LineJoin
Definition Style.h:41
A Bezier curve described by two series of 2D points (curve points and control points).
Definition Bezier.h:42
const Path & controls() const
The series of control points points defining the curve, as a path.
Definition Bezier.h:409
const Path & path() const
The series of points defining the curve, as a path.
Definition Bezier.h:404
Bezier(Bezier &&)=default
const std::string & name() const override
Definition Bezier.cpp:107
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const override
Definition Bezier.cpp:473
std::vector< Point > pathThroughLocalExtremums() const
A path through local extremums.
Definition Bezier.cpp:269
Bezier operator+(const Bezier &other) const
Concatenate two Bezier curves.
Definition Bezier.cpp:386
~Bezier() override=default
Rect boundingBox(LineWidthFlag) const override
Return the bounding box of the curve.
Definition Bezier.cpp:617
Point eval(Path::size_type interval, double t) const
Get a point of the curve given its interval between two curve points and a position in [0....
Definition Bezier.cpp:463
Bezier * clone() const override
Return a copy of the curve.
Definition Bezier.cpp:205
Bezier & operator=(const Bezier &)=default
Bezier scaled(double sx, double sy) const
Definition Bezier.cpp:184
Bezier & scale(double sx, double sy) override
Definition Bezier.cpp:148
Bezier & operator+=(const Bezier &other)
Add points and crontrol points of another curve.
Definition Bezier.cpp:354
Bezier rotated(double angle, const Point &center) const
Rotated copy of the curve.
Definition Bezier.cpp:119
void flushSVG(std::ostream &stream, const TransformSVG &transform) const override
Definition Bezier.cpp:546
Path _controls
Definition Bezier.h:399
Bezier(const Bezier &)=default
static Bezier smoothedPolyline(const std::vector< Point > &path, double roundness, const Style &style=Style::defaultStyle())
Build a Bezier curve as a 'rounded' version of a Polyline.
Definition Bezier.cpp:391
Bezier & operator=(Bezier &&)=default
Bezier translated(double dx, double dy) const
Definition Bezier.cpp:143
void scaleAll(double s) override
Definition Bezier.cpp:194
void flushFIG(std::ostream &stream, const TransformFIG &transform, std::map< Color, int > &colormap) const override
Definition Bezier.cpp:537
Bezier & translate(double dx, double dy) override
Definition Bezier.cpp:136
static Bezier interpolation(const Point &a, const Point &b, const Point &c, const Point &d, const Style &style=Style::defaultStyle())
Bezier interpolation passing through 4 points.
Definition Bezier.cpp:447
virtual void accept(ShapeVisitor &visitor) override
Accepts a visitor object.
Definition Bezier.cpp:587
void flushTikZ(std::ostream &stream, const TransformTikZ &transform) const override
Definition Bezier.cpp:579
Bezier resized(double w, double h, LineWidthFlag lineWidthFlag) const
Definition Bezier.cpp:200
Path discretizedPath() const
A sequence of properly spaced points approximating the curve.
Definition Bezier.cpp:327
Bezier & rotate(double angle, const Point &center) override
Rotate the Bezier curve.
Definition Bezier.cpp:112
Path _path
Definition Bezier.h:398
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 path, according to Postscript and SVG definition.
Definition Path.h:45
std::vector< Point >::size_type size_type
Definition Path.h:47
Struct representing a 2D point.
Definition Point.h:42
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 Style & defaultStyle()
defaultStyle
Definition Style.h:269
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