00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Vector.h"
00026 #include "cinder/BSpline.h"
00027 #include "cinder/Rect.h"
00028 #include <vector>
00029
00030 namespace cinder {
00031
00032 class Path2d {
00033 public:
00034 Path2d() : mClosed( false ) {}
00035 explicit Path2d( const BSpline<Vec2f> &spline, float subdivisionStep = 0.01f );
00036
00037 void moveTo( const Vec2f &p );
00038 void moveTo( float x, float y ) { moveTo( Vec2f( x, y ) ); }
00039 void lineTo( const Vec2f &p );
00040 void lineTo( float x, float y ) { lineTo( Vec2f( x, y ) ); }
00041 void quadTo( const Vec2f &p1, const Vec2f &p2 );
00042 void quadTo( float x1, float y1, float x2, float y2 ) { quadTo( Vec2f( x1, y1 ), Vec2f( x2, y2 ) ); }
00043 void curveTo( const Vec2f &p1, const Vec2f &p2, const Vec2f &p3 );
00044 void curveTo( float x1, float y1, float x2, float y2, float x3, float y3 ) { curveTo( Vec2f( x1, y1 ), Vec2f( x2, y2 ), Vec2f( x3, y3 ) ); }
00045
00046 void close() { mClosed = true; }
00047 bool isClosed() const { return mClosed; }
00048
00049 bool empty() const { return mSegments.empty(); }
00050 void clear() { mSegments.clear(); mPoints.clear(); }
00051 size_t getNumSegments() const { return mSegments.size(); }
00052 size_t getNumPoints() const { return mPoints.size(); }
00053
00054 const Vec2f& getPoint( size_t point ) const { return mPoints[point]; }
00055 const Vec2f& getCurrentPoint() const { return mPoints.back(); }
00056 void setPoint( size_t index, const Vec2f &p ) { mPoints[index] = p; }
00057
00058 void removeSegment( size_t segment );
00059
00060 enum SegmentType { MOVETO, LINETO, QUADTO, CUBICTO, CLOSE };
00061 static const int sSegmentTypePointCounts[];
00062 SegmentType getSegmentType( size_t segment ) const { return mSegments[segment]; }
00063
00064 friend class Shape2d;
00065
00066 private:
00067 bool mClosed;
00068 std::vector<Vec2f> mPoints;
00069 std::vector<SegmentType> mSegments;
00070 };
00071
00072 }