Comprueba si es posible unir dos puntos dados en un círculo tal que la distancia entre ellos sea k

Dados dos círculos y una longitud, K. Encuentra si podemos unir dos puntos (uno en el perímetro de cada círculo), de modo que la distancia entre los puntos sea K. (Las coordenadas de ambos puntos no necesitan ser un valor entero).
Ejemplos: 
 

Input: Circle-1 Center (0, 0) Radius = 5
       Circle-2 Center (8, 3) Radius = 2
       K = 3
Output: Yes
Maximum Distance: 15
Minimum Distance: 2

Acercarse: 
 

  1. Tenemos que encontrar la distancia máxima y mínima posible entre dos puntos en estos círculos, si K se encuentra en este rango, la respuesta es sí, de lo contrario no podemos encontrar dicho segmento de línea.
  2. Para encontrar la distancia mínima y máxima:
  • Caso 1: Cuando dos círculos no se cortan o simplemente se tocan en un punto. 
    En este escenario, la distancia máxima sería distancia entre centros + Radio (círculo 1) + Radio (círculo 2). La distancia mínima sería distancia entre centros – Radio (círculo 1) – Radio (círculo 2). 
     

circle touches

  • Caso 2: Cuando los dos círculos se cortan exactamente en dos puntos. 
    En este escenario, la distancia máxima sería distancia entre centros + Radio (círculo 1) + Radio (círculo 2). La distancia mínima sería 0. (Tenemos dos puntos comunes en ambos círculos). 
     

intersect

  • Caso 3: Cuando el Círculo 1 está completamente dentro del Círculo 2. 
    En este escenario, la distancia máxima sería distancia entre centros + Radio (círculo 1) + Radio (círculo 2). La distancia mínima sería Radio (Círculo 2) – distancia entre centros – Radio (Círculo 1) 
     

circle

  • Caso 4: Cuando el Círculo 2 está completamente dentro del Círculo 1. 
    En este escenario, la distancia máxima sería distancia entre centros + Radio (círculo 1) + Radio (círculo 2). La distancia mínima sería Radio (Círculo 1) – distancia entre centros – Radio (Círculo 2) 
     

circle

  • Caso 5: Cuando ambos Círculos tienen el mismo centro 
    • Subcaso 1: el radio también es el mismo. Tanto la distancia mínima como la distancia máxima son 0.
    • Subcaso 2: el radio es diferente (R1<R2) 
      La distancia máxima es R1+R2 
      La distancia mínima es R2-R1 
       

same center

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ program to implement above approach
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
 
struct t {
    ll x, y, r;
};
typedef struct t node;
 
// Return distance between the centers
long double dis(ll x1, ll y1, ll x2, ll y2)
{
    return sqrt((x1 - x2) * (x1 - x2)
                + (y1 - y2) * (y1 - y2));
}
 
bool check(node c1, node c2, int k)
{
    long double min = 0;
    long double max = 0;
    // Distance between centers
    long double de = dis(c1.x, c1.y, c2.x, c2.y);
    // Case 5
    if (de == 0) {
        // SubCase 1
        if (c1.r == c2.r) {
            min = 0;
            max = 0;
        }
        // Subcase 2
        else {
            if (c1.r - c2.r > 0) {
                min = c1.r - c2.r;
                max = min + 2 * c2.r;
            }
            else {
                min = c2.r - c1.r;
                max = min + 2 * c1.r;
            }
        }
    }
    // Case 1
    else if (de >= c1.r + c2.r) {
        min = de - c1.r - c2.r;
        max = de + c1.r + c2.r;
    }
    // Case 3
    else if (de + c2.r < c1.r) {
        max = c2.r + c1.r + de;
        min = c1.r - de - c2.r;
    }
    // Case 4
    else if (de + c1.r < c2.r) {
 
        max = c2.r + c1.r + de;
        min = c2.r - de - c1.r;
    }
    // Case 2
    else if ((de + c2.r >= c1.r) || (de + c1.r >= c2.r)) {
        max = c2.r + c1.r + de;
        min = 0;
    }
    // Since value of k will always be an integer
    ll temin = (ll)(ceil(min));
    ll re = (ll)max;
    if (k >= temin && k <= re)
        return true;
    return false;
}
 
// Driver Code
int main()
{
    node circle1, circle2;
    int k = 3;
    circle1.x = 0;
    circle1.y = 0;
    circle1.r = 5;
    circle2.x = 8;
    circle2.y = 3;
    circle2.r = 2;
    if (check(circle1, circle2, k))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

Java

// Java program to implement above approach
class GFG
{
 
    static class node
    {
        long x, y, r;
    };
 
    // Return distance between the centers
    static long dis(long x1, long y1, long x2, long y2)
    {
        return (long) Math.sqrt((x1 - x2) * (x1 - x2)
                + (y1 - y2) * (y1 - y2));
    }
 
    static boolean check(node c1, node c2, int k)
    {
        long min = 0;
        long max = 0;
         
        // Distance between centers
        long de = dis(c1.x, c1.y, c2.x, c2.y);
         
        // Case 5
        if (de == 0)
        {
            // SubCase 1
            if (c1.r == c2.r)
            {
                min = 0;
                max = 0;
            }
            // Subcase 2
            else if (c1.r - c2.r > 0)
            {
                min = c1.r - c2.r;
                max = min + 2 * c2.r;
            }
            else
            {
                min = c2.r - c1.r;
                max = min + 2 * c1.r;
            }
        }
         
        // Case 1
        else if (de >= c1.r + c2.r)
        {
            min = de - c1.r - c2.r;
            max = de + c1.r + c2.r;
        }
        // Case 3
        else if (de + c2.r < c1.r)
        {
            max = c2.r + c1.r + de;
            min = c1.r - de - c2.r;
        }
        // Case 4
        else if (de + c1.r < c2.r)
        {
 
            max = c2.r + c1.r + de;
            min = c2.r - de - c1.r;
        }
        // Case 2
        else if ((de + c2.r >= c1.r) || (de + c1.r >= c2.r))
        {
            max = c2.r + c1.r + de;
            min = 0;
        }
         
        // Since value of k will always be an integer
        long temin = (long) (Math.ceil(min));
        long re = (long) max;
        if (k >= temin && k <= re)
        {
            return true;
        }
        return false;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        node circle1 = new node();
        node circle2 = new node();
        int k = 3;
        circle1.x = 0;
        circle1.y = 0;
        circle1.r = 5;
        circle2.x = 8;
        circle2.y = 3;
        circle2.r = 2;
        if (check(circle1, circle2, k))
        {
            System.out.println("Yes");
        }
        else
        {
            System.out.println("No");
        }
    }
}
 
// This code is contributed by Princi Singh

Python

# Python3 program to implement above approach
from math import sqrt,ceil,floor
 
# Return distance between the centers
def dis(x1, y1, x2, y2):
    return sqrt((x1 - x2) * (x1 - x2) +
                (y1 - y2) * (y1 - y2))
 
def check(c1, c2, k):
    min = 0
    max = 0
     
    # Distance between centers
    de = dis(c1[0], c1[1], c2[0], c2[1])
     
    # Case 5
    if (de == 0):
         
        # SubCase 1
        if (c1[2] == c2[2]):
            min = 0
            max = 0
     
        # Subcase 2
        else:
            if (c1[2] - c2[2] > 0):
                min = c1[2] - c2[2]
                max = min + 2 * c2[2]
 
            else:
                min = c2[2] - c1[2]
                max = min + 2 * c1[2]
 
    # Case 1
    elif (de >= c1[2] + c2[2]):
        min = de - c1[2] - c2[2]
        max = de + c1[2] + c2[2]
     
    # Case 3
    elif (de + c2[2] < c1[2]):
        max = c2[2] + c1[2] + de
        min = c1[2] - de - c2[2]
     
    # Case 4
    elif (de + c1[2] < c2[2]):
 
        max = c2[2] + c1[2] + de
        min = c2[2] - de - c1[2]
     
    # Case 2
    elif ((de + c2[2] >= c1[2]) or (de + c1[2] >= c2[2])):
        max = c2[2] + c1[2] + de
        min = 0
 
    # Since value of k wialways be an integer
    temin = ceil(min)
    re = max
    if (k >= temin and k <= re):
        return True
    return False
 
# Driver Code
circle1 = [0, 0, 5]
circle2 = [8, 3, 2]
k = 3
 
if (check(circle1, circle2, k)):
    print("YES")
else:
    print("NO" )
     
# This code is contributed by mohit kumar 29

C#

// C# program to implement above approach
using System;
     
class GFG
{
 
    public class node
    {
        public long x, y, r;
    };
 
    // Return distance between the centers
    static long dis(long x1, long y1, long x2, long y2)
    {
        return (long) Math.Sqrt((x1 - x2) * (x1 - x2)
                + (y1 - y2) * (y1 - y2));
    }
 
    static Boolean check(node c1, node c2, int k)
    {
        long min = 0;
        long max = 0;
         
        // Distance between centers
        long de = dis(c1.x, c1.y, c2.x, c2.y);
         
        // Case 5
        if (de == 0)
        {
            // SubCase 1
            if (c1.r == c2.r)
            {
                min = 0;
                max = 0;
            }
            // Subcase 2
            else if (c1.r - c2.r > 0)
            {
                min = c1.r - c2.r;
                max = min + 2 * c2.r;
            }
            else
            {
                min = c2.r - c1.r;
                max = min + 2 * c1.r;
            }
        }
         
        // Case 1
        else if (de >= c1.r + c2.r)
        {
            min = de - c1.r - c2.r;
            max = de + c1.r + c2.r;
        }
        // Case 3
        else if (de + c2.r < c1.r)
        {
            max = c2.r + c1.r + de;
            min = c1.r - de - c2.r;
        }
        // Case 4
        else if (de + c1.r < c2.r)
        {
 
            max = c2.r + c1.r + de;
            min = c2.r - de - c1.r;
        }
        // Case 2
        else if ((de + c2.r >= c1.r) || (de + c1.r >= c2.r))
        {
            max = c2.r + c1.r + de;
            min = 0;
        }
         
        // Since value of k will always be an integer
        long temin = (long) (Math.Ceiling((double)min));
        long re = (long) max;
        if (k >= temin && k <= re)
        {
            return true;
        }
        return false;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        node circle1 = new node();
        node circle2 = new node();
        int k = 3;
        circle1.x = 0;
        circle1.y = 0;
        circle1.r = 5;
        circle2.x = 8;
        circle2.y = 3;
        circle2.r = 2;
        if (check(circle1, circle2, k))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
// This code contributed by Rajput-Ji

Javascript

<script>
 
// JavaScript program to implement above approach
 
// Return distance between the centers
function dis(x1,y1,x2,y2)
{
    return  Math.sqrt((x1 - x2) * (x1 - x2)
                + (y1 - y2) * (y1 - y2));
}
 
function check(c1,c2,k)
{
    let min = 0;
        let max = 0;
           
        // Distance between centers
        let de = dis(c1[0], c1[1], c2[0], c2[1]);
           
        // Case 5
        if (de == 0)
        {
            // SubCase 1
            if (c1[2] == c2[2])
            {
                min = 0;
                max = 0;
            }
            // Subcase 2
            else if (c1[2] - c2[2] > 0)
            {
                min = c1[2] - c2[2];
                max = min + 2 * c2[2];
            }
            else
            {
                min = c2[2] - c1[2];
                max = min + 2 * c1[2];
            }
        }
           
        // Case 1
        else if (de >= c1[2] + c2[2])
        {
            min = de - c1[2] - c2[2];
            max = de + c1[2] + c2[2];
        }
        // Case 3
        else if (de + c2[2] < c1[2])
        {
            max = c2[2] + c1[2] + de;
            min = c1[2] - de - c2[2];
        }
        // Case 4
        else if (de + c1[2] < c2[2])
        {
   
            max = c2[2] + c1[2] + de;
            min = c2[2]- de - c1[2];
        }
        // Case 2
        else if ((de + c2[2] >= c1[2]) ||
        (de + c1[2] >= c2[2]))
        {
            max = c2[2] + c1[2] + de;
            min = 0;
        }
           
        // Since value of k will always be an integer
        let temin =  (Math.ceil(min));
        let re =  max;
        if (k >= temin && k <= re)
        {
            return true;
        }
        return false;
}
 
// Driver Code
let circle1 = [0, 0, 5];
let circle2 = [8, 3, 2];
 
let k = 3;
 
if (check(circle1, circle2, k))
{
    document.write("YES");
}
else
{
    document.write("NO");
}
 
 
 
// This code is contributed by unknown2108
 
</script>
Producción: 

YES

 

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por krikti y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *