// cTriangulo.cpp
// Definição da classe cTriangulo
// Frequência de Lp1    30 de Novembro de 2001

#include "cTriangulo.h"
#include <math.h>


cTriangulo::cTriangulo()
{
	// ERRO :  Base = 1;
	// ERRO : Lado2 = 1;
	// ERRO : Lado3 = 1;

	// RESOLUÇÃO : Agora, Base, Lado2 e Lado3 são objectos da classe cUnidadeMedida
	// São inicializados no construtor por defeito da classe
}

cTriangulo::cTriangulo( cUnidadeMedida Bas, cUnidadeMedida Lad2, cUnidadeMedida Lad3 )
{
	Base = Bas;  
	Lado2 = Lad2;
	Lado3 = Lad3;
}

cUnidadeMedida cTriangulo::Area()
{
	// ERRO : return ( Base * Altura() ) / 2;
	
	
	// RESOLUÇÃO :
	//	1º) Construir um método de acesso de leitura da propriedade privada Valor
	//							double GetValor();
	//	2º ) Construir um construtor de conversão de double em cUnidadeMedida
	//							cUnidadeMedida( double );

	return ( Base.GetValor() * Altura().GetValor() ) / 2;
}

cUnidadeMedida cTriangulo::Perimetro()
{
	// ERRO Resolvido com o método de acesso GetValor()
	return Base.GetValor() + Lado2.GetValor() + Lado3.GetValor();
}

cUnidadeMedida cTriangulo::Altura()
{
	double alfa;

	// ERRO Resolvido com o método de acesso GetValor()
	alfa = ( Base.GetValor()*Base.GetValor() + Lado2.GetValor()*Lado2.GetValor() - Lado3.GetValor()*Lado3.GetValor() ) / ( 2*(Base.GetValor() *Lado2.GetValor()) );		
	alfa = acos(alfa);
	return Lado2.GetValor() * sin(alfa);
}

char *cTriangulo::TipoTrianguloTexto()
{	
	switch ( Tipo() )
	{
		case EQUILATERO :	return "Equilatero";
		case   ESCALENO :	return "Escaleno";
		case  ISOSCELES :	return "Isosceles";
			    default :	return " ";
	}
}

cTriangulo::TipoTriangulo cTriangulo::Tipo()
{
	if ( ( Base == Lado2 ) && ( Lado2 == Lado3 ) ) 
		return EQUILATERO;

	if ( ( Base != Lado2 ) && ( Base != Lado3 ) && ( Lado2 != Lado3 ) ) 
		return ESCALENO;

	return ISOSCELES;
}

cUnidadeMedida cTriangulo::GetLado( int i )
{
	switch ( i )
	{
		case 1 :	return Base;
		case 2 :	return Lado2;
		case 3 :	return Lado3;
	   default :	return 0;
	}
}




// operador == 	como  método da classe
// VERSÃO SIMPLIFICADA : dá falso para triângulos iguais,
// mas com os lados introduzidos por ordem diferente   Ex; tri(5,4,3) e tri2( 3,4,5) 
bool cTriangulo::operator==( cTriangulo op2 )
{
	if ( ( Base == op2.Base ) && ( Lado2 == op2.Lado2 ) && ( Lado3 == op2.Lado3 ) ) return true;
	else  return false;
}
	
// operador >  como  função global friend
bool operator>( cTriangulo op1, cTriangulo op2 )
{
	if ( op1.Area() > op2.Area() ) return true;
	else return false;
}


