/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoritmobr;

/**
 *
 * @author Joel
 */
public class tangente {
    private vertice p;
    private vertice tan_izq;
    private vertice tan_der;
    private double m_izq;
    private double m_der;
    private boolean m_izqesInfinita;
    private boolean m_deresInfinita;
    
    /**
     * Constructor para la tangente de los puntos externos al CH()
     */
    public tangente()
    {
        this.m_izqesInfinita=false;
        this.m_deresInfinita=false;
    }
    
    /**
     * entrega el punto externo comprometido
     * @return - El vertice de GVe
     */
    public vertice getP()
    {
        return p;
    }
    
    /**
     * entrega el vertice tangente por la izquierda 
     * @return - el vertice tangente por la izquierda
     */
    public vertice getTan_izq()
    {
        return tan_izq;
    }
    
    /**
     * entrega el vertice tangente 
     * @return - el vertice tangente 
     */
    public vertice getTan()
    {
        return tan_izq;
    }
    
    /**
     * entrega el vertice tangente por la derecha
     * @return - el vertice tangente
     */
    public vertice getTan_der()
    {
        return tan_der;
    }
    
    /**
     * entrega la pendiente de la tangente por la izquierda
     * @return - un double con la pendiente
     */
    public double getM_izq()
    {
        return m_izq;
    }
    
    /**
     * entrega la pendiente de la tangente por la derecha
     * @return - un double con la pendiente
     */
    public double getM_der()
    {
        return m_der;
    }
    
    /**
     * entrega la pendiente de la tangente
     * @return - un double con la pendiente
     */
    public double getM()
    {
        return m_izq;
    }
    
    /**
     * Cambia el vertice del conjunto externo
     * @param e - elemento a cambiar
     */
    public void setP(vertice e)
    {
        p=new vertice();
        if(e==null) System.out.println("CTM E es nulo (Set_P)");
        p=e;
    }
    
    /**
     * Cambia el vertice tangente por la derecha
     * @param e - el elemento a cambiar
     */
    public void setTan_izq(vertice e)
    {
        //System.out.println("E : "+e.toString());
        tan_izq=new vertice();
        if(e==null) System.out.println("CTM E es nulo (Set_Izq)");
        tan_izq=e;
        //System.out.println("tan_izq :"+tan_izq.toString());
        if(tan_izq.getX()-p.getX()!=0)
            m_izq=m(p,tan_izq);
        else
            m_izqesInfinita=true;
    }
    
    /**
     * Cambia el vertice tangente por la derecha
     * @param e - el elemento a cambiar
     */
    public void setTan_der(vertice e)
    {
        tan_der=new vertice();
        tan_der=e;
        if(tan_der.getX()-p.getX()!=0)
            m_der=m(p,tan_der);
        else
            m_deresInfinita=true;
    }
    
    /**
     * cambiar la pendiente de la tangente izquierda
     * @param e - el elemento a cambiar
     */
    public void setM_izq(double e)
    {
        m_izq=e;
    }
    
    /**
     * cambia la pendiente de la tangente derecha
     * @param e - el elemento a cambiar
     */
    public void setM_der(double e)
    {
        m_der=e;
    }
    
    /**
     * calcula la pendiente dados dos vertices
     * @param p1 - primer vertice
     * @param p2 - segundo vertice
     * @return la pendiente de dos vertices
     */
    public double m(vertice p1, vertice p2)
    {
        double m = 0;
        if(p2.getX()-p1.getX()!=0)
            m=(double)( (p2.getY()-p1.getY())/(p2.getX()-p1.getX()) );
        else
            m=Double.POSITIVE_INFINITY;
        
        if(m == -0 || m== 0) m= 0;
        
        return m;
    }
    /**
     * consulta si los campos de los vertices tangentes están ya ocupados
     * @return true si está completo, false si NO está completo
     */
    public boolean estaCompleto()
    {
        return (p!=null && tan_izq!=null && tan_der!=null);
    }
    
    /**
     * Consulta si la tangente por la izquierda es infinita
     * @return true es infinita, false no es infinita
     */
    public boolean m_izqesInfinita()
    {
        return m_izqesInfinita;
    }
    
    /**
     * Consulta si la tangente por la derecha es infinita
     * @return true es infinita, false no es infinita
     */
    public boolean m_deresInfinita()
    {
        return m_deresInfinita;
    }
    
    /**
     * Consulta si la tangente  es infinita
     * @return true es infinita, false no es infinita
     */
    public boolean esInfinita()
    {
        return m_izqesInfinita;
    }
    
    /**
     * entrega la información de la tangente
     * @return un String de información de la Tangente
     */
    public String toString()
    {
        String m;
        m=p.toString()+" "+tan_izq.toString();
        
        if(m_izqesInfinita())
            m=m+" infinita";
        else 
            if(m_izq - ((int)m_izq)==0)
                m=m+" "+String.format("%.0f", m_izq);
            else
                m=m+" "+String.format("%.2f", m_izq);
                
        
        m=m+" "+tan_der.toString();
        
        if(m_deresInfinita())
            m=m+" infinita";
        else 
            if(m_der - ((int)m_der)==0)
                m=m+" "+String.format("%.0f", m_der);
            else
                m=m+" "+String.format("%.2f", m_der);
        
        return m;
    }
       
    /**
     * entrega la información de la tangente
     * @return un String de información de la Tangente
     */
    public String toString(String m)
    {
        
        m=p.toString()+" "+tan_izq.toString();
        
        if(m_izqesInfinita())
            m=m+" infinita";
        else 
            if(m_izq - ((int)m_izq)==0)
                m=m+" "+String.format("%.0f", m_izq);
            else
                m=m+" "+String.format("%.2f", m_izq);
                
        
        
        return m;
    }
}
