DGtal 1.3.0
Loading...
Searching...
No Matches
Path.cpp
1/* -*- mode: c++ -*- */
9/*
10 * \@copyright This File is part of the Board library which is
11 * licensed under the terms of the GNU Lesser General Public Licence.
12 * See the LICENCE file for further details.
13 */
14
15#include "Board/Path.h"
16#include "Board/Transforms.h"
17
18
19namespace LibBoard {
20
21Path &
23{
24 _points.pop_back();
25 return *this;
26}
27
29Path::operator<<( const Point & p )
30{
31 _points.push_back( p );
32 return *this;
33}
34
36Path::center() const {
37 Rect bbox = boundingBox();
38 return Point( bbox.left + bbox.width/2.0,
39 bbox.top - bbox.height/2.0 );
40}
41
42Path &
43Path::rotate( double angle, const Point & rotCenter )
44{
45 std::vector<Point>::iterator i = _points.begin();
46 std::vector<Point>::iterator end = _points.end();
47 while ( i != end ) {
48 i->rotate( angle, rotCenter );
49 ++i;
50 }
51 return *this;
52}
53
54Path
55Path::rotated( double angle, const Point & rotCenter ) const
56{
57 Path res(*this);
58 std::vector<Point>::iterator i = res._points.begin();
59 std::vector<Point>::iterator end = res._points.end();
60 while ( i != end ) {
61 i->rotate( angle, rotCenter );
62 ++i;
63 }
64 return res;
65}
66
67Path &
68Path::rotate( double angle )
69{
70 return Path::rotate( angle, center() );
71}
72
73Path
74Path::rotated( double angle ) const
75{
76 Path res(*this);
77 return static_cast<Path&>( res.rotate( angle, center() ) );
78}
79
80Path &
81Path::translate( double dx, double dy )
82{
83 std::vector<Point>::iterator i = _points.begin();
84 std::vector<Point>::iterator end = _points.end();
85 Point delta( dx, dy );
86 while ( i != end ) {
87 (*i) += delta;
88 ++i;
89 }
90 return *this;
91}
92
93Path
94Path::translated( double dx, double dy ) const
95{
96 Path res(*this);
97 std::vector<Point>::iterator i = res._points.begin();
98 std::vector<Point>::iterator end = res._points.end();
99 Point delta( dx, dy );
100 while ( i != end ) {
101 (*i) += delta;
102 ++i;
103 }
104 return res;
105}
106
107Path &
108Path::scale( double sx, double sy )
109{
110 Point c = center();
111 translate( -c.x, -c.y );
112 std::vector<Point>::iterator i = _points.begin();
113 std::vector<Point>::iterator end = _points.end();
114 while ( i != end ) {
115 i->x *= sx;
116 i->y *= sy;
117 ++i;
118 }
119 Point delta = c - center();
120 translate( delta.x, delta.y );
121 return *this;
122}
123
124Path &
125Path::scale( double s )
126{
127 return Path::scale( s, s );
128}
129
130Path
131Path::scaled( double sx, double sy ) const
132{
133 return Path(*this).scale( sx, sy );
134}
135
136Path
137Path::scaled( double s) const
138{
139 return Path(*this).scale( s, s );
140}
141
142void
143Path::scaleAll( double s )
144{
145 std::vector<Point>::iterator it = _points.begin();
146 std::vector<Point>::iterator end = _points.end();
147 while ( it != end ) {
148 (*it) *= s;
149 ++it;
150 }
151}
152
153void
154Path::flushPostscript( std::ostream & stream,
155 const TransformEPS & transform ) const
156{
157 if ( _points.empty() )
158 return;
159 std::vector<Point>::const_iterator i = _points.begin();
160 std::vector<Point>::const_iterator end = _points.end();
161
162 stream << transform.mapX( i->x ) << " " << transform.mapY( i->y ) << " m";
163 ++i;
164 while ( i != end ) {
165 stream << " " << transform.mapX( i->x ) << " " << transform.mapY( i->y ) << " l";
166 ++i;
167 }
168 if ( _closed ) stream << " cp";
169 stream << " ";
170}
171
172void
173Path::flushFIG( std::ostream & stream,
174 const TransformFIG & transform ) const
175{
176 if ( _points.empty() )
177 return;
178
179 std::vector<Point>::const_iterator i = _points.begin();
180 std::vector<Point>::const_iterator end = _points.end();
181 while ( i != end ) {
182 stream << " " << static_cast<int>( transform.mapX( i->x ) )
183 << " " << static_cast<int>( transform.mapY( i->y ) );
184 ++i;
185 }
186 if ( _closed ) {
187 stream << " " << static_cast<int>( transform.mapX( _points.begin()->x ) )
188 << " " << static_cast<int>( transform.mapY( _points.begin()->y ) );
189 }
190}
191
192void
193Path::flushSVGCommands( std::ostream & stream,
194 const TransformSVG & transform ) const
195{
196 if ( _points.empty() )
197 return;
198 std::vector<Point>::const_iterator i = _points.begin();
199 std::vector<Point>::const_iterator end = _points.end();
200 int count = 0;
201
202 stream << "M " << transform.mapX( i->x ) << " " << transform.mapY( i->y );
203 ++i;
204 while ( i != end ) {
205 stream << " L " << transform.mapX( i->x ) << " " << transform.mapY( i->y );
206 ++i;
207 count = ( count + 1 ) % 6;
208 if ( !count ) stream << "\n ";
209 }
210 if ( _closed )
211 stream << " Z" << std::endl;
212}
213
214void
215Path::flushSVGPoints( std::ostream & stream,
216 const TransformSVG & transform ) const
217{
218 if ( _points.empty() )
219 return;
220 std::vector<Point>::const_iterator i = _points.begin();
221 std::vector<Point>::const_iterator end = _points.end();
222 int count = 0;
223 stream << transform.mapX( i->x ) << "," << transform.mapY( i->y );
224 ++i;
225 while ( i != end ) {
226 stream << " " << transform.mapX( i->x ) << "," << transform.mapY( i->y );
227 ++i;
228 count = ( count + 1 ) % 6;
229 if ( !count ) stream << "\n ";
230 }
231}
232
233#ifdef WITH_CAIRO
234void
236 const TransformCairo & transform ) const
237{
238 if ( _points.empty() )
239 return;
240 std::vector<Point>::const_iterator i = _points.begin();
241 std::vector<Point>::const_iterator end = _points.end();
242 int count = 0;
243 cairo_move_to (cr, transform.mapX( i->x ), transform.mapY( i->y ));
244 ++i;
245 while ( i != end ) {
246 cairo_line_to (cr, transform.mapX( i->x ), transform.mapY( i->y ));
247 ++i;
248 count = ( count + 1 ) % 6;
249 //if ( !count ) stream << "\n ";
250 }
251}
252#endif
253
254void
255Path::flushTikZPoints( std::ostream & stream,
256 const TransformTikZ & transform ) const
257{
258 if ( _points.empty() )
259 return;
260 std::vector<Point>::const_iterator i = _points.begin();
261 std::vector<Point>::const_iterator end = _points.end();
262 stream << '(' << transform.mapX( i->x ) << "," << transform.mapY( i->y ) << ')';
263 ++i;
264 while ( i != end ) {
265 stream << " -- "
266 << '(' << transform.mapX( i->x ) << "," << transform.mapY( i->y ) << ')';
267 ++i;
268 }
269}
270
271Rect
273{
274 if ( _points.empty() )
275 return Rect( 0, 0, 0, 0 );
276 Rect rect;
277 std::vector< Point >::const_iterator i = _points.begin();
278 std::vector< Point >::const_iterator end = _points.end();
279 rect.top = i->y;
280 rect.left = i->x;
281 rect.width = 0.0;
282 rect.height = 0.0;
283 ++i;
284 while ( i != end ) {
285 if ( i->x < rect.left ) {
286 double dw = rect.left - i->x;
287 rect.left = i->x;
288 rect.width += dw;
289 } else if ( i->x > rect.left + rect.width ) {
290 rect.width = i->x - rect.left;
291 }
292 if ( i->y > rect.top ) {
293 double dh = i->y - rect.top;
294 rect.top = i->y;
295 rect.height += dh;
296 } else if ( i->y < rect.top - rect.height ) {
297 rect.height = rect.top - i->y;
298 }
299 ++i;
300 }
301 return rect;
302}
303
304} // namespace LibBoard
A path, according to Postscript and SVG definition.
Definition: Path.h:43
Path translated(double dx, double dy) const
Definition: Path.cpp:94
void flushCairoPoints(cairo_t *cr, const TransformCairo &transform) const
Definition: Path.cpp:235
Path & pop_back()
Definition: Path.cpp:22
bool _closed
Definition: Path.h:227
std::vector< Point > _points
Definition: Path.h:226
Path & scale(double sx, double sy)
Definition: Path.cpp:108
void flushFIG(std::ostream &stream, const TransformFIG &transform) const
Definition: Path.cpp:173
Path & operator<<(const Point &p)
Definition: Path.cpp:29
Point center() const
Definition: Path.cpp:36
void flushSVGPoints(std::ostream &stream, const TransformSVG &transform) const
Definition: Path.cpp:215
void scaleAll(double s)
Definition: Path.cpp:143
Path scaled(double sx, double sy) const
Definition: Path.cpp:131
Rect boundingBox() const
Definition: Path.cpp:272
Path rotated(double angle, const Point &center) const
Definition: Path.cpp:55
Path & translate(double dx, double dy)
Definition: Path.cpp:81
void flushPostscript(std::ostream &stream, const TransformEPS &transform) const
Definition: Path.cpp:154
void flushSVGCommands(std::ostream &stream, const TransformSVG &transform) const
Definition: Path.cpp:193
void flushTikZPoints(std::ostream &stream, const TransformTikZ &transform) const
Definition: Path.cpp:255
Path & rotate(double angle, const Point &center)
Definition: Path.cpp:43
Struct representing a 2D point.
Definition: Point.h:27
double y
Definition: Point.h:30
double x
Definition: Point.h:29
Struct representing a rectangle on the plane.
Definition: Rect.h:26
double height
Definition: Rect.h:31
double width
Definition: Rect.h:30
double left
Definition: Rect.h:28
double top
Definition: Rect.h:29
Structure representing a scaling and translation suitable for an Cairo output.
Definition: Transforms.h:112
Structure representing a scaling and translation suitable for an EPS output.
Definition: Transforms.h:59
Structure representing a scaling and translation suitable for an XFig output.
Definition: Transforms.h:73
Structure representing a scaling and translation suitable for an SVG output.
Definition: Transforms.h:95
Structure representing a scaling and translation suitable for an TikZ output.
Definition: Transforms.h:129