Equation of circle when three points on the circle are given
Given three coordinates that lie on a circle, (x1, y1), (x2, y2), and (x3, y3). The task is to find the equation of the circle and then print the centre and the radius of the circle.
The equation of circle in general form is x² + y² + 2gx + 2fy + c = 0 and in radius form is (x – h)² + (y -k)² = r², where (h, k) is the centre of the circle and r is the radius.
Examples:
Input: x1 = 1, y1 = 0, x2 = -1, y2 = 0, x3 = 0, y3 = 1
Output:
Centre = (0, 0)
Radius = 1
The equation of the circle is x2 + y2 = 1.Input: x1 = 1, y1 = -6, x2 = 2, y2 = 1, x3 = 5, y3 = 2
Output:
Centre = (5, -3)
Radius = 5
Equation of the circle is x2 + y2 -10x + 6y + 9 = 0
Approach: As we know all three-point lie on the circle, so they will satisfy the equation of a circle and by putting them in the general equation we get three equations with three variables g, f, and c, and by further solving we can get the values. We can derive the formula to obtain the value of g, f, and c as:
Putting coordinates in eqn of circle, we get:
x12 + y12 + 2gx1 + 2fy1 + c = 0 – (1)
x22 + y22 + 2gx2 + 2fy2 + c = 0 – (2)
x32 + y32 + 2gx3 + 2fy3 + c = 0 – (3)
From (1) we get, 2gx1 = -x12 – y12 – 2fy1 – c – (4)
From (1) we get, c = -x12 – y12 – 2gx1 – 2fy1 – (5)
From (3) we get, 2fy3 = -x32 – y32 – 2gx3 – c – (6)
Subtracting eqn (2) from eqn (1) we get,
2g( x1 – x2 ) = ( x22 -x12 ) + ( y22 – y12 ) + 2f( y2 – y1 ) – (A)
Now putting eqn (5) in (6) we get,
2fy3 = -x32 – y32 – 2gx3 + x12 + y12 + 2gx1 + 2fy1 – (7)
Now putting value of 2g from eqn (A) in (7) we get,
2f = ( ( x12 – x32 )( x1 – x2 ) +( y12 – y32 )( x1 – x2 ) + ( x22 – x12 )( x1 – x3 ) + ( y22 – y12 )( x1 – x3 ) ) / ( y3 – y1 )( x1 – x2 ) – ( y2 – y1 )( x1 – x3 )
Similarly we can obtain the values of 2g :
2g = ( ( x12 – x32 )( y1 – y2 ) +( y12 – y32 )( y1 – y2 ) + ( x22 – x12 )( y1 – y3) + ( y22 – y12 )( y1 – y3 ) ) / ( x3 -x1 )( y1 – y2 ) – ( x2 – x1 )( y1 – y3 )
Putting 2g and 2f in eqn (5) we get the value of c and know we had the equation of circle as x2 + y2 + 2gx + 2fy + c = 0
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findCircle( int x1, int y1, int x2, int y2, int x3, int y3)
{
int x12 = x1 - x2;
int x13 = x1 - x3;
int y12 = y1 - y2;
int y13 = y1 - y3;
int y31 = y3 - y1;
int y21 = y2 - y1;
int x31 = x3 - x1;
int x21 = x2 - x1;
int sx13 = pow (x1, 2) - pow (x3, 2);
int sy13 = pow (y1, 2) - pow (y3, 2);
int sx21 = pow (x2, 2) - pow (x1, 2);
int sy21 = pow (y2, 2) - pow (y1, 2);
int f = ((sx13) * (x12)
+ (sy13) * (x12)
+ (sx21) * (x13)
+ (sy21) * (x13))
/ (2 * ((y31) * (x12) - (y21) * (x13)));
int g = ((sx13) * (y12)
+ (sy13) * (y12)
+ (sx21) * (y13)
+ (sy21) * (y13))
/ (2 * ((x31) * (y12) - (x21) * (y13)));
int c = - pow (x1, 2) - pow (y1, 2) - 2 * g * x1 - 2 * f * y1;
int h = -g;
int k = -f;
int sqr_of_r = h * h + k * k - c;
float r = sqrt (sqr_of_r);
cout << "Centre = (" << h << ", " << k << ")" << endl;
cout << "Radius = " << r;
}
int main()
{
int x1 = 1, y1 = 1;
int x2 = 2, y2 = 4;
int x3 = 5, y3 = 3;
findCircle(x1, y1, x2, y2, x3, y3);
return 0;
}
|
Java
import java.text.*;
class GFG
{
static void findCircle( int x1, int y1,
int x2, int y2,
int x3, int y3)
{
int x12 = x1 - x2;
int x13 = x1 - x3;
int y12 = y1 - y2;
int y13 = y1 - y3;
int y31 = y3 - y1;
int y21 = y2 - y1;
int x31 = x3 - x1;
int x21 = x2 - x1;
int sx13 = ( int )(Math.pow(x1, 2 ) -
Math.pow(x3, 2 ));
int sy13 = ( int )(Math.pow(y1, 2 ) -
Math.pow(y3, 2 ));
int sx21 = ( int )(Math.pow(x2, 2 ) -
Math.pow(x1, 2 ));
int sy21 = ( int )(Math.pow(y2, 2 ) -
Math.pow(y1, 2 ));
int f = ((sx13) * (x12)
+ (sy13) * (x12)
+ (sx21) * (x13)
+ (sy21) * (x13))
/ ( 2 * ((y31) * (x12) - (y21) * (x13)));
int g = ((sx13) * (y12)
+ (sy13) * (y12)
+ (sx21) * (y13)
+ (sy21) * (y13))
/ ( 2 * ((x31) * (y12) - (x21) * (y13)));
int c = -( int )Math.pow(x1, 2 ) - ( int )Math.pow(y1, 2 ) -
2 * g * x1 - 2 * f * y1;
int h = -g;
int k = -f;
int sqr_of_r = h * h + k * k - c;
double r = Math.sqrt(sqr_of_r);
DecimalFormat df = new DecimalFormat( "#.#####" );
System.out.println( "Centre = (" + h + "," + k + ")" );
System.out.println( "Radius = " + df.format(r));
}
public static void main (String[] args)
{
int x1 = 1 , y1 = 1 ;
int x2 = 2 , y2 = 4 ;
int x3 = 5 , y3 = 3 ;
findCircle(x1, y1, x2, y2, x3, y3);
}
}
|
Python3
from math import sqrt
def findCircle(x1, y1, x2, y2, x3, y3) :
x12 = x1 - x2;
x13 = x1 - x3;
y12 = y1 - y2;
y13 = y1 - y3;
y31 = y3 - y1;
y21 = y2 - y1;
x31 = x3 - x1;
x21 = x2 - x1;
sx13 = pow (x1, 2 ) - pow (x3, 2 );
sy13 = pow (y1, 2 ) - pow (y3, 2 );
sx21 = pow (x2, 2 ) - pow (x1, 2 );
sy21 = pow (y2, 2 ) - pow (y1, 2 );
f = (((sx13) * (x12) + (sy13) *
(x12) + (sx21) * (x13) +
(sy21) * (x13)) / / ( 2 *
((y31) * (x12) - (y21) * (x13))));
g = (((sx13) * (y12) + (sy13) * (y12) +
(sx21) * (y13) + (sy21) * (y13)) / /
( 2 * ((x31) * (y12) - (x21) * (y13))));
c = ( - pow (x1, 2 ) - pow (y1, 2 ) -
2 * g * x1 - 2 * f * y1);
h = - g;
k = - f;
sqr_of_r = h * h + k * k - c;
r = round (sqrt(sqr_of_r), 5 );
print ( "Centre = (" , h, ", " , k, ")" );
print ( "Radius = " , r);
if __name__ = = "__main__" :
x1 = 1 ; y1 = 1 ;
x2 = 2 ; y2 = 4 ;
x3 = 5 ; y3 = 3 ;
findCircle(x1, y1, x2, y2, x3, y3);
|
C#
using System;
class GFG
{
static void findCircle( int x1, int y1,
int x2, int y2,
int x3, int y3)
{
int x12 = x1 - x2;
int x13 = x1 - x3;
int y12 = y1 - y2;
int y13 = y1 - y3;
int y31 = y3 - y1;
int y21 = y2 - y1;
int x31 = x3 - x1;
int x21 = x2 - x1;
int sx13 = ( int )(Math.Pow(x1, 2) -
Math.Pow(x3, 2));
int sy13 = ( int )(Math.Pow(y1, 2) -
Math.Pow(y3, 2));
int sx21 = ( int )(Math.Pow(x2, 2) -
Math.Pow(x1, 2));
int sy21 = ( int )(Math.Pow(y2, 2) -
Math.Pow(y1, 2));
int f = ((sx13) * (x12)
+ (sy13) * (x12)
+ (sx21) * (x13)
+ (sy21) * (x13))
/ (2 * ((y31) * (x12) - (y21) * (x13)));
int g = ((sx13) * (y12)
+ (sy13) * (y12)
+ (sx21) * (y13)
+ (sy21) * (y13))
/ (2 * ((x31) * (y12) - (x21) * (y13)));
int c = -( int )Math.Pow(x1, 2) - ( int )Math.Pow(y1, 2) -
2 * g * x1 - 2 * f * y1;
int h = -g;
int k = -f;
int sqr_of_r = h * h + k * k - c;
double r = Math.Round(Math.Sqrt(sqr_of_r), 5);
Console.WriteLine( "Centre = (" + h + "," + k + ")" );
Console.WriteLine( "Radius = " + r);
}
static void Main()
{
int x1 = 1, y1 = 1;
int x2 = 2, y2 = 4;
int x3 = 5, y3 = 3;
findCircle(x1, y1, x2, y2, x3, y3);
}
}
|
Javascript
<script>
function findCircle(x1, y1, x2, y2, x3, y3)
{
var x12 = (x1 - x2);
var x13 = (x1 - x3);
var y12 =( y1 - y2);
var y13 = (y1 - y3);
var y31 = (y3 - y1);
var y21 = (y2 - y1);
var x31 = (x3 - x1);
var x21 = (x2 - x1);
var sx13 = Math.pow(x1, 2) - Math.pow(x3, 2);
var sy13 = Math.pow(y1, 2) - Math.pow(y3, 2);
var sx21 = Math.pow(x2, 2) - Math.pow(x1, 2);
var sy21 = Math.pow(y2, 2) - Math.pow(y1, 2);
var f = ((sx13) * (x12)
+ (sy13) * (x12)
+ (sx21) * (x13)
+ (sy21) * (x13))
/ (2 * ((y31) * (x12) - (y21) * (x13)));
var g = ((sx13) * (y12)
+ (sy13) * (y12)
+ (sx21) * (y13)
+ (sy21) * (y13))
/ (2 * ((x31) * (y12) - (x21) * (y13)));
var c = -(Math.pow(x1, 2)) -
Math.pow(y1, 2) - 2 * g * x1 - 2 * f * y1;
var h = -g;
var k = -f;
var sqr_of_r = h * h + k * k - c;
var r = Math.sqrt(sqr_of_r);
document.write( "Centre = (" + h + ", " + k + ")" + "<br>" );
document.write( "Radius = " + r.toFixed(5));
}
var x1 = 1, y1 = 1;
var x2 = 2, y2 = 4;
var x3 = 5, y3 = 3;
findCircle(x1, y1, x2, y2, x3, y3);
</script>
|
Output
Centre = (3, 2)
Radius = 2.23607
Time Complexity: O(log(n))
Auxiliary Space: O(1)
Last Updated :
13 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...