Comprobar si una línea toca o se cruza con un círculo

Dada la coordenada del centro y el radio > 1 de un círculo y la ecuación de una recta. La tarea es verificar si la línea dada choca con el círculo o no. Hay tres posibilidades: 
 

  1. La línea interseca al círculo.
  2. La línea toca el círculo.
  3. La línea está fuera del círculo.

Check if a line touches or intersects a circle

Nota: La ecuación general de una línea es a*x + b*y + c = 0, por lo que solo se dan las constantes a, b, c en la entrada.
Ejemplos: 
 

Input : radius = 5, center = (0, 0), 
        a = 1, b = -1, c = 0.
Output : Intersect

Input :  radius = 5, center = (0, 0), 
         a = 5, b = 0, c = 0.
Output : Touch

Input : radius = 5, center = (0, 0),
         a = 1, b = 1, c = -16.
Output : Outside

La idea es comparar la distancia perpendicular entre el centro del círculo y la línea con el radio del círculo.
Algoritmo: 
1. Encuentra la perpendicular (digamos p) entre el centro del círculo y la línea dada. 
2. Compara esta distancia p con el radio r. 
……a) Si p > r, entonces la línea está fuera del círculo. 
……b) Si p = r, entonces la línea toca el círculo. 
……c) Si p < r, entonces la línea interseca al círculo.
¿Cómo encontrar la distancia perpendicular?  
La distancia de una línea desde un punto se puede calcular usando la siguiente fórmula:
\frac{ax_{0}+por_{0}+c}{\sqrt{a^{2}+b^{2}}}
Consulte Wiki para obtener detalles de la fórmula anterior. 

C++

// CPP program to check if a line touches or
// intersects or outside a circle.
#include <bits/stdc++.h>
using namespace std;
 
void checkCollision(int a, int b, int c,
                  int x, int y, int radius)
{
    // Finding the distance of line from center.
    int dist = (abs(a * x + b * y + c)) /
                     sqrt(a * a + b * b);
 
    // Checking if the distance is less than,
    // greater than or equal to radius.
    if (radius == dist)
        cout << "Touch" << endl;
    else if (radius > dist)
        cout << "Intersect" << endl;
    else
        cout << "Outside" << endl;
}
 
// Driven Program
int main()
{
    int radius = 5;
    int x = 0, y = 0;
    int a = 3, b = 4, c = 25;
    checkCollision(a, b, c, x, y, radius);
    return 0;
}

Java

// Java program to check if a line touches or
// intersects or outside a circle.
 
import java.io.*;
 
class GFG {
     
    static void checkCollision(int a, int b, int c,
                               int x, int y, int radius)
    {
        // Finding the distance of line from center.
        double dist = (Math.abs(a * x + b * y + c)) /
                        Math.sqrt(a * a + b * b);
     
        // Checking if the distance is less than,
        // greater than or equal to radius.
        if (radius == dist)
            System.out.println ( "Touch" );
        else if (radius > dist)
            System.out.println( "Intersect") ;
        else
            System.out.println( "Outside") ;
    }
     
    // Driven Program
    public static void main (String[] args)
    {
        int radius = 5;
        int x = 0, y = 0;
        int a = 3, b = 4, c = 25;
        checkCollision(a, b, c, x, y, radius);
     
    }
}
 
// This article is contributed by vt_m.

Python3

# python program to check if a line
# touches or  intersects or outside
# a circle.
 
import math
 
def checkCollision(a, b, c, x, y, radius):
     
    # Finding the distance of line
    # from center.
    dist = ((abs(a * x + b * y + c)) /
            math.sqrt(a * a + b * b))
 
    # Checking if the distance is less
    # than, greater than or equal to radius.
    if (radius == dist):
        print("Touch")
    elif (radius > dist):
        print("Intersect")
    else:
        print("Outside")
 
# Driven Program
radius = 5
x = 0
y = 0
a = 3
b = 4
c = 25
checkCollision(a, b, c, x, y, radius)
 
# This code is contributed by Sam007

C#

// C# program to check if a line touches or
// intersects or outside a circle.
using System;
 
class GFG {
     
    static void checkCollision(int a, int b, int c,
                            int x, int y, int radius)
    {
        // Finding the distance of line from center.
        double dist = (Math.Abs(a * x + b * y + c)) /
                        Math.Sqrt(a * a + b * b);
     
        // Checking if the distance is less than,
        // greater than or equal to radius.
        if (radius == dist)
            Console.WriteLine ("Touch");
        else if (radius > dist)
            Console.WriteLine("Intersect");
        else
            Console.WriteLine("Outside");
    }
     
    // Driven Program
    public static void Main ()
    {
        int radius = 5;
        int x = 0, y = 0;
        int a = 3, b = 4, c = 25;
         
        checkCollision(a, b, c, x, y, radius);
     
    }
}
 
// This article is contributed by vt_m.

PHP

<?php
// PHP program to check if a line 
// touches or intersects or outside
// a circle.
 
function checkCollision($a, $b, $c,
                        $x, $y, $radius)
{
    // Finding the distance
    // of line from center.
    $dist = (abs($a * $x + $b * $y + $c)) /
                   sqrt($a * $a + $b * $b);
 
    // Checking if the distance is less than,
    // greater than or equal to radius.
    if ($radius == $dist)
        echo "Touch";
    else if ($radius > $dist)
        echo "Intersect";
    else
        echo "Outside" ;
}
 
// Driver Code
$radius = 5;
$x = 0;
$y = 0;
$a = 3;
$b = 4;
$c = 25;
checkCollision($a, $b, $c, $x, $y, $radius);
 
// This code is contributed by Sam007
?>

Javascript

<script>
 
// JavaScript program to check if a line touches or
// intersects or outside a circle.
 
function checkCollision(a, b, c, x, y, radius)
    {
     
        // Finding the distance of line from center.
        let dist = (Math.abs(a * x + b * y + c)) /
                        Math.sqrt(a * a + b * b);
       
        // Checking if the distance is less than,
        // greater than or equal to radius.
        if (radius == dist)
            document.write ( "Touch" );
        else if (radius > dist)
            document.write( "Intersect") ;
        else
            document.write( "Outside") ;
    }
 
// Driver Code
        let radius = 5;
        let x = 0, y = 0;
        let a = 3, b = 4, c = 25;
        checkCollision(a, b, c, x, y, radius);
 
// This code is contributed by susmitakundugoaldanga.
</script>

Producción : 

Touch

Complejidad de tiempo : O(1)

Espacio Auxiliar : O(1)

Este artículo es una contribución de Anuj Chauhan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *