Ejercicio 10. Circunferencias

Realiza un programa que pida los puntos centrales de dos circunferencias (x1, y1), (x2, y2) y los radios de las mismas (r1, r2). El programa debe clasificar según corresponda como: exteriores, tangentes exteriores, secantes, tangentes interiores, interiores o concéntricas.

Recuerdo el día que me encontré ante este ejercicio por primera vez, tuve un momento de bloqueo, ¿Cómo voy a sacar esto yo? ¡Pero si no sé ni que significan cada uno de esos vocablos! bueno si… pero no lo recuerdo con certeza…

Durante el aprendizaje he descubierto que hay que intentar forzarse a uno mismo a buscar soluciones de forma autónoma, sacar soltura para desarrollar y encontrar la mejor forma de obtener el resultado que nos han pedido, dividiendo en subproblemas que nos faciliten la codificación del código, pero también he visto que lo principal y sin lo que resulta imposible todo ese proceso, es saber lo que te están pidiendo tanto en el ejercicio como tu posible cliente.

Volviendo al ejercicio, tenemos una parte muy clara, petición de datos al usuario, la segunda… clasificamos las circunferencias dadas… ¿que debemos saber?

Pues tras una búsqueda en Google busqué información sobre como se pueden catalogar dos circunferencias según su tamaño y posición en el plano.

Como puedes ver en la imagen incluida más arriba, debemos trabajar especialmente con la distancia entre los dos centros de las circunferencias (dos puntos en el plano, esta función ya la hicimos en el ejercicio 12 de Secuenciales en JAVA).

Una vez sepamos la distancia debemos hacer las comparaciones oportunas para su catalogación.

  • Si distancia = 0, ambas circunferencias serán concéntricas.
  • Si distancia > (r1+r2), son circunferencias exteriores.
  • Si distancia > 0 y distancia < valor absoluto de (r1-r2), son circunferencias interiores.
  • Si distancia = (r1+r2), son circunferencias tangentes exteriores.
  • Si distancia = valor absoluto de (r1-r2), son tangentes interiores.
  • Si distancia < (r1 + r2) y distancia > valor absoluto de (r1-r2), son circunferencias secantes.
package estructurasAlternativas;

/**
10 Ejercicios Estructuras Alternativas en Java

Programa:
Algoritmo que pida los puntos centrales x1,y1,x2,y2 y los radios r1,r2 de dos 
circunferencias y las clasifique en uno de estos estados:

- exteriores
- tangentes exteriores
- secantes
- tangentes interiores
- interiores
- concéntricas

@author: manolohidalgo_
@date: 09-11-19
*/

import java.util.Scanner;
// Inicio del programa y declaración de variables:
public class Ejercicio10Circunferencias {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int x1;
    int x2;
    int y1;
    int y2;
    int r1;
    int r2;
    double distancia;

// Solicitud de datos al usuario
    System.out.println("Este programa calcula como son dos circunferencias entre sí, "
        + "conociendo sus centros y radios:");
    System.out.print("Introduce el valor \"x\" de la primera circunferencia: ");
    x1 = scanner.nextInt();
    System.out.print("Introduce el valor \"y\" de la primera circunferencia: ");
    y1 = scanner.nextInt();
    System.out.print("Introduce el radio de la primera circunferencia: ");
    r1 = scanner.nextInt();
    System.out.print("Introduce el valor \"x\" de la segunda circunferencia: ");
    x2 = scanner.nextInt();
    System.out.print("Introduce el valor \"y\" de la segunda circunferencia: ");
    y2 = scanner.nextInt();
    System.out.print("Introduce el radio de la segunda circunferencia: ");
    r2 = scanner.nextInt();
    
// Realizamos Cálculos de la distancia entre ambas circunferencias
    distancia = Math.sqrt(Math.pow((x2-x1),2)+Math.pow((y2-y1),2));

    // Hacemos comparaciones y mostramos en pantalla.
    if (distancia == 0) {
      System.out.println("Concéntricas.");
    } else if (distancia > (r1+r2)) {
      System.out.println("Exteriores.");
    } else if ((distancia > 0) && distancia < Math.abs(r1-r2)) {
      System.out.println("Interiores.");
    } else if (distancia == (r1+r2)) {
      System.out.println("Tangentes exteriores.");
    } else if (distancia == Math.abs(r1-r2)) {
      System.out.println("Tangentes interiores.");
    } else if (distancia < (r1+r2) && distancia > Math.abs(r1-r2)) {
      System.out.println("Secantes.");
    }
    }
  }

Puedes acceder a este ejercicio en GitHub en este enlace

Si tienes alguna duda al respecto, alguna sugerencia o algo que no te haya quedado claro, no tienes más que escribirme en los comentarios, estoy aquí para ayudarte y aprender, ¡Nos leemos!