// Base class
class PointXY;
class PointXYZ;
class Point
{
public:
virtual Point() = 0;
virtual Point operator+(const Point &pt) = 0;
virtual Point operator-(const Point &pt) = 0;
virtual Point operator*(const Point &pt) = 0;
virtual Point operator*(double dScale) = 0;
//virtual Point operator/(double dScale) = 0;
virtual double Normalize() = 0;
virtual double GetLength() = 0;
virtual ~Point() = 0;
};
// 2D Point
class PointXY : public Point
{
public:
PointXY()
{
x = 0;
y = 0;
}
PointXY(double a, double b)
{
x = a;
y = b;
}
PointXY(const PointXY &pt)
{
x = pt.x;
y = pt.y;
}
PointXY(const PointXYZ &pt)
{
x = pt.x;
y = pt.y;
}
PointXY operator+(const PointXY &pt)
{
PointXY ptTmp;
ptTmp.x = x + pt.x;
ptTmp.y = y + pt.y;
return ptTmp;
}
PointXY operator-(const PointXY &pt)
{
PointXY ptTmp;
ptTmp.x = x - pt.x;
ptTmp.y = y - pt.y;
return ptTmp;
}
PointXY operator*(const PointXY &pt)
{
return x * pt.x + y * pt.y;
}
PointXY operator*(double dScale)
{
PointXY ptTmp;
ptTmp.x = x * dScale;
ptTmp.y = y * dScale;
return ptTmp;
}
double GetLength()
{
return x * x + y * y;
}
PointXY Normalize()
{
double dLen = this->GetLength();
if (dlen < 1e-6)
return *this;
else
return *this * (1.0 / dlen);
}
~PointXY() { }
};
// 3D Point
class PointXYZ : public PointXY
{
public:
PointXYZ()
{
x = 0;
y = 0;
z = 0;
}
PointXYZ(double a, double b, double c)
{
x = a;
y = b;
z = c;
}
PointXYZ(const PointXYZ &pt)
{
x = pt.x;
y = pt.y;
z = pt.z;
}
PointXYZ(const PointXY &pt)
{
x = pt.x;
y = pt.y;
z = 0;
}
PointXYZ operator+(const PointXYZ &pt)
{
PointXYZ ptTmp;
ptTmp.x = x + pt.x;
ptTmp.y = y + pt.y;
ptTmp.z = z + pt.z;
return ptTmp;
}
PointXYZ operator-(const PointXYZ &pt)
{
PointXYZ ptTmp;
ptTmp.x = x - pt.x;
ptTmp.y = y - pt.y;
ptTmp.z = z - pt.z;
return ptTmp;
}
PointXYZ operator*(const PointXYZ &pt)
{
return x * pt.x + y * pt.y + z * pt.z;
}
PointXYZ operator*(double dScale)
{
PointXYZ ptTmp;
ptTmp.x = x * dScale;
ptTmp.y = y * dScale;
ptTmp.z = z * dScale;
return ptTmp;
}
double GetLength()
{
return x * x + y * y + z * z;
}
PointXY Normalize()
{
double dLen = this->GetLength();
if (dlen < 1e-6)
return *this;
else
return *this * (1.0 / dlen);
}
~PointXYZ() { }
};