导读:'本程序运行时耗时约为5-7秒。 '以前在vb版回复问题时编写。 VBScript code Option Explicit Private Type mypoint x As Double y As Double End Type Dim p(0 To 49) As mypoint Dim smallcx As Double Dim smallcy As Double Dim smallr As Double Private
'本程序运行时耗时约为5-7秒。
'以前在vb版回复问题时编写。
VBScript code
Option Explicit
Private Type mypoint
x As Double
y As Double
End Type
Dim p(0 To 49) As mypoint
Dim smallcx As Double
Dim smallcy As Double
Dim smallr As Double
Private Sub Form_Load()
'开始时将smallr都置成很大
smallr = 1E+90
End Sub
Private Function equ(ByVal a As Double,ByVal b As Double) As Boolean
If Abs(a - b) < 0.000001 Then
equ = True
Else
equ = False
End If
End Function
Private Function Is_Three_Point_In_A_Line(ByVal x1 As Double,ByVal y1 As Double,ByVal x2 As Double,ByVal y2 As Double,ByVal x3 As Double,ByVal y3 As Double) As Boolean
Dim a As Double,b As Double,e As Double
a = (x1 + x2) * (x1 - x2) + (y1 + y2) * (y1 - y2)
b = (x3 + x2) * (x3 - x2) + (y3 + y2) * (y3 - y2)
e = (x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1)
Is_Three_Point_In_A_Line = equ(e,0)
End Function
Private Sub Calc_TPC(ByVal x1 As Double,ByVal y3 As Double,cx As Double,cy As Double,r As Double)
Dim a As Double,e As Double
a = (x1 + x2) * (x1 - x2) + (y1 + y2) * (y1 - y2)
b = (x3 + x2) * (x3 - x2) + (y3 + y2) * (y3 - y2)
e = (x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1)
cx = (a * (y3 - y2) + b * (y2 - y1)) / (2 * e)
cy = (a * (x2 - x3) + b * (x1 - x2)) / (2 * e)
r = Sqr((x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy))
End Sub
Private Function incircle(ByVal cx As Double,ByVal cy As Double,ByVal r As Double,ByVal px As Double,ByVal py As Double) As Boolean
Dim l1 As Double,l2 As Double
l1 = px - cx
l2 = py - cy
If Sqr(l1 * l1 + l2 * l2) <= r Then
incircle = True
Else
incircle = False
End If
End Function
Private Sub Command1_Click()
Cls
Randomize Timer
Dim i As Long,j As Long,k As Long
Dim l As Long
Dim cx As Double,r As Double
Dim count As Long
'先生成50个点,并显示在屏幕上
For i = 0 To 49
p(i).x = Rnd * 2000
p(i).y = Rnd * 2000
Me.Circle (p(i).x,p(i).y),15,vbRed
Next i
'计算所有的圆
For i = 0 To 49
For j = 0 To 49
For k = 0 To 49
If Not Is_Three_Point_In_A_Line(p(i).x,p(i).y,p(j).x,p(j).y,p(k).x,p(k).y) Then
'三点可求圆
'求圆
Calc_TPC p(i).x,p(k).y,cx,cy,r
'计算所有的点是否在圆内
count = 0
For l = 0 To 49
If incircle(cx,r,p(l).x,p(l).y) Then
count = count + 1
End If
Next l
If count = 50 Then
'所有的点都在圆内
If r < smallr Then
smallcx = cx
smallcy = cy
smallr = r
End If
End If
End If
Next k
Next j
Next i
'画出最小的圆
Circle (smallcx,smallcy),smallr,vbGreen
End Sub