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 center and the radius of the circle.
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 center 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 circle and putting them in general equation we get three equation with three variable 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 – x2 ) +( y12 – y32 )( y1 – y2 ) + ( x22 – x12 )( y1 – y3) + ( y22 – y12 )( y1 – y3 ) ) / ( y3 -y1 )( 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the circle on
// which the given three points lie
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;
  
    // x1^2 - x3^2
    int sx13 = pow(x1, 2) - pow(x3, 2);
  
    // y1^2 - y3^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;
  
    // eqn of circle be x^2 + y^2 + 2*g*x + 2*f*y + c = 0
    // where centre is (h = -g, k = -f) and radius r
    // as r^2 = h^2 + k^2 - c
    int h = -g;
    int k = -f;
    int sqr_of_r = h * h + k * k - c;
  
    // r is the radius
    float r = sqrt(sqr_of_r);
  
    cout << "Centre = (" << h << ", " << k << ")" << endl;
    cout << "Radius = " << r;
}
  
// Driver code
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.text.*;
  
class GFG
{
      
// Function to find the circle on
// which the given three points lie
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;
  
    // x1^2 - x3^2
    int sx13 = (int)(Math.pow(x1, 2) -
                    Math.pow(x3, 2));
  
    // y1^2 - y3^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;
  
    // eqn of circle be x^2 + y^2 + 2*g*x + 2*f*y + c = 0
    // where centre is (h = -g, k = -f) and radius r
    // as r^2 = h^2 + k^2 - c
    int h = -g;
    int k = -f;
    int sqr_of_r = h * h + k * k - c;
  
    // r is the radius
    double r = Math.sqrt(sqr_of_r);
    DecimalFormat df = new DecimalFormat("#.#####");
    System.out.println("Centre = (" + h + "," + k + ")");
    System.out.println("Radius = " + df.format(r));
}
  
// Driver code
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);
}
}
  
// This code is contributed by chandan_jnu

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
from math import sqrt
  
# Function to find the circle on 
# which the given three points lie 
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; 
  
    # x1^2 - x3^2 
    sx13 = pow(x1, 2) - pow(x3, 2); 
  
    # y1^2 - y3^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); 
  
    # eqn of circle be x^2 + y^2 + 2*g*x + 2*f*y + c = 0 
    # where centre is (h = -g, k = -f) and 
    # radius r as r^2 = h^2 + k^2 - c 
    h = -g; 
    k = -f; 
    sqr_of_r = h * h + k * k - c; 
  
    # r is the radius 
    r = round(sqrt(sqr_of_r), 5); 
  
    print("Centre = (", h, ", ", k, ")"); 
    print("Radius = ", r); 
  
# Driver code 
if __name__ == "__main__"
      
    x1 = 1 ; y1 = 1
    x2 = 2 ; y2 = 4
    x3 = 5 ; y3 = 3
    findCircle(x1, y1, x2, y2, x3, y3); 
  
# This code is contributed by Ryuga

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG
{
      
// Function to find the circle on
// which the given three points lie
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;
  
    // x1^2 - x3^2
    int sx13 = (int)(Math.Pow(x1, 2) -
                    Math.Pow(x3, 2));
  
    // y1^2 - y3^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;
  
    // eqn of circle be x^2 + y^2 + 2*g*x + 2*f*y + c = 0
    // where centre is (h = -g, k = -f) and radius r
    // as r^2 = h^2 + k^2 - c
    int h = -g;
    int k = -f;
    int sqr_of_r = h * h + k * k - c;
  
    // r is the radius
    double r = Math.Round(Math.Sqrt(sqr_of_r), 5);
  
    Console.WriteLine("Centre = (" + h + "," + k + ")");
    Console.WriteLine("Radius = " + r);
}
  
// Driver code
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);
}
}
  
// This code is contributed by chandan_jnu

chevron_right


Output:

Centre = (3, 2)
Radius = 2.23607


My Personal Notes arrow_drop_up

A fallen star which will rise again

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.



Improved By : AnkitRai01, Chandan_Kumar