Equation of circle when three points on the circle are given - GeeksforGeeks

19 Jul, 2021
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. Equation of circle in general form is x2 + y2 + 2gx + 2fy + c = 0 and in radius form is (x – h)2 + (y -k)2 = r2, 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 – x2 ) +( 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++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; // Function to find the circle on// which the given three points lievoid 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 codeint 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 implementation of the approachimport java.text.*; class GFG{     // Function to find the circle on// which the given three points liestatic 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 codepublic 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
# Python3 implementation of the approachfrom math import sqrt # Function to find the circle on# which the given three points liedef 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 codeif __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
// C# implementation of the approachusing System; class GFG{     // Function to find the circle on// which the given three points liestatic 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 codestatic 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
<script> // Function to find the circle on// which the given three points liefunction 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);     //x1^2 - x3^2    var sx13 = Math.pow(x1, 2) - Math.pow(x3, 2);     // y1^2 - y3^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;     // 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    var h = -g;    var k = -f;    var sqr_of_r = h * h + k * k - c;     // r is the radius    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>
Centre = (3, 2)
Radius = 2.23607
 
ankthon
Chandan_Kumar
akshitsaxenaa09
ysachin2314
sanketgandhi1
circle
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for distance between two points on earth
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)
Convex Hull | Set 2 (Graham Scan)
Given n line segments, find if any two segments intersect
Line Clipping | Set 1 (Cohen–Sutherland Algorithm)
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7