Given two circles with a given radius and centers. 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
Algorithm:
Step 1: Create the “circle” function, which has six inputs: x1, y1, x2, y2, r1, and r2.
Step 2: Use the following formula to determine the separation between the centers of the two circles: (x1 – x2)^2 + (y1 – y2)^2. Use the formula (r1 + r2)^2 to determine the total of the two circles’ radii.
Step 3: To ascertain the relationship between the two circles, compare the computed distance and the sum of radii: a. If the distance is equal to the sum of radii, return 1 as there is only one common tangent.
b. If the distance is greater than the sum of radii, return -1 as there are four common tangents.
c. If the distance is less than the sum of radii, return 0 as there are two common tangents.
Below is the implementation of the above approach:
// 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;
} |
// 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. |
# 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 |
// 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 |
<?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
?> |
<script> // Javascript program to find // the number of common tangents // between the two circles function circle(x1, y1, x2,
y2, r1, r2)
{ var distSq = (x1 - x2) * (x1 - x2)
+ (y1 - y2) * (y1 - y2);
var radSumSq = (r1 + r2) * (r1 + r2);
if (distSq == radSumSq)
return 1;
else if (distSq > radSumSq)
return -1;
else
return 0;
} // Driver code var x1 = -10, y1 = 8;
var x2 = 14, y2 = -24;
var r1 = 30, r2 = 10;
var t = circle(x1, y1, x2,
y2, r1, r2);
if (t == 1)
document.write(
"There are 3 common tangents between the circles." ); else if (t < 0)
document.write(
"There are 4 common tangents between the circles." ); else
document.write(
"There are 2 common tangents between the circles." ); </script> |
Output:
There are 3 common tangents between the circles.
Time Complexity: O(1)
Auxiliary Space: O(1)