Number of common tangents between two circles if their centers and radius is given


Given two circles with a given radius and centres. The task is to find the number of common tangents between these circles.

Examples:

Input: x1 = -10, y1 = 8, x2 = 14, y2 = -24, r1 = 30, r2 = 10
Output: 3

Input: x1 = 40, y1 = 8, x2 = 14, y2 = 54, r1 = 39, r2 = 51
Output: 2

Approach:

  • First of all we will check whether the circles touch each other externally, intersect each other or do not touch each other at all.(Please refer here)

  • Then if the circles do not touch each other externally, then obviously they will have 4 common tangents, two direct and two transverse.

  • If the circles touch each other externally, then they will have 3 common tangents, two direct and one transverse.
    The tangent in between can be thought of as the transverse tangents coinciding together.

  • If the circles intersect each other, then they will have 2 common tangents, both of them will be direct.

    • If one circle is inside another circle, then they will have only one common tangent.

    Below is the implementation of the above approach:

    C++

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C++ program to find
    // the number of common tangents
    // between the two circles
      
    #include <bits/stdc++.h>
    using namespace std;
      
    int circle(int x1, int y1, int x2,
               int y2, int r1, int r2)
    {
      
        int distSq = (x1 - x2) * (x1 - x2)
                     + (y1 - y2) * (y1 - y2);
      
        int radSumSq = (r1 + r2) * (r1 + r2);
      
        if (distSq == radSumSq)
            return 1;
        else if (distSq > radSumSq)
            return -1;
        else
            return 0;
    }
      
    // Driver code
    int main()
    {
        int x1 = -10, y1 = 8;
        int x2 = 14, y2 = -24;
        int r1 = 30, r2 = 10;
        int t = circle(x1, y1, x2,
                       y2, r1, r2);
        if (t == 1)
            cout << "There are 3 common tangents"
                 << " between the circles.";
        else if (t < 0)
            cout << "There are 4 common tangents"
                 << " between the circles.";
        else
            cout << "There are 2 common tangents"
                 << " between the circles.";
      
        return 0;
    }

    chevron_right

    
    

    Java

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Java program to find
    // the number of common tangents
    // between the two circles
    import java.io.*;
      
    class GFG 
    {
          
    static int circle(int x1, int y1, int x2,
            int y2, int r1, int r2)
    {
      
        int distSq = (x1 - x2) * (x1 - x2)
                    + (y1 - y2) * (y1 - y2);
      
        int radSumSq = (r1 + r2) * (r1 + r2);
      
        if (distSq == radSumSq)
            return 1;
        else if (distSq > radSumSq)
            return -1;
        else
            return 0;
    }
      
    // Driver code
    public static void main (String[] args)
    {
      
        int x1 = -10, y1 = 8;
        int x2 = 14, y2 = -24;
        int r1 = 30, r2 = 10;
        int t = circle(x1, y1, x2,
                    y2, r1, r2);
        if (t == 1)
            System.out.println ("There are 3 common tangents"+
                        " between the circles.");
        else if (t < 0)
            System.out.println ("There are 4 common tangents"+
                " between the circles.");
        else
            System.out.println ("There are 2 common tangents" +
                    " between the circles.");
      
          
    }
    }
      
    // This code is contributed by ajit. 

    chevron_right

    
    

    Python

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # Python3 program to find
    # the number of common tangents
    # between the two circles
      
    def circle(x1, y1, x2,y2, r1, r2):
      
      
        distSq = (x1 - x2) * (x1 - x2)+ (y1 - y2) * (y1 - y2)
      
        radSumSq = (r1 + r2) * (r1 + r2)
      
        if (distSq == radSumSq):
            return 1
        elif (distSq > radSumSq):
            return -1
        else:
            return 0
      
      
    # Driver code
    x1,y1 = -10,8;
    x2,y2 = 14,-24;
    r1,r2 = 30,10;
      
    t = circle(x1, y1, x2,y2, r1, r2);
      
    if (t == 1):
        print("There are 3 common tangents between the circles.")
    elif (t < 0):
        print("There are 4 common tangents between the circles.")
    else:
        print("There are 2 common tangents between the circles.")
      
    # This code is contributed by mohit kumar 29

    chevron_right

    
    

    C#

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to find 
    // the number of common tangents 
    // between the two circles 
    using System;
      
    class GFG 
          
    static int circle(int x1, int y1, int x2, 
            int y2, int r1, int r2) 
      
        int distSq = (x1 - x2) * (x1 - x2) 
                    + (y1 - y2) * (y1 - y2); 
      
        int radSumSq = (r1 + r2) * (r1 + r2); 
      
        if (distSq == radSumSq) 
            return 1; 
        else if (distSq > radSumSq) 
            return -1; 
        else
            return 0; 
      
    // Driver code 
    public static void Main (String []args) 
      
        int x1 = -10, y1 = 8; 
        int x2 = 14, y2 = -24; 
        int r1 = 30, r2 = 10; 
        int t = circle(x1, y1, x2, 
                    y2, r1, r2); 
        if (t == 1) 
            Console.WriteLine ("There are 3 common tangents"
                        " between the circles."); 
        else if (t < 0) 
            Console.WriteLine ("There are 4 common tangents"
                " between the circles."); 
        else
            Console.WriteLine ("There are 2 common tangents"
                    " between the circles."); 
      
      
    // This code is contributed by Arnab Kundu

    chevron_right

    
    

    PHP

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    <?php
    // PHP program to find 
    // the number of common tangents 
    // between the two circles 
      
    function circle($x1, $y1, $x2
            $y2, $r1, $r2
      
        $distSq = ($x1 - $x2) * ($x1 - $x2
                    + ($y1 - $y2) * ($y1 - $y2); 
      
        $radSumSq = ($r1 + $r2) * ($r1 + $r2); 
      
        if ($distSq == $radSumSq
            return 1; 
        else if ($distSq > $radSumSq
            return -1; 
        else
            return 0; 
      
        // Driver code 
        $x1 = -10; $y1 = 8; 
        $x2 = 14; $y2 = -24; 
        $r1 = 30; $r2 = 10; 
        $t = circle($x1, $y1, $x2
                    $y2, $r1, $r2); 
        if ($t == 1) 
            echo "There are 3 common tangents"
                    ," between the circles."
        else if ($t < 0) 
            echo "There are 4 common tangents"
                , " between the circles."
        else
            echo "There are 2 common tangents"
                , " between the circles."
                  
        // This code is contributed by AnkitRai01
    ?>

    chevron_right

    
    

    Output:

    There are 3 common tangents between the circles.
    


    My Personal Notes arrow_drop_up

    Budding Web DeveloperKeen learnerAverage CoderDancer&Social Activist

    If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

    Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.