*
已知三点求圆的
get_circle()
函数
*
x1,
y1为第一个点的坐标,以此类推
*
r为求出的半径,x0,
y0为圆心坐标
*
调用函数之前应先检查三点是否共线
否则会d出被零除的错误
***************/
#
include
void
get_circle(double
x1,
double
y1,
double
x2,
double
y2,
double
x3,
double
y3,
double*
r,
double*
x0,
double*
y0)
{
double
m1,
n1,
m2,
n2,
a1,
b1,
a2,
b2
m1
=
(x1
+
x3)
/
2
n1
=
(y1
+
y3)
/
2
m2
=
(x2
+
x3)
/
2
n2
=
(y2
+
y3)
/
2
a1
=
(y3
-
y1)
/
(x3
-
x1)
b1
=
n1
-
a1*m1
a2
=
(y3
-
y2)
/
(x3
-
x2)
b2
=
n2
-
a2*m2
*x0
=
(b2
-
b1)
/
(a1
-
a2)
*y0
=
a1
*
*x0
+
b1
*r
=
sqrt((x1-x0)*(x1-x0)
+
(y1-y0)*(y1-y0))
return
}
希望对你有帮助!
三点求圆应当是在坐标中考虑的问题,因此首先需要明确圆的公式有:(x-a)^2+(y-b)^2=r^2(此为标准公式);x^2+y^2+Dx+Ey+F=0(此为一般公式)。三点设为(x1,y1)、(x2,y2)、(x3,y3),代入一般公式后即可得到,半径R=根号下(D^2+E^2-4F)/2,圆心O坐标为(-D/2,-E/2),再将R和O代入标准公式后即为答案。
其他方法:
1、用直线方程解出R和O,三点求圆是外接圆问题,圆心在两条中垂线的交点处,故先用两点间距离得出直线方程,再运用中垂线特征,K1*K2=-1以及两点求中点,得出一条中垂线的直线方程,同理得出第二条中垂线的直线方程,将两条直线方程求解,得到圆心坐标,在三点中随意选一个点与圆心O求一个两点间距离即为R,代入标准方程即得圆方程。
2、在学习坐标系后,圆的问题都可以在坐标中解决,只要抓住半径R和圆心O即可,因为在标准公式和一般公式中,都只有三个未知量需要确定,故而三个方程是一定可以解决问题。一般公式的优势在于变量都在一次方上,所以代入一般要用一般公式;而标准公式在于当R是0时,就只有两个变量,就变成了最简单的二元二次方程问题。只要分析题中的信息得到两个公式,便可以解决问题。
#include<iostream.h>#include<math.h>
int main()
{
int x1,y1,x3,y3
double a,b,c,d,e,f
double r,k1,k2,x,y,x2,y2
cout<<"请输入x1,y1,x2,y2,x3,y3"<<endl
cin>>x1>>y1>>x2>>y2>>x3>>y3
k1=1,k2=2
if((y1==y2)&&(y2==y3))
{
cout<<"三点不构成圆!"<<endl
return 0
}
if((y1!=y2)&&(y2!=y3))
{
k1=(x2-x1)/(y2-y1)
k2=(x3-x2)/(y3-y2)
}
if(k1==k2)
{
cout<<"三点不构成圆!"<<endl
return 0
}
a=2*(x2-x1)
b=2*(y2-y1)
c=x2*x2+y2*y2-x1*x1-y1*y1
d=2*(x3-x2)
e=2*(y3-y2)
f=x3*x3+y3*y3-x2*x2-y2*y2
x=(b*f-e*c)/(b*d-e*a)
y=(d*c-a*f)/(b*d-e*a)
cout<<"圆心为("<<x<<","<<y<<")"<<endl
r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
cout<<"半径为"<<r<<endl
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)