/***************************************************************************************
*****	                   CLASS POINT IMPLEMENTATION                              *****
****************************************************************************************
** Author: Peter Stuart
** Email:  chester@selway.umt.edu
** Date:   3/7/98
** Description: This class implements a point in 3-space. Operations include all the 
**   necessary conversions from points to vectors, along with basic operators
**
** NOTE: The matrices, vectors, and points use homogeneous coordinates
** 	
***************************************************************************************/

#include "Point.hpp"

/* Constructor **********
** Default values for priavte variables:
** _x = 0.0
** _y = 0.0
** _z = 0.0
*/

Point::Point(const double x, const double y, const double z)
{
   _x = x;
   _y = y;
   _z = z;
}

// Copy Constructor
Point::Point(const Point& pt)
{
   _x = pt._x;
   _y = pt._y;
   _z = pt._z;
}

// Destructor
Point::~Point()
{
   ;
}

// ELEMENTARY OPERATORS //////////////////

// Assignment operator
Point& Point::operator =  (const Point& pt)
{
   if (this == &pt)
      return (*this);
	
   _x = pt._x;
   _y = pt._y;
   _z = pt._z;

   return (*this);
}

// addition of vector to point
Point  operator +  (const Point& pt, const Vector& v)
{
   Point temp;   // returning point

   temp._x = pt._x + v.x();
   temp._y = pt._y + v.y();
   temp._z = pt._z + v.z();

   return temp;
}

Point  operator +  (const Vector& v, const Point& pt)
{
   Point temp;  // returning point

   temp._x = pt._x + v.x();
   temp._y = pt._y + v.y();
   temp._z = pt._z + v.z();

   return temp;
}

// negative point
Point  operator - (const Point& pt)
{
   Point temp;   // returning point

   temp._x = -pt._x;
   temp._y = -pt._y;
   temp._z = -pt._z;

   return temp;
}

// two points to vector
Vector operator - (const Point& pt1, const Point& pt2)
{
   double tempx, tempy, tempz;

   tempx = pt1._x - pt2._x;
   tempy = pt1._y - pt2._y;
   tempz = pt1._z - pt2._z;

   Vector tempV(tempx, tempy, tempz);   // returning vector
   return tempV;
}

// subtraction of vector from point
Point  operator - (const Point& pt, const Vector& v)
{
   Point temp;   // returning point

   temp._x = pt._x - v.x();
   temp._y = pt._y - v.y();
   temp._z = pt._z - v.z();
	
   return temp;
}

// scalar multiplication of point
Point  operator * (const Point& pt, const double val)
{
   Point temp;   // returning point

   temp._x = pt._x * val;
   temp._y = pt._y * val;
   temp._z = pt._z * val;

   return temp;
}

Point  operator * (const double val, const Point& pt)
{
   Point temp;   // returning point

   temp._x = pt._x * val;
   temp._y = pt._y * val;
   temp._z = pt._z * val;

   return temp;
}

Point  operator / (const Point& pt, const double val)
{
   Point temp;   // returning point

   temp._x = pt._x / val;
   temp._y = pt._y / val;
   temp._z = pt._z / val;

   return temp;
}

Point  operator / (const double val, const Point& pt)
{
   Point temp;   // returning point

   temp._x = pt._x / val;
   temp._y = pt._y / val;
   temp._z = pt._z / val;

   return temp;
}

// Relational operators
int operator == (const Point& pt1, const Point& pt2)
{
   if (pt1._x != pt2._x)
      return FALSE;
   if (pt1._y != pt2._y)
      return FALSE;
   if (pt1._z != pt2._z)
      return FALSE;

   return TRUE;
}

int operator != (const Point& pt1, const Point& pt2)
{
   if (pt1._x == pt2._x)
      return FALSE;
   if (pt1._y == pt2._y)
      return FALSE;
   if (pt1._z == pt2._z)
      return FALSE;

   return TRUE;
}

// output stream
ostream&  operator << (ostream& co, const Point& pt)
{
   co << "<" << pt._x << ", " << pt._y << ", " << pt._z << ">";
		
   return co;
}

    Source: geocities.com/collegepark/4206

               ( geocities.com/collegepark)