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 Circle2DH
00033 #define Circle2DH
00034
00035 #include <zeusmath/Geometry/Interfaces/ICircle2D.hpp>
00036 #include <zeusmath/Geometry/Vector2D.h>
00037
00038
00039 BEGIN_NAMESPACE_Zeus
00040
00041
00042
00043 class IArc2D;
00044 class ILineSegment2D;
00045 class IStraightLine2D;
00046 class TStraightLine2D;
00047
00048
00051
00052 zeusmath_class TCircle2D : public ICircle2D
00053 {
00054 public:
00056 inline TCircle2D() { setRadius(1); }
00057
00059 TCircle2D(const IVector2D& rVecCenter, const Float& rfRadius);
00060
00062 inline TCircle2D(const TCircle2D& rCircle) { *this = rCircle; }
00063
00065 inline TCircle2D(const ICircle2D& rCircle) { *this = rCircle; }
00066
00068 static bool createFrom3Points(const IVector2D& rVecPoint1,
00069 const IVector2D& rVecPoint2,
00070 const IVector2D& rVecPoint3, ICircle2D& rCircle);
00071
00073 virtual inline ~TCircle2D() { }
00074
00075
00077
00078 virtual inline const IVector2D& MQUALIFIER getCenter() const { return m_vecCenter; }
00079 virtual inline void MQUALIFIER setCenter(const IVector2D& rVecCenter) { m_vecCenter = rVecCenter; }
00080 virtual inline const Float& MQUALIFIER getRadius() const { return m_fRadius; }
00081 virtual inline void MQUALIFIER setRadius(const Float& rfRadius) { m_fRadius = ::fabs(rfRadius); }
00082 virtual inline void MQUALIFIER assign(const ICircle2D& rCircle) { *this = rCircle; }
00083 virtual inline bool MQUALIFIER isEqual(const ICircle2D& rCircle) const { return *this == rCircle; }
00084 virtual void MQUALIFIER calcPointFromAngle(const IAngle& rAngle, IVector2D& rVecPoint) const;
00085 virtual bool MQUALIFIER calcAngleFromPoint(const IVector2D& rVecPoint, IAngle& rAngle) const;
00086
00087 virtual bool MQUALIFIER isPointInside(const IVector2D& rVecPoint) const;
00088
00089
00091
00093 static Retval calcCirclesTangentTo2StraightLines(const IStraightLine2D& rStraightLine1,
00094 const IStraightLine2D& rStraightLine2,
00095 const Float& rfRadius,
00096 IList<ICircle2D>& rLstTangentCircles,
00097 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00098
00100 static Retval calcCirclesTangentToStraightLineAndCircle(const IStraightLine2D& rStraightLine,
00101 const ICircle2D& rCircle,
00102 const Float& rfRadius,
00103 IList<ICircle2D>& rLstTangentCircles,
00104 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00105
00107 static Retval calcCirclesTangentTo2Circles(const ICircle2D& rCircle1,
00108 const ICircle2D& rCircle2,
00109 const Float& rfRadius,
00110 IList<ICircle2D>& rLstTangentCircles,
00111 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00112
00114 static Retval calcCirclesTangentTo2LineSegments(const ILineSegment2D& rLineSegment1,
00115 const ILineSegment2D& rLineSegment2,
00116 const Float& rfRadius,
00117 IList<ICircle2D>& rLstTangentCircles,
00118 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00119
00121 static Retval calcCirclesTangentToLineSegmentAndArc(const ILineSegment2D& rLineSegment,
00122 const IArc2D& rArc,
00123 const Float& rfRadius,
00124 IList<ICircle2D>& rLstTangentCircles,
00125 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00126
00128 static Retval calcCirclesTangentTo2Arcs(const IArc2D& rArc1, const IArc2D& rArc2,
00129 const Float& rfRadius,
00130 IList<ICircle2D>& rLstTangentCircles,
00131 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00132
00133
00135
00136 virtual inline const InterfaceID& MQUALIFIER getInterfaceID() const { return m_InterfaceID; }
00137
00138 virtual Retval MQUALIFIER intersect(const IGeometricObject2D& rObject,
00139 IList<IVector2D>& rLstIntersectionPoints,
00140 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE) const;
00141
00142 virtual bool MQUALIFIER containsPoint(const IVector2D& rVecPoint) const;
00143
00144 virtual void MQUALIFIER calcClosestPointToPoint(const IVector2D& rVecPoint,
00145 IVector2D& rVecClosestPoint) const;
00146
00147 virtual Float MQUALIFIER calcDistanceToPoint(const IVector2D& rVecPoint) const;
00148 virtual Float MQUALIFIER calcDistanceToObject(const IGeometricObject2D& rObject) const;
00149
00150 virtual Retval MQUALIFIER getXMinPoint(IVector2D& rVecPoint) const;
00151 virtual Retval MQUALIFIER getXMaxPoint(IVector2D& rVecPoint) const;
00152 virtual Retval MQUALIFIER getYMinPoint(IVector2D& rVecPoint) const;
00153 virtual Retval MQUALIFIER getYMaxPoint(IVector2D& rVecPoint) const;
00154
00155 virtual void MQUALIFIER getMinMaxCoordinates(Float& rfXMin, Float& rfXMax,
00156 Float& rfYMin, Float& rfYMax) const;
00157
00158
00160
00162 const TCircle2D& operator=(const ICircle2D& rCircle);
00163
00165 const TCircle2D& operator=(const TCircle2D& rCircle);
00166
00167
00169
00171 bool operator==(const ICircle2D& rCircle) const;
00172
00174 inline bool operator!=(const ICircle2D& rCircle) const { return !(*this == rCircle); }
00175
00176 private:
00178 static void calcTangentCircleCenterRestrictions(const IStraightLine2D& rStraightLine,
00179 const Float& rfRadius,
00180 IStraightLine2D& rRestrictionLine1,
00181 IStraightLine2D& rRestrictionLine2);
00182
00184 static void calcTangentCircleCenterRestrictions(const ICircle2D& rCircle,
00185 const Float& rfRadius,
00186 ICircle2D& rRestrictionCircle1,
00187 ICircle2D& rRestrictionCircle2);
00188
00190 static Int calcCirclesTangentTo2GeometricObjects(
00191 const IList<const IGeometricObject2D*>& rLstCenterRestrictions1,
00192 const IList<const IGeometricObject2D*>& rLstCenterRestrictions2,
00193 const Float& rfRadius, IList<ICircle2D>& rLstTangentCircles,
00194 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE);
00195
00197 static bool checkTangentCase(const TVector2D& rVec1, const TVector2D& rVec2,
00198 const Float& rfTangentTolerance,
00199 IList<IVector2D>& rLstIntersectionPoints);
00200
00201 private:
00203 TVector2D m_vecCenter;
00204
00206 Float m_fRadius;
00207
00208
00209 static const InterfaceID m_InterfaceID;
00210 };
00211
00212
00213 END_NAMESPACE_Zeus
00214
00215 #endif
00216