/*
 * Instituto Superior de Engenharia do Porto
 *
 * Estruturas de Informação
 *
 * 2000/2001
 *
 * ------------------------------------------
 *
 * classe para representar pontos num espaço bidimensional 
 *		
 * Ponto2D.cpp
 *
 */

#include <math.h>
#include <ostream.h>
#include "ponto3d.h"

Ponto3D::Ponto3D(int x /* = 0 */, int y /* = 0 */, int z /* = 0 */) : Ponto2D(x, y)
{
	setZ(z);
}

Ponto3D::Ponto3D(const Ponto3D& o) : Ponto2D(o)
{
	setZ(o.getZ());
}

Ponto3D& Ponto3D::operator=(const Ponto3D& o)
{
	Ponto2D::operator =(o);
	setZ(o.getZ());
	return *this;
}

Ponto3D& Ponto3D::operator-=(const Ponto3D& o)
{
	Ponto2D::operator-=(o);
	m_iZ -= o.getZ();
	return *this;
}

Ponto3D& Ponto3D::operator+=(const Ponto3D& o)
{
	Ponto2D::operator+=(o);
	m_iZ += o.getZ();
	return *this;
}

Ponto3D operator+(const Ponto3D& a, const Ponto3D& b)
{
	Ponto3D c(a.getX()+b.getX(), a.getY()+b.getY(), a.getZ()+b.getZ());
	return c;
}

Ponto3D operator-(const Ponto3D& a, const Ponto3D& b)
{
	Ponto3D c(a.getX()-b.getX(), a.getY()-b.getY(), a.getZ()-b.getZ());
	return c;
}

bool operator==(const Ponto3D& a, const Ponto3D& b)
{
	if (a.getX() == b.getX() && a.getY() == b.getY() && a.getZ() == b.getZ())
		return true;
	else
		return false;
}

double distancia(const Ponto3D& a, const Ponto3D& b)
{
	double d1 = a.getX() - b.getX();
	double d2 = a.getY() - b.getY();
	double d3 = a.getZ() - b.getZ();
	double d = sqrt(d1*d1 + d2*d2 + d3*d3);
	return d;
}

ostream& operator<<(ostream& output, const Ponto3D& obj)
{
	output << "(" << obj.getX() << ", " << obj.getY() << ", " << obj.getZ() << ")";
	return output;
}
