Implementar Classe Triângulo

6 respostas
kxmm

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:
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)));} 

}

A classe Triângulo eu fiz até aqui:

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; }

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

6 Respostas

T

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

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
		}
	}

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

Abs

kxmm
tuliot:
Para saber se o triangulo é equilátero, isósceles ou escaleno você poderia fazer uma verificação no tamanho das arestas, exemplo :
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
		}
	}

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

Abs

Então, acabei por fazer assim:

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));
     
   }
}

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

T

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

boolean isosceles(){   
    if ((l1==l2) || (l2==l3))   
      return true;   
      return false;}
A comparação entre o lado 1 com lado 3
boolean isosceles(){   
    if ((l1==l2) || (l2==l3)|| (l1==l3)   
      return true;   
      return false;}

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

kxmm
tuliot:
Boa noite , só faltou nesse método o seguinte:
boolean isosceles(){   
    if ((l1==l2) || (l2==l3))   
      return true;   
      return false;}
A comparação entre o lado 1 com lado 3
boolean isosceles(){   
    if ((l1==l2) || (l2==l3)|| (l1==l3)   
      return true;   
      return false;}

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

É 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;}
T

Boa noite, o if seria mais ou menos assim:

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

Abs

kxmm

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

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?

Criado 11 de abril de 2012
Ultima resposta 11 de abr. de 2012
Respostas 6
Participantes 2