vb中,已知圆上两点和半径值,求圆心坐标的程序。
3个回答
展开全部
问题:
已知圆上的两点坐标和半径,求圆心。
数学分析:这个题目,涉及到简单的数学问题,但是计算比较繁琐。
假设已知圆上的两点坐标分别为N(X1,Y1)和M(X2,Y2),半径为R,圆心坐标为o(a,b),根据数学知识可得到:
(x1-a)^2 + (y1-b)^2 = R^2----(1)式
(x2-a)^2 + (y2-b)^2 = R^2----(2)式
分别展开上述两个式子得到
(x1)^2 - 2*x1*a + a^2 + (y1)^2 - 2*y1*b + b^2 = R^2 ----(3)式
(x2)^2 - 2*x2*a + a^2 + (y2)^2 - 2*y2*b + b^2 = R^2 ----(4)式
(3)式 - (4)式
得到:
x1^2 - x2^2 + 2*(x2-x1)*a + y1^2 - y2^2 + 2*(y2-y1)*b = 0
变形得到:
a = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1) - (y2-y1)/(x2-x2) * b
设:C1 = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1)
设:C2 = (y2-y1)/(x2-x2)
a = c1 - c2 * b ----(5)式
把(5)式代入(1)式,得到;
x1^2 - 2*x1*(C1-C2*b) + (C1-C2*b)^2 + y1^2 -2*y1*b + b^2 = R^2
展开简化为关于b的一元二次方程一般形式;
(C2^2+1)*b^2 + (2*x1*C1-2*C1*C2-2*y1)*b + x1^2-2*x1*C1+C1^2+y1^2-R^2 = 0
二次项系数:A = (C2^2+1)
一次项系数:B = (2*x1*C1-2*C1*C2-2*y1)
常数项: C = x1^2-2*x1*C1+C1^2+y1^2-R^2
根的判别式:Derta = B^2 - 4*A*C
如果:Derta < 0 则无解
Derta >0 有两个不同的解
Derta =0 有两个相同的解
代码:
在窗体上添加7个文本框:
Text1 --输入已知圆上点第1个的X坐标
Text2 --输入已知圆上点第1个的Y坐标
Text3 --输入已知圆上点第2个的X坐标
Text4 --输入已知圆上点第2个的Y坐标
Text5 --输入已知圆的半径
Text6 --输出圆心的X坐标
Text7 --输出圆心的Y坐标
添加一个按钮;
代码如下:
Private Sub Command1_Click()
Dim x1, y1, x2, y2, R As Single
Dim x01, y01, x02, y02 As Single
Dim A, B, C As Single
Dim Derta As Single
Dim C1, C2 As Single
x1 = Val(Text1.Text)
y1 = Val(Text2.Text)
x2 = Val(Text3.Text)
y2 = Val(Text4.Text)
R = Val(Text5.Text)
C1 = (x2 ^ 2 - x1 ^ 2 + y2 ^ 2 - y1 ^ 2) / 2 / (x2 - x1)
C2 = (y2 - y1) / (x2 - x1)
A = (C2 ^ 2 + 1)
B = 2 * x1 * C2 - 2 * C1 * C2 - 2 * y1
C = x1 ^ 2 - 2 * x1 * C1 + C1 ^ 2 + y1 ^ 2 - R ^ 2
Derta = B ^ 2 - 4 * A * C
If Derta >= 0 Then
Derta = Derta ^ (0.5)
y01 = (-B + Derta) / 2 / A
y02 = (-B - Derta) / 2 / A
x01 = C1 - C2 * y01
x02 = C1 - C2 * y02
'因为是一元二次方程,得到2个实数根,需要略去一个增根
If Abs((x1 - x01) ^ 2 + (y1 - y01) ^ 2 - R ^ 2) < Abs((x1 - x02) ^ 2 + (y1 - y02) ^ 2 - R ^ 2) Then
Text6.Text = x01
Text7.Text = y01
Else
Text6.Text = x02
Text7.Text = y02
End If
Else
MsgBox("无解!")
Text6.Text = Derta
End If
End Sub
已知圆上的两点坐标和半径,求圆心。
数学分析:这个题目,涉及到简单的数学问题,但是计算比较繁琐。
假设已知圆上的两点坐标分别为N(X1,Y1)和M(X2,Y2),半径为R,圆心坐标为o(a,b),根据数学知识可得到:
(x1-a)^2 + (y1-b)^2 = R^2----(1)式
(x2-a)^2 + (y2-b)^2 = R^2----(2)式
分别展开上述两个式子得到
(x1)^2 - 2*x1*a + a^2 + (y1)^2 - 2*y1*b + b^2 = R^2 ----(3)式
(x2)^2 - 2*x2*a + a^2 + (y2)^2 - 2*y2*b + b^2 = R^2 ----(4)式
(3)式 - (4)式
得到:
x1^2 - x2^2 + 2*(x2-x1)*a + y1^2 - y2^2 + 2*(y2-y1)*b = 0
变形得到:
a = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1) - (y2-y1)/(x2-x2) * b
设:C1 = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1)
设:C2 = (y2-y1)/(x2-x2)
a = c1 - c2 * b ----(5)式
把(5)式代入(1)式,得到;
x1^2 - 2*x1*(C1-C2*b) + (C1-C2*b)^2 + y1^2 -2*y1*b + b^2 = R^2
展开简化为关于b的一元二次方程一般形式;
(C2^2+1)*b^2 + (2*x1*C1-2*C1*C2-2*y1)*b + x1^2-2*x1*C1+C1^2+y1^2-R^2 = 0
二次项系数:A = (C2^2+1)
一次项系数:B = (2*x1*C1-2*C1*C2-2*y1)
常数项: C = x1^2-2*x1*C1+C1^2+y1^2-R^2
根的判别式:Derta = B^2 - 4*A*C
如果:Derta < 0 则无解
Derta >0 有两个不同的解
Derta =0 有两个相同的解
代码:
在窗体上添加7个文本框:
Text1 --输入已知圆上点第1个的X坐标
Text2 --输入已知圆上点第1个的Y坐标
Text3 --输入已知圆上点第2个的X坐标
Text4 --输入已知圆上点第2个的Y坐标
Text5 --输入已知圆的半径
Text6 --输出圆心的X坐标
Text7 --输出圆心的Y坐标
添加一个按钮;
代码如下:
Private Sub Command1_Click()
Dim x1, y1, x2, y2, R As Single
Dim x01, y01, x02, y02 As Single
Dim A, B, C As Single
Dim Derta As Single
Dim C1, C2 As Single
x1 = Val(Text1.Text)
y1 = Val(Text2.Text)
x2 = Val(Text3.Text)
y2 = Val(Text4.Text)
R = Val(Text5.Text)
C1 = (x2 ^ 2 - x1 ^ 2 + y2 ^ 2 - y1 ^ 2) / 2 / (x2 - x1)
C2 = (y2 - y1) / (x2 - x1)
A = (C2 ^ 2 + 1)
B = 2 * x1 * C2 - 2 * C1 * C2 - 2 * y1
C = x1 ^ 2 - 2 * x1 * C1 + C1 ^ 2 + y1 ^ 2 - R ^ 2
Derta = B ^ 2 - 4 * A * C
If Derta >= 0 Then
Derta = Derta ^ (0.5)
y01 = (-B + Derta) / 2 / A
y02 = (-B - Derta) / 2 / A
x01 = C1 - C2 * y01
x02 = C1 - C2 * y02
'因为是一元二次方程,得到2个实数根,需要略去一个增根
If Abs((x1 - x01) ^ 2 + (y1 - y01) ^ 2 - R ^ 2) < Abs((x1 - x02) ^ 2 + (y1 - y02) ^ 2 - R ^ 2) Then
Text6.Text = x01
Text7.Text = y01
Else
Text6.Text = x02
Text7.Text = y02
End If
Else
MsgBox("无解!")
Text6.Text = Derta
End If
End Sub
展开全部
有数学公式的话 就可以做的
好久没接触这个公式了
应该求出来的圆心有两个的。
好久没接触这个公式了
应该求出来的圆心有两个的。
更多追问追答
追问
我想问下,VB可以只根据两点一半径画一段圆弧出来么?
追答
可以的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询