import javax.swing.*;
import java.awt.geom.*;
import java.awt.*;

/** 
    Permette di creare un oggetto triangolo e fornisce dei metodi per il calcolarne alcune proprieta' fondamentali quali l'area ed il perimetro oltre ad un metodo per il disegno del triangolo. 
*/
public class Triangolo {
	
	/** 
	    Costruisce un triangolo degenere con coordinate dei vertici nell'origine
	*/
	public Triangolo() {
		
		v1=new Point2D.Double();
		v2=new Point2D.Double();
		v3=new Point2D.Double();
							
		a=0;
	    b=0;
	    c=0;
	
	}
	
	
	/** 
	    Costruisce un triangolo con coordinate dei vertici (x1,y1), (x2,y2), (x3,y3). Se il triangolo  degenere stampa un opportuno messaggio

		@param x1 ascissa del primo vertice
		@param x2 ascissa del secondo vertice
		@param x3 ascissa del terzo vertice
		@param y1 ordinata del primo vertice
		@param y2 ordinata del secondo vertice
		@param y3 ordinata del terzo vertice
	*/
	public Triangolo(double x1,double x2, double x3, double y1, double y2, double y3) {
		
		v1=new Point2D.Double(x1,y1);
		v2=new Point2D.Double(x2,y2);
		v3=new Point2D.Double(x3,y3);
			
		double	determinante=(v1.getX()-v3.getX())*(v2.getY()-v1.getY())-(v2.getX()-v1.getX())*(v1.getY()-v3.getY());
	
		if  (Math.abs(determinante)<EPSILON)
			System.out.println("Il triangolo e'degenere.\n");
			
		a=v1.distance(v2);
	    b=v2.distance(v3);
	    c=v1.distance(v3);
	
	}
	
	/** 
	   Restituisce il perimetro del triangolo
	   
	   @return il perimetro del triangolo
	*/
	public double perimetro(){
		
		return a+b+c;				
		
	}
	
	/** 
	   Restituisce l'area del triangolo
	   
	   @return l'area del triangolo
	*/
	public double area (){
		
		double s=this.perimetro()/2;
		
		return Math.sqrt(s*(s-a)*(s-b)*(s-c));
		
	}
	
	/** 
	   Restituisce le coordinate (X,Y) del baricentro del triangolo
	   
	   @return il baricentro del triangolo
	*/
	public Point2D.Double baricentro(){
		
		Point2D.Double baricentro=new Point2D.Double((v1.getX()+v2.getX()+v3.getX())/3,(v1.getY()+v2.getY()+v3.getY())/3);
		
		return baricentro;
		
	}
	
	/** 
	   Disegna il triangolo in un contesto grafico specificato
	   
	   @param g il contesto grafico in cui disegnare il triangolo
	*/
	public void disegna(Graphics2D g){
		
		Line2D.Double linea1=new Line2D.Double(v1,v2);
		Line2D.Double linea2=new Line2D.Double(v3,v2);
		Line2D.Double linea3=new Line2D.Double(v1,v3);
		
		g.draw(linea1);
		g.draw(linea2);
		g.draw(linea3);	
	}
	
	/** 
	   Verifica se il triangolo e' rettangolo
	   
	   @return restituisce vero se il triangolo e' rettangolo, falso altrimenti
	*/
	
	public boolean isRettangolo(){
		
		if(Math.abs(Math.pow(a,2)+Math.pow(b,2)-Math.pow(c,2))<EPSILON)
			return true;
		if(Math.abs(Math.pow(a,2)+Math.pow(c,2)-Math.pow(b,2))<EPSILON)
			return true;
		if(Math.abs(Math.pow(c,2)+Math.pow(b,2)-Math.pow(a,2))<EPSILON)
			return true;
			
		return false;
	}
	
	/** 
	   Verifica se il triangolo e' ottusangolo
	   
	   @return restituisce vero se il triangolo e' ottusangolo, falso altrimenti
	*/
	public boolean isOttusangolo(){
		if((Math.pow(a,2)+Math.pow(b,2)-Math.pow(c,2))<0)
			return true;
		if((Math.pow(a,2)+Math.pow(c,2)-Math.pow(b,2))<0)
			return true;
		if((Math.pow(c,2)+Math.pow(b,2)-Math.pow(a,2))<0)
			return true;
			
		return false;
		
	}
	
	/** 
	   Trasla il triangolo nel piano xy
	   
	   @param x traslazione orizzontale
	   @param y traslazione verticale
	*/
	public void translate(double x,double y){
		
		//condice da implementare
		
	}
	
	/** 
	   Modifica le coordinate del triangolo
	   
	   	@param x1 nuova ascissa del primo vertice
		@param x2 nuova ascissa del secondo vertice
		@param x3 nuova ascissa del terzo vertice
		@param y1 nuova ordinata del primo vertice
		@param y2 nuova ordinata del secondo vertice
		@param y3 nuova ordinata del terzo vertice
	*/
	public void setCoordinates(double x1,double x2, double x3, double y1, double y2, double y3) {
		
		//codice da implementare
		
	}
	
	
	
	private Point2D.Double v1, v2, v3;    			  // i vertici del triangolo
	private double a, b, c; 	 			  		  // le lunghezze dei lati del triangolo
	private final double EPSILON=0.00000000001;		  // tolleranza per confronti tra reali
	
}