给定位于圆上的三个坐标(x1, y1) 、 (x2, y2)和(x3, y3) 。任务是找到圆的方程,然后打印圆的中心和半径。
一般形式的圆方程为x² + y² + 2gx + 2fy + c = 0 ,半径形式为(x – h)² + (y -k)² = r² ,其中(h, k)是圆心圆, r是半径。
例子:
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
方法:众所周知,所有三点都在圆上,因此它们将满足圆的方程,将它们放入一般方程中,我们得到三个方程,其中包含三个变量g 、 f和c ,并通过进一步求解我们可以得到值。我们可以推导出获得 g、f 和 c 值的公式为:
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
下面是上述方法的实现:
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 现场工作专业课程和学生竞争性编程现场课程。