点的类型定义

// 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() { }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值