X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fbase%2Frs_arc.h;h=974d97ee119471558434e0104b1bd82f08c091e9;hb=d774c2655ba2c3657a565f325411144452392277;hp=50886af1a5a8fe2a4738572ae17c921aad6f2b22;hpb=16ce54abf01ca3032e42a5bb11a4afcf9014dcca;p=architektonas diff --git a/src/base/rs_arc.h b/src/base/rs_arc.h index 50886af..974d97e 100644 --- a/src/base/rs_arc.h +++ b/src/base/rs_arc.h @@ -4,246 +4,141 @@ #include "rs_atomicentity.h" class PaintInterface; +class GraphicView; /** * Holds the data that defines an arc. */ -class RS_ArcData { -public: - RS_ArcData() {} - - RS_ArcData(const Vector& center, - double radius, - double angle1, double angle2, - bool reversed) { - - this->center = center; - this->radius = radius; - this->angle1 = angle1; - this->angle2 = angle2; - this->reversed = reversed; - } - - void reset() { - center = Vector(false); - radius = 0.0; - angle1 = 0.0; - angle2 = 0.0; - reversed = false; - } - - bool isValid() { - return (center.valid && radius>RS_TOLERANCE && - fabs(angle1-angle2)>RS_TOLERANCE_ANGLE); - } - - friend std::ostream& operator << (std::ostream& os, const RS_ArcData& ad) { - os << "(" << ad.center << - "/" << ad.radius << - " " << ad.angle1 << - "," << ad.angle2 << - ")"; - return os; - } - -public: - Vector center; - double radius; - double angle1; - double angle2; - bool reversed; -}; +class RS_ArcData +{ + public: + RS_ArcData() + { + } + + RS_ArcData(const Vector & center, double radius, double angle1, double angle2, bool reversed) + { + this->center = center; + this->radius = radius; + this->angle1 = angle1; + this->angle2 = angle2; + this->reversed = reversed; + } + + void reset() + { + center = Vector(false); + radius = 0.0; + angle1 = 0.0; + angle2 = 0.0; + reversed = false; + } + + bool isValid() + { + return (center.valid && radius > RS_TOLERANCE + && fabs(angle1 - angle2) > RS_TOLERANCE_ANGLE); + } + friend std::ostream & operator<<(std::ostream & os, const RS_ArcData & ad) + { + os << "(" << ad.center + << "/" << ad.radius + << " " << ad.angle1 + << "," << ad.angle2 + << ")"; + return os; + } + public: + Vector center; + double radius; + double angle1; + double angle2; + bool reversed; +}; /** * Class for an arc entity. All angles are in Rad. * * @author Andrew Mustun */ -class RS_Arc : public RS_AtomicEntity { -public: - RS_Arc(RS_EntityContainer* parent, - const RS_ArcData& d); - virtual ~RS_Arc() {} - - virtual RS_Entity* clone() { - RS_Arc* a = new RS_Arc(*this); - a->initId(); - return a; - } - - /** @return RS2::EntityArc */ - virtual RS2::EntityType rtti() const { - return RS2::EntityArc; - } - /** @return true */ - virtual bool isEdge() const { - return true; - } - - /** @return Copy of data that defines the arc. **/ - RS_ArcData getData() const { - return data; - } - - virtual VectorSolutions getRefPoints(); - - /** Sets new arc parameters. **/ - void setData(RS_ArcData d) { - data = d; - } - - /** @return The center point (x) of this arc */ - Vector getCenter() const { - return data.center; - } - /** Sets new center. */ - void setCenter(const Vector& c) { - data.center = c; - } - - /** @return The radius of this arc */ - double getRadius() const { - return data.radius; - } - /** Sets new radius. */ - void setRadius(double r) { - data.radius = r; - } - - /** @return The start angle of this arc */ - double getAngle1() const { - return data.angle1; - } - /** Sets new start angle. */ - void setAngle1(double a1) { - data.angle1 = a1; - } - /** @return The end angle of this arc */ - double getAngle2() const { - return data.angle2; - } - /** Sets new end angle. */ - void setAngle2(double a2) { - data.angle2 = a2; - } - /** - * @return Direction 1. The angle at which the arc starts at - * the startpoint. - */ - double getDirection1() const { - if (!data.reversed) { - return RS_Math::correctAngle(data.angle1+M_PI/2.0); - } - else { - return RS_Math::correctAngle(data.angle1-M_PI/2.0); - } - } - /** - * @return Direction 2. The angle at which the arc starts at - * the endpoint. - */ - double getDirection2() const { - if (!data.reversed) { - return RS_Math::correctAngle(data.angle2-M_PI/2.0); - } - else { - return RS_Math::correctAngle(data.angle2+M_PI/2.0); - } - } - - /** - * @retval true if the arc is reversed (clockwise), - * @retval false otherwise - */ - bool isReversed() const { - return data.reversed; - } - /** sets the reversed status. */ - void setReversed(bool r) { - data.reversed = r; - } - - /** @return Start point of the entity. */ - virtual Vector getStartpoint() const { - return startpoint; - } - /** @return End point of the entity. */ - virtual Vector getEndpoint() const { - return endpoint; - } - virtual void moveStartpoint(const Vector& pos); - virtual void moveEndpoint(const Vector& pos); - - virtual void trimStartpoint(const Vector& pos); - virtual void trimEndpoint(const Vector& pos); - - virtual RS2::Ending getTrimPoint(const Vector& coord, - const Vector& trimPoint); - - virtual void reverse(); - - Vector getMiddlepoint() const; - double getAngleLength() const; - virtual double getLength(); - double getBulge() const; - - bool createFrom3P(const Vector& p1, const Vector& p2, - const Vector& p3); - bool createFrom2PDirectionRadius(const Vector& startPoint, const Vector& endPoint, - double direction1, double radius); - bool createFrom2PBulge(const Vector& startPoint, const Vector& endPoint, - double bulge); - - virtual Vector getNearestEndpoint(const Vector& coord, - double* dist = NULL); - virtual Vector getNearestPointOnEntity(const Vector& coord, - bool onEntity = true, double* dist = NULL, RS_Entity** entity=NULL); - virtual Vector getNearestCenter(const Vector& coord, - double* dist = NULL); - virtual Vector getNearestMiddle(const Vector& coord, - double* dist = NULL); - virtual Vector getNearestDist(double distance, - const Vector& coord, - double* dist = NULL); - virtual Vector getNearestDist(double distance, - bool startp); - - virtual double getDistanceToPoint(const Vector& coord, - RS_Entity** entity=NULL, - RS2::ResolveLevel level=RS2::ResolveNone, - double solidDist = RS_MAXDOUBLE); - virtual void move(Vector offset); - virtual void rotate(Vector center, double angle); - virtual void scale(Vector center, Vector factor); - virtual void mirror(Vector axisPoint1, Vector axisPoint2); - virtual void moveRef(const Vector& ref, const Vector& offset); - virtual void stretch(Vector firstCorner, - Vector secondCorner, - Vector offset); - -// virtual void draw(RS_Painter* painter, RS_GraphicView* view, double patternOffset=0.0); - virtual void draw(PaintInterface * painter, RS_GraphicView * view, double patternOffset = 0.0); - - friend std::ostream & operator<<(std::ostream & os, const RS_Arc & a); - - virtual void calculateEndpoints(); - virtual void calculateBorders(); - -protected: - RS_ArcData data; - - /** - * Startpoint. This is redundant but stored for performance - * reasons. - */ - Vector startpoint; - /** - * Endpoint. This is redundant but stored for performance - * reasons. - */ - Vector endpoint; +class RS_Arc: public RS_AtomicEntity +{ + public: + RS_Arc(RS_EntityContainer * parent, const RS_ArcData & d); + virtual ~RS_Arc(); + + virtual RS_Entity * clone(); + virtual RS2::EntityType rtti() const; + virtual bool isEdge() const; + RS_ArcData getData() const; + virtual VectorSolutions getRefPoints(); + void setData(RS_ArcData d); + Vector getCenter() const; + void setCenter(const Vector & c); + double getRadius() const; + void setRadius(double r); + double getAngle1() const; + void setAngle1(double a1); + double getAngle2() const; + void setAngle2(double a2); + double getDirection1() const; + double getDirection2() const; + bool isReversed() const; + void setReversed(bool r); + virtual Vector getStartpoint() const; + virtual Vector getEndpoint() const; + virtual void moveStartpoint(const Vector & pos); + virtual void moveEndpoint(const Vector & pos); + virtual void trimStartpoint(const Vector & pos); + virtual void trimEndpoint(const Vector & pos); + virtual RS2::Ending getTrimPoint(const Vector & coord, const Vector & trimPoint); + virtual void reverse(); + Vector getMiddlepoint() const; + double getAngleLength() const; + virtual double getLength(); + double getBulge() const; + + bool createFrom3P(const Vector & p1, const Vector & p2, const Vector & p3); + bool createFrom2PDirectionRadius(const Vector & startPoint, const Vector & endPoint, double direction1, double radius); + bool createFrom2PBulge(const Vector & startPoint, const Vector & endPoint, double bulge); + + virtual Vector getNearestEndpoint(const Vector & coord, double * dist = NULL); + virtual Vector getNearestPointOnEntity(const Vector & coord, bool onEntity = true, double * dist = NULL, RS_Entity ** entity = NULL); + virtual Vector getNearestCenter(const Vector & coord, double * dist = NULL); + virtual Vector getNearestMiddle(const Vector & coord, double * dist = NULL); + virtual Vector getNearestDist(double distance, const Vector & coord, double * dist = NULL); + virtual Vector getNearestDist(double distance, bool startp); + + virtual double getDistanceToPoint(const Vector & coord, RS_Entity * * entity = NULL, RS2::ResolveLevel level = RS2::ResolveNone, double solidDist = RS_MAXDOUBLE); + virtual void move(Vector offset); + virtual void rotate(Vector center, double angle); + virtual void scale(Vector center, Vector factor); + virtual void mirror(Vector axisPoint1, Vector axisPoint2); + virtual void moveRef(const Vector & ref, const Vector & offset); + virtual void stretch(Vector firstCorner, Vector secondCorner, Vector offset); + + virtual void draw(PaintInterface * painter, GraphicView * view, double patternOffset = 0.0); + + friend std::ostream & operator<<(std::ostream & os, const RS_Arc & a); + + virtual void calculateEndpoints(); + virtual void calculateBorders(); + + protected: + RS_ArcData data; + + /** + * Startpoint. This is redundant but stored for performance + * reasons. + */ + Vector startpoint; + /** + * Endpoint. This is redundant but stored for performance + * reasons. + */ + Vector endpoint; }; #endif