domingo, 1 de junio de 2014

Dibujar circunferencia que pasa por tres puntos en Java

Dados tres puntos no alineados, existe una y solo una circunferencia que pasa por los tres. En este artículo voy a mostrarles la manera cómo poder determinar la ecuación de la circunferencia que pasa por estos puntos de tal forma que podamos graficarla utilizando el API Java2D.

Dada la circunferencia cuya ecuación es:


Y tres puntos que pertenecen a dicha circunferencia:


Al reemplazar los puntos por X e Y obtendremos las siguientes equivalencias [1]:

h = (1/2)((a²+b²)(f-d) + (c²+d²)(b-f) + (e²+f²)(d-b)) / (a(f-d)+c(b-f)+e(d-b)) 
k = (1/2)((a²+b²)(e-c) + (c²+d²)(a-e) + (e²+f²)(c-a)) / (b(e-c)+d(a-e)+f(c-a)) 

Calculando los valores de h y k podemos calcular el valor del radio r hallando la distancia entre los puntos (h,k) y cualquiera de los tres puntos dados inicialmente.


import java.awt.Color;
import java.awt.Graphics2D;

/**
 *
 * @author Rolando
 */
public class Circunferencia {

    private Punto centro;
    private double radio;

    public Circunferencia() {
    }

    public Circunferencia(Punto centro, int radio) {
        this.centro = centro;
        this.radio = radio;
    }

    public Punto getCentro() {
        return centro;
    }

    public void setCentro(Punto centro) {
        this.centro = centro;
    }

    public double getRadio() {
        return radio;
    }

    public void setRadio(double radio) {
        this.radio = radio;
    }

    public void dibujar(Graphics2D g2) {
        int x = (int) centro.getPunto().getX();
        int y = (int) centro.getPunto().getY();
        int r = (int) radio;
        centro.dibujar(g2);
        g2.setColor(Color.red);
        g2.drawOval(x - r, y - r, 2 * r, 2 * r);
    }
}
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;

/**
 *
 * @author Rolando
 */
public class Punto {

    private Point2D punto;

    public Punto() {
        punto = new Point2D.Double(0, 0);
    }

    public Punto(int x, int y) {
        punto = new Point2D.Double(x, y);
    }

    public Point2D getPunto() {
        return punto;
    }

    public void setPunto(Point2D punto) {
        this.punto = punto;
    }

    public void dibujar(Graphics2D g2) {
        g2.setColor(Color.blue);
        int x = (int) punto.getX();
        int y = (int) punto.getY();
        g2.fillOval(x - 2, y - 2, 4, 4);
    }
}
public static Circunferencia calcularCentro(Punto x1, Punto x2, Punto x3) {
    Circunferencia circunferencia = new Circunferencia();
    double a, b, c, d, e, f, h, k, r;
    a = x1.getPunto().getX();
    b = x1.getPunto().getY();
    c = x2.getPunto().getX();
    d = x2.getPunto().getY();
    e = x3.getPunto().getX();
    f = x3.getPunto().getY();
    h = (0.5) * ((Math.pow(a, 2) + Math.pow(b, 2)) * (f - d) + (Math.pow(c, 2) + Math.pow(d, 2)) * (b - f) + (Math.pow(e, 2) + Math.pow(f, 2)) * (d - b)) / (a * (f - d) + c * (b - f) + e * (d - b));
    k = (0.5) * ((Math.pow(a, 2) + Math.pow(b, 2)) * (e - c) + (Math.pow(c, 2) + Math.pow(d, 2)) * (a - e) + (Math.pow(e, 2) + Math.pow(f, 2)) * (c - a)) / (b * (e - c) + d * (a - e) + f * (c - a));
    r = Math.sqrt(Math.pow((h - a), 2) + Math.pow((k - b), 2));
    circunferencia.setRadio(r);
    circunferencia.setCentro(new Punto((int) h, (int) k));
    return circunferencia;
}

También les comparto el proyecto de Netbeans pues siempre he dicho que un artículo sin código fuente es como un libro sin hojas.


Hasta una próxima publicación y no se olviden de seguirnos a través de nuestra página en Facebook.

No hay comentarios.:

Publicar un comentario