00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef Arc2DH
00033 #define Arc2DH
00034
00035 #include <zeusmath/Geometry/Interfaces/IArc2D.hpp>
00036 #include <zeusmath/Geometry/Circle2D.h>
00037 #include <zeusmath/System/Angle.h>
00038
00039
00040 BEGIN_NAMESPACE_Zeus
00041
00042
00043
00046
00047 zeusmath_class TArc2D : public IArc2D
00048 {
00049 public:
00051 inline TArc2D() { }
00052
00054 TArc2D(const IVector2D& rVecCenter, const Float& rfRadius,
00055 const IAngle& rStartAngle, const IAngle& rEndAngle,
00056 bool bAnglesAreGivenCounterClockwise);
00057
00059 TArc2D(const ICircle2D& rCircle, const IAngle& rStartAngle,
00060 const IAngle& rEndAngle, bool bAnglesAreGivenCounterClockwise);
00061
00063 inline TArc2D(const TArc2D& rArc) { *this = rArc; }
00064
00066 inline TArc2D(const IArc2D& rArc) { *this = rArc; }
00067
00069 static bool createFrom3Points(const IVector2D& rVecStartPoint,
00070 const IVector2D& rVecEndPoint,
00071 const IVector2D& rVecIntermediatePoint,
00072 IArc2D& rArc);
00073
00075 static bool createFrom2PointsRadiusAndFlags(const IVector2D& rVecStartPoint,
00076 const IVector2D& rVecEndPoint,
00077 const Float& rfRadius,
00078 bool bPointsAreGivenCounterClockwise,
00079 bool bShorterArc, IArc2D& rArc,
00080 const Float& rfTangentTolerance =
00081 INTERSECT_TANGENT_TOLERANCE);
00082
00084 static bool createFrom2PointsAndCenter(const IVector2D& rVecStartPoint,
00085 const IVector2D& rVecEndPoint,
00086 const IVector2D& rVecCenter,
00087 bool bPointsAreGivenCounterClockwise,
00088 IArc2D& rArc);
00089
00090
00092
00093 virtual inline ~TArc2D() { }
00094
00095
00097
00098 virtual inline ICircle2D& MQUALIFIER getCircle() { return m_Circle; }
00099 virtual inline const ICircle2D& MQUALIFIER getCircleConst() const { return m_Circle; }
00100
00101 virtual inline void MQUALIFIER setCircle(const ICircle2D& rCircle) { m_Circle = rCircle; }
00102
00103 virtual inline const IVector2D& MQUALIFIER getCenter() const { return getCircleConst().getCenter(); }
00104 virtual inline void MQUALIFIER setCenter(const IVector2D& rVecCenter) { getCircle().setCenter(rVecCenter); }
00105
00106 virtual inline const Float& MQUALIFIER getRadius() const { return getCircleConst().getRadius(); }
00107 virtual inline void MQUALIFIER setRadius(const Float& rfRadius) { getCircle().setRadius(rfRadius); }
00108
00109 virtual inline const IAngle& MQUALIFIER getStartAngle() const { return m_StartAngle; }
00110 virtual inline const IAngle& MQUALIFIER getEndAngle() const { return m_EndAngle; }
00111 virtual void MQUALIFIER setStartAngle(const IAngle& rStartAngle);
00112 virtual void MQUALIFIER setEndAngle (const IAngle& rEndAngle);
00113
00114 virtual void MQUALIFIER setAngles(const IAngle& rStartAngle, const IAngle& rEndAngle,
00115 bool bAnglesAreGivenCounterClockwise);
00116
00117 virtual void MQUALIFIER switchAngles();
00118
00119 virtual void MQUALIFIER getStartPoint(IVector2D& rVecStart) const;
00120 virtual void MQUALIFIER getEndPoint(IVector2D& rVecEnd) const;
00121 virtual Float MQUALIFIER getLength() const;
00122 virtual void MQUALIFIER createSupplementArc(IArc2D& rSupplementArc) const;
00123 virtual bool MQUALIFIER isShorterThanSupplementArc() const;
00124
00125 virtual inline void MQUALIFIER assign(const IArc2D& rArc) { *this = rArc; }
00126
00127 virtual inline bool MQUALIFIER isEqual(const IArc2D& rArc) const { return *this == rArc; }
00128
00129 virtual bool MQUALIFIER containsAngle(const IAngle& rAngle,
00130 bool bIncludeStartAndEndPoints = true) const;
00131
00132 virtual bool MQUALIFIER containsPoint2(const IVector2D& rVecPoint,
00133 bool bIncludeStartAndEndPoints = true) const;
00134
00135 virtual void MQUALIFIER moveStartPointOnCircle(const Float& rfDistance, bool bCounterClockwise);
00136 virtual void MQUALIFIER moveEndPointOnCircle(const Float& rfDistance, bool bCounterClockwise);
00137
00138
00139
00140
00142 static Retval calcArcsTangentTo2StraightLines(const IStraightLine2D& rStraightLine1,
00143 const IStraightLine2D& rStraightLine2,
00144 const Float& rfRadius,
00145 IList<IArc2D>& rLstTangentArcs,
00146 const Float& rfTangentTolerance =
00147 INTERSECT_TANGENT_TOLERANCE);
00148
00150 static Retval calcArcsTangentToStraightLineAndCircle(const IStraightLine2D& rStraightLine,
00151 const ICircle2D& rCircle,
00152 const Float& rfRadius,
00153 IList<IArc2D>& rLstTangentArcs,
00154 const Float& rfTangentTolerance =
00155 INTERSECT_TANGENT_TOLERANCE);
00156
00158 static Retval calcArcsTangentTo2Circles(const ICircle2D& rCircle1,
00159 const ICircle2D& rCircle2,
00160 const Float& rfRadius,
00161 IList<IArc2D>& rLstTangentArcs,
00162 const Float& rfTangentTolerance =
00163 INTERSECT_TANGENT_TOLERANCE);
00164
00166 static Retval calcArcsTangentTo2LineSegments(const ILineSegment2D& rLineSegment1,
00167 const ILineSegment2D& rLineSegment2,
00168 const Float& rfRadius,
00169 IList<IArc2D>& rLstTangentArcs,
00170 const Float& rfTangentTolerance =
00171 INTERSECT_TANGENT_TOLERANCE);
00172
00174 static Retval calcArcsTangentToLineSegmentAndArc(const ILineSegment2D& rLineSegment,
00175 const IArc2D& rArc,
00176 const Float& rfRadius,
00177 IList<IArc2D>& rLstTangentArcs,
00178 const Float& rfTangentTolerance =
00179 INTERSECT_TANGENT_TOLERANCE);
00180
00182 static Retval calcArcsTangentTo2Arcs(const IArc2D& rArc1, const IArc2D& rArc2,
00183 const Float& rfRadius,
00184 IList<IArc2D>& rLstTangentArcs,
00185 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00186
00187
00189
00190 virtual inline const InterfaceID& MQUALIFIER getInterfaceID() const { return m_InterfaceID; }
00191
00192 virtual Retval MQUALIFIER intersect(const IGeometricObject2D& rObject,
00193 IList<IVector2D>& rLstIntersectionPoints,
00194 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE) const;
00195
00196 virtual inline bool MQUALIFIER containsPoint(const IVector2D& rVecPoint) const { return containsPoint2(rVecPoint, true); }
00197
00198 virtual void MQUALIFIER calcClosestPointToPoint(const IVector2D& rVecPoint,
00199 IVector2D& rVecClosestPoint) const;
00200
00201 virtual Float MQUALIFIER calcDistanceToPoint(const IVector2D& rVecPoint) const;
00202 virtual Float MQUALIFIER calcDistanceToObject(const IGeometricObject2D& rObject) const;
00203
00204 virtual Retval MQUALIFIER getXMinPoint(IVector2D& rVecPoint) const;
00205 virtual Retval MQUALIFIER getXMaxPoint(IVector2D& rVecPoint) const;
00206 virtual Retval MQUALIFIER getYMinPoint(IVector2D& rVecPoint) const;
00207 virtual Retval MQUALIFIER getYMaxPoint(IVector2D& rVecPoint) const;
00208
00209 virtual void MQUALIFIER getMinMaxCoordinates(Float& rfXMin, Float& rfXMax,
00210 Float& rfYMin, Float& rfYMax) const;
00211
00212
00214
00216 const TArc2D& operator=(const IArc2D& rArc);
00217
00219 const TArc2D& operator=(const TArc2D& rArc);
00220
00221
00223
00224
00226 bool operator==(const IArc2D& rArc) const;
00227
00229 inline bool operator!=(const IArc2D& rArc) const { return !(*this == rArc); }
00230
00231 private:
00233 static void createFrom2PointsCenterAndRadius(const IVector2D& rVecStartPoint,
00234 const IVector2D& rVecEndPoint,
00235 const IVector2D& rVecCenter,
00236 const Float& rfRadius,
00237 bool bPointsAreGivenCounterClockwise,
00238 IArc2D& rArc);
00239
00241 static bool transformTangentCirclesToArcs(const IList<ICircle2D>& rLstTangentCircles,
00242 const IGeometricObject2D& rObject1,
00243 const IGeometricObject2D& rObject2,
00244 IList<IArc2D>& rLstTangentArcs,
00245 const Float& rfTangentTolerance =
00246 INTERSECT_TANGENT_TOLERANCE);
00247
00248 private:
00249
00250 TCircle2D m_Circle;
00251
00252
00253 TAngle m_StartAngle;
00254 TAngle m_EndAngle;
00255
00256
00257 static const InterfaceID m_InterfaceID;
00258 };
00259
00260
00261 END_NAMESPACE_Zeus
00262
00263 #endif
00264