📜  给定圆上的三个点时的圆方程

📅  最后修改于: 2021-04-29 18:06:41             🧑  作者: Mango

给定位于圆上的三个坐标(x1,y1)(x2,y2)(x3,y3) 。任务是找到圆的方程,然后打印圆的中心和半径。
一般形式的圆方程为x²+y²+ 2gx + 2fy + c = 0 ,半径形式为(x – h)²+(y -k)²=r² ,其中(h,k)是中心圆, r是半径。

例子:

方法:由于我们知道所有三个点都在圆上,因此它们将满足圆方程,并将它们放在一般方程中,我们得到三个具有三个变量gfc的方程,并通过进一步求解可以得到值。我们可以导出公式来获得g,f和c的值,如下所示:

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
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;
}


Java
// 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


Python3
# 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


C#
// 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


输出:
Centre = (3, 2)
Radius = 2.23607