You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
2.3 KiB
C

1 month ago
#ifndef XJ_POINT2D_
#define XJ_POINT2D_
#include "dllExport.h"
#include "Common.h"
#include <math.h>
//2ά<32><CEAC>
class XJ_ALGO_EXPORT Point2D
{
public:
Point2D() : _x(0.0), _y(0.0){}
~Point2D() {}
typedef double Standard_Real;
Point2D(Standard_Real X, Standard_Real Y) : _x(X), _y(Y){}
inline Standard_Real& x() {return _x;}
inline Standard_Real& y() {return _y;}
inline Standard_Real x() const { return _x; }
inline Standard_Real y() const { return _y; }
bool IsZero() {return (xjdef::equivalent(_x, 0.0) && xjdef::equivalent(_y, 0.0));}
void set(Standard_Real X, Standard_Real Y) {_x = X; _y = Y;}
inline Point2D& operator = (const Point2D& rhs)
{
set(rhs.x(), rhs.y());
return *this;
}
//<2F>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
inline Point2D operator + (const Point2D& rhs) const
{
return Point2D(_x + rhs.x(), _y + rhs.y());
}
inline Point2D& operator += (const Point2D& rhs)
{
_x += rhs.x();
_y += rhs.y();
return *this;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline Point2D operator - ( const Point2D& rhs) const //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>const<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>const <20><><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>ʹ<EFBFBD><CAB9>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>벻ͨ<EBB2BB><CDA8>
{
return Point2D(_x-rhs.x(), _y-rhs.y());
}
inline Point2D& operator -= (const Point2D& rhs)
{
_x -= rhs.x();
_y -= rhs.y();
return *this;
}
//<2F>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD>
inline double operator * (const Point2D& rhs) const
{
return _x*rhs.x() + _y*rhs.y();
}
inline Point2D operator * (double rhs) const
{
return Point2D(_x*rhs, _y*rhs);
}
inline Point2D& operator *= (double rhs)
{
_x *= rhs;
_y *= rhs;
return *this;
}
inline Point2D operator / (double rhs) const
{
return Point2D(_x/rhs, _y/rhs);
}
inline bool operator == (const Point2D& rhs) const {return _x == rhs.x() && _y == rhs.y();}
//<2F><><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ
inline double Magnitude() const
{
return sqrt(_x * _x + _y * _y);
}
inline void Normalize()
{
double length = Magnitude();
if(length == 0.0)
return;
_x = _x / length;
_y = _y / length;
}
//<2F><><EFBFBD><EFBFBD>ά<EFBFBD>ռ<EFBFBD><D5BC>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
double Distance(const Point2D& other) const;
//<2F><>ά<EFBFBD><EFBFBD><E3B5BD>ά<EFBFBD><CEAC><EFBFBD>ϵ<EFBFBD>ͶӰ<CDB6><D3B0>
Point2D Perpendicular(Point2D lineBase, Point2D linedir) const;
private:
Standard_Real _x;
Standard_Real _y;
};
//global functions
/// Multiplication of scalar with vector.
inline Point2D operator * (float rhs, const Point2D& rvs)
{
return Point2D(rvs.x()*rhs, rvs.y()*rhs);
}
#endif