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

📅  最后修改于: 2021-10-23 08:53:34             🧑  作者: 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


Javascript


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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程