Go to the documentation of this file.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 StraightLine2DH
00033 #define StraightLine2DH
00034
00035 #include <zeusbase/System/Float.h>
00036 #include <zeusmath/Geometry/Interfaces/IStraightLine2D.hpp>
00037 #include <zeusmath/Geometry/Vector2D.h>
00038
00039
00040 BEGIN_NAMESPACE_Zeus
00041
00042
00043
00046
00047 zeusmath_class TStraightLine2D : public IStraightLine2D
00048 {
00049 public:
00051 inline TStraightLine2D() { initAsAxisX(); }
00052
00054 TStraightLine2D(const IVector2D& rVecInitial, const IVector2D& rVecDirection,
00055 bool bConstructionByPointDirectionForm_Or_By2Points);
00056
00058 TStraightLine2D(const Float& rpSlope, const Float& rfYIntercept);
00059
00061 inline TStraightLine2D(const TStraightLine2D& rStraightLine) { *this = rStraightLine; }
00062
00064 inline TStraightLine2D(const IStraightLine2D& rStraightLine) { *this = rStraightLine; }
00065
00067 virtual inline ~TStraightLine2D() { }
00068
00070 void calcClosestPointTo(const IVector2D& rVecPoint, IVector2D& rVecClosestPoint,
00071 bool bLimited = false, const Float& rfLowerLimit = 0,
00072 const Float& rfUpperLimit = 1) const;
00073
00075 Float calcDistanceTo(const IVector2D& rVecPoint, bool bLimited = false,
00076 const Float& rfLowerLimit = 0, const Float& rfUpperLimit = 1) const;
00077
00078
00080
00081 virtual inline const IVector2D& MQUALIFIER getInitialVector() const { return m_vecInitial; }
00082 virtual inline const IVector2D& MQUALIFIER getDirectionVector() const { return m_vecDirection; }
00083
00084 virtual inline void MQUALIFIER setInitialVector (const IVector2D& rVecInitial) { m_vecInitial = rVecInitial; }
00085 virtual inline void MQUALIFIER setDirectionVector(const IVector2D& rVecDirection) { m_vecDirection = rVecDirection; }
00086
00087 virtual bool MQUALIFIER getSlope(Float& rfSlope) const;
00088 virtual bool MQUALIFIER getYIntercept(Float& rfYIntercept) const;
00089
00090 virtual inline void MQUALIFIER assign(const IStraightLine2D& rStraightLine) { *this = rStraightLine; }
00091
00092 virtual inline void MQUALIFIER initAsAxisX() { *this = getAxisX(); }
00093 virtual inline void MQUALIFIER initAsAxisY() { *this = getAxisY(); }
00094
00095 virtual inline bool MQUALIFIER isAxisX() const { return m_vecInitial.isZeroVector() && m_vecDirection.isCollinear(TVector2D::getUnitVectorX()); }
00096 virtual inline bool MQUALIFIER isAxisY() const { return m_vecInitial.isZeroVector() && m_vecDirection.isCollinear(TVector2D::getUnitVectorY()); }
00097
00098 virtual inline bool MQUALIFIER isValid() const { return !m_vecDirection.isZeroVector(); }
00099
00100 virtual inline bool MQUALIFIER isEqual (const IStraightLine2D& rStraightLine) const { return *this == rStraightLine; }
00101 virtual inline bool MQUALIFIER isParallel(const IStraightLine2D& rStraightLine) const { return *this || rStraightLine; }
00102
00103 virtual inline void MQUALIFIER calcPointFromParameter(const Float& fParameter, IVector2D& rVecPoint) const
00104 { rVecPoint.assign2D(m_vecInitial + m_vecDirection * fParameter); }
00105
00106 virtual bool MQUALIFIER calcParameterFromPoint(const IVector2D& rVecPoint, Float& fParameter) const;
00107
00108 virtual bool MQUALIFIER calcPointAtX(const Float& x, IVector2D& rVecPoint) const;
00109 virtual bool MQUALIFIER calcPointAtY(const Float& y, IVector2D& rVecPoint) const;
00110
00111 virtual bool MQUALIFIER arePointsOnSameSide(const IVector2D& rVecPoint1,
00112 const IVector2D& rVecPoint2) const;
00113
00114
00116
00117 virtual inline const InterfaceID& MQUALIFIER getInterfaceID() const { return m_InterfaceID; }
00118
00119 virtual Retval MQUALIFIER intersect(const IGeometricObject2D& rObject,
00120 IList<IVector2D>& rLstIntersectionPoints,
00121 const Float& rfTangentTolerance = INTERSECT_TANGENT_TOLERANCE) const;
00122
00123 virtual inline bool MQUALIFIER containsPoint(const IVector2D& rVecPoint) const
00124 {
00125 return TFloat::isZero(calcDistanceToPoint(rVecPoint), FLOAT_PRECISION);
00126 }
00127
00128 virtual inline void MQUALIFIER calcClosestPointToPoint(const IVector2D& rVecPoint, IVector2D& rVecClosestPoint) const { calcClosestPointTo(rVecPoint, rVecClosestPoint, false); }
00129
00130 virtual inline Float MQUALIFIER calcDistanceToPoint(const IVector2D& rVecPoint) const { return calcDistanceTo(rVecPoint, false); }
00131 virtual Float MQUALIFIER calcDistanceToObject(const IGeometricObject2D& rObject) const;
00132
00133 virtual Retval MQUALIFIER getXMinPoint(IVector2D& rVecPoint) const;
00134 virtual Retval MQUALIFIER getXMaxPoint(IVector2D& rVecPoint) const;
00135 virtual Retval MQUALIFIER getYMinPoint(IVector2D& rVecPoint) const;
00136 virtual Retval MQUALIFIER getYMaxPoint(IVector2D& rVecPoint) const;
00137
00138 virtual void MQUALIFIER getMinMaxCoordinates(Float& rfXMin, Float& rfXMax,
00139 Float& rfYMin, Float& rfYMax) const;
00140
00141
00143
00145 const TStraightLine2D& operator=(const IStraightLine2D& rStraightLine);
00146
00148 const TStraightLine2D& operator=(const TStraightLine2D& rStraightLine);
00149
00150
00152
00154 bool operator==(const IStraightLine2D& rStraightLine) const;
00155
00157 inline bool operator!=(const IStraightLine2D& rStraightLine) const { return !(*this == rStraightLine); }
00158
00160 bool operator||(const IStraightLine2D& rStraightLine) const;
00161
00162
00164
00165 static inline const TStraightLine2D& getAxisX() { return m_AxisX; }
00166 static inline const TStraightLine2D& getAxisY() { return m_AxisY; }
00167
00168 private:
00170 TVector2D m_vecInitial;
00171 TVector2D m_vecDirection;
00172
00173
00174 static const InterfaceID m_InterfaceID;
00175 static const TStraightLine2D m_AxisX;
00176 static const TStraightLine2D m_AxisY;
00177 };
00178
00179
00180 END_NAMESPACE_Zeus
00181
00182 #endif
00183