Implementar Classe Triângulo

Implemente uma classe Triângulo usando como base a classe Ponto2D do
exercício anterior. A classe Triângulo deve possuir três atributos do tipo Ponto2D
(os vértices do triângulo) e um construtor que recebe três pontos como
parâmetros. Defina os seguintes métodos para a classe:
a) static boolean formaTriangulo (Ponto2D p1, Ponto2D p2,
Ponto2D p3) ? retorna True se os três pontos formam um triângulo e False,
caso contrário. Em um triângulo, a soma de quaisquer dois lados é maior do
que o terceiro lado.
b) boolean equilatero() ? retorna True se o triângulo é equilátero e False,
caso contrário. Um triângulo equilátero possui os três lados iguais.
c) boolean isósceles() ? retorna True se o triângulo é isósceles e False,
caso contrário. Um triângulo isósceles possui dois lados iguais.
d) boolean escaleno() ? retorna True se o triângulo é escaleno e False, caso
contrário. Um triângulo escaleno não possui nenhum lado igual a outro.
e) double perimetro() ? retorna o perímetro do triângulo.
f) double area() ? retorna a área do triângulo. Use a seguinte fórmula para
cálculo da área, onde sp = semi-perímetro do triângulo:
sp = (lado1 + lado2 + lado3) / 2
área = raiz quadrada de (sp * (sp ? lado1) * (sp ? lado2) * (sp ? lado3))
Crie um método main para testar o uso da classe.

Bom, a classe Ponto2D eu criei no exercício anterior. É esta:

[code]package pontogeometrico;

public class Ponto2D {

private int x,y;

public Ponto2D(){
x=0;
y=0; }

public Ponto2D(int x, int y){
this.x=x;
this.y=y; }

public Ponto2D(Ponto2D ponto){
this.x=ponto.x;
this.y=ponto.y; }

public int getX(){
return x; }

public int getY(){
return y; }

public void setX(int x){
this.x=x; }

public void setY(int y){
this.y=y; }

public double DistPontos (Ponto2D p1, Ponto2D p2){
return (Math.sqrt(Math.pow((p2.x-p1.x),2) + Math.pow((p2.y-p1.y), 2)));}

}[/code]

A classe Triângulo eu fiz até aqui:

[code]package pontogeometrico;

public class Triangulo {

private Ponto2D vertice1;
private Ponto2D vertice2;
private Ponto2D vertice3;

public Triangulo (Ponto2D p1, Ponto2D p2, Ponto2D p3){
vertice1=p1;
vertice2=p2;
vertice3=p3; }

static boolean formaTriangulo (Ponto2D p1, Ponto2D p2,Ponto2D p3){
if (p1.DistPontos(p1, p2)+ p1.DistPontos(p1, p3)>p2.DistPontos(p2, p3) || (p1.DistPontos(p1, p2)+ p2.DistPontos(p2, p3)>p3.DistPontos(p1, p3)) || (p2.DistPontos(p2, p3)+ p1.DistPontos(p1, p3)>p1.DistPontos(p1, p2))){
return true;}
return false; }[/code]

Não estou conseguindo implementar o método para testar se é equilátero, isósceles, escaleno…

Para saber se o triangulo é equilátero, isósceles ou escaleno você poderia fazer uma verificação no tamanho das arestas, exemplo :

[code]if(p1.DistPontos(p1, p2)==p2.DistPontos(p2, p3)&&p2.DistPontos(p2, p3)==p3.DistPontos(p1, p3){
//Equilátero
}else{
if(p1.DistPontos(p1, p2)==p2.DistPontos(p2, p3)||p1.DistPontos(p1, p2)==p3.DistPontos(p1, p3)||p2.DistPontos(p2, p3)==p3.DistPontos(p1, p3)){

		//Isósceles, pelo menos 1 lado igual ao outro
	}else{
		//Escaleno
	}
}[/code]

A lógica é comparar os tamanhos dos lados de alguma forma!

Abs

[quote=tuliot]Para saber se o triangulo é equilátero, isósceles ou escaleno você poderia fazer uma verificação no tamanho das arestas, exemplo :

[code]if(p1.DistPontos(p1, p2)==p2.DistPontos(p2, p3)&&p2.DistPontos(p2, p3)==p3.DistPontos(p1, p3){
//Equilátero
}else{
if(p1.DistPontos(p1, p2)==p2.DistPontos(p2, p3)||p1.DistPontos(p1, p2)==p3.DistPontos(p1, p3)||p2.DistPontos(p2, p3)==p3.DistPontos(p1, p3)){

		//Isósceles, pelo menos 1 lado igual ao outro
	}else{
		//Escaleno
	}
}[/code]

A lógica é comparar os tamanhos dos lados de alguma forma!

Abs[/quote]

Então, acabei por fazer assim:

[code]package pontogeometrico;

public class Triangulo {

private Ponto2D v1;
private Ponto2D v2;
private Ponto2D v3;
private double l1,l2,l3;

public Triangulo (Ponto2D v1,Ponto2D v2,Ponto2D v3){
this.v1 = new Ponto2D(v1);
this.v2 = new Ponto2D(v2);
this.v3 = new Ponto2D(v3);
l1=this.v1.DistPontos(this.v2);
l2=this.v2.DistPontos(this.v3);
l3=this.v3.DistPontos(this.v1); }

static boolean formaTriangulo (Ponto2D v1,Ponto2D v2,Ponto2D v3){
if (v1.DistPontos(v2)+ v1.DistPontos(v3)>v2.DistPontos(v3) && (v1.DistPontos(v2)+ v2.DistPontos(v3)>v3.DistPontos(v1)) && (v2.DistPontos(v3)+ v1.DistPontos(v3)>v1.DistPontos(v2))){
return true;}
return false; }

boolean equilatero (Triangulo t1){
if ((t1.l1==l2) && (t1.l2==l3))
return true;
return false;}

boolean isosceles(){
if ((l1==l2) || (l2==l3))
return true;
return false;}

boolean escaleno(){
if (((l1!=l2) && (l2!=l3)) && (l1!=l3))
return true;
return false;}

double areaT(){
double sp = ((l1+l2+l3)/2);
return (Math.sqrt(sp*(sp-l1)*(sp-l2)*(sp-l3))); }

public static void main(String[] args) {
Ponto2D v1 = new Ponto2D(2,1);
Ponto2D v2 = new Ponto2D(1,3);
Ponto2D v3 = new Ponto2D(5,4);
Triangulo t1 = new Triangulo(v1,v2,v3);

System.out.println("É um triângulo? " + formaTriangulo(v1,v2,v3));
System.out.println("É um Equilátero? " + t1.equilatero(t1));
System.out.println("É um Isósceles? " + t1.isosceles());
System.out.println("É um Escaleno? " + t1.escaleno());
System.out.println("A área do Triângulo t1 é: " + t1.areaT());
v1.setX(1);v1.setY(0);
v2.setX(3);v2.setY(2);
v3.setX(5);v3.setY(4);
System.out.println("É um triângulo? " + formaTriangulo(v1,v2,v3));

}
}

[/code]

Tá funcional. Acho que tudo certo, né?

Boa noite , só faltou nesse método o seguinte:

[code]boolean isosceles(){
if ((l1==l2) || (l2==l3))
return true;
return false;}

[/code]

A comparação entre o lado 1 com lado 3

[code]boolean isosceles(){
if ((l1==l2) || (l2==l3)|| (l1==l3)
return true;
return false;}

[/code]

No caso também é necessario no if que os 3 lados sejam Negado iguais pois neste if apenas com verificaçoes de || o triangulo equilatero tambem seria verdadeiro para este método e, se ele é equilatero ele não é isósceles!

Abss

Abs

[quote=tuliot]Boa noite , só faltou nesse método o seguinte:

[code]boolean isosceles(){
if ((l1==l2) || (l2==l3))
return true;
return false;}

[/code]

A comparação entre o lado 1 com lado 3

[code]boolean isosceles(){
if ((l1==l2) || (l2==l3)|| (l1==l3)
return true;
return false;}

[/code]

No caso também é necessario no if que os 3 lados sejam Negado iguais pois neste if apenas com verificaçoes de || o triangulo equilatero tambem seria verdadeiro para este método e, se ele é equilatero ele não é isósceles!

Abss

Abs[/quote]

É verdade. Corrigido aqui. Obrigado

Correto assim?

boolean isosceles(){ if (((l1==l2) || (l2==l3) || (l1==l3)) && ((l1!=l2) || (l2!=l3) || (l1!=l3))) return true; return false;}

Boa noite, o if seria mais ou menos assim:

 if (((l1==l2) || (l2==l3) || (l1==l3)) && !((t1.l1==l2) && (t1.l2==l3)))   {
//isosceles
}

Abs

[quote=tuliot]Boa noite, o if seria mais ou menos assim:

 if (((l1==l2) || (l2==l3) || (l1==l3)) && !((t1.l1==l2) && (t1.l2==l3)))   {
//isosceles
}

Abs[/quote]

Você tá negando a igualdade, certo? Mas acho que meu if funciona, pois com ele a condição é ter dois lados iguais e um diferente.
O seu eu não entendi bem por ter usado “t1”, porque você tá confrontando com os outros lados, mas os outros lados também são de “t1”, que é o triângulo corrente.
Ou falei bobeira?