
已知所有小"圓點"坐標陣列為(x(n),y(n)),求在哪個坐標中以半徑a范圍內包含了最多圓心。
補充:比如說n是0到20,“圓點”都是隨機的坐標,該平面的大小為20*20
Randomize
For n = 0 To 20
x(n) = int(rnd * 20)
y(n) = int(rnd * 20)
Next
uj5u.com熱心網友回復:
我用的是窮舉法,代碼有點繁瑣(因為我是初學者,而且數學不好!)得出的圓心坐標不一定只有1個 所以回傳值是數字的。
代碼我沒有測驗,如果有問題 繼續說!
Private Type PT
x As Long
y As Long
End Type
Private Function GetPt(Pts() As PT) As PT() '傳入一個PT 陣列 回傳圓心的陣列
Dim Up((UBound(Pts)), 1) As Integer, tmpUp As Integer
Dim tmpLong(UBound(Pts)) As Long
Dim i As Integer, q As Integer
tmpUp = 1
For i = 0 To UBound(Pts)
For q = 0 To UBound(Pts)
If i <> q Then
tmpLong(q) = CPt(Pts(i), Pts(q))
End If
Next
tmpUp = GetLongLenth(tmpLong)
For i = 0 To UBound(Pts)
If Up(i, 0) <= tmpUp Then
Up(i, 0) = tmpUp
Up(i, 1) = i
Exit For
End If
Next
Next
Dim tmpUpNum As Integer
For i = 0 To UBound(Pts)
If Up(i, 0) <> Up(i + 1) Then
tmpUpNum = i
Exit For
End If
Next
Dim RPt(tmpUpNum) As PT
For i = 0 To tmpUpNum
RPt(i) = Pts(Up(i, 1))
Next
GetPt = RPt
End Function
Private Function CPt(Pt1 As PT, Pt2 As PT) As Long
CPt = ((Pt1.x - Pt2.x) ^ 2 + (Pt1.y - Pt2.y) ^ 2) ^ (1 / 2)
End Function
Private Function GetLongLenth(tmpLong() As Long) As Integer
Dim tmpNum As Integer, tmpNum1 As Integer
Dim i, q
For i = 0 To UBound(tmpLong)
tmpNum1 = 0
For q = 0 To UBound(tmpLong)
If q <> i And tmpLong(i) = tmpLong(q) Then
tmpNum1 = tmpNum1 + 1
End If
Next
If tmpNum1 > tmpNum Then
tmpNum = tmpNum1
End If
Next
GetLongLenth = tmpNum
End Function
uj5u.com熱心網友回復:
回傳值是陣列的 上面打錯了uj5u.com熱心網友回復:
親呀,窮舉法我曉得呀,如果是整桌面解析度大小呢,1024*768*20那就要一千多萬個回圈啦uj5u.com熱心網友回復:
能看的出 你沒有理解代碼,圓心到圓周的距離是相等的,以這個為基礎。
GetPt函式意義:計算出每個圓點之間的距離,然后判斷那一個圓點到其他圓點距離的值相等次數最多,然后回傳這個圓點。
有某些情況有很多圓點到其他圓點的距離相等次數相等(也就是說以某些圓點為圓心以其他圓點到圓心的距離為半徑) 所以答案可能不只有一個,所以回傳值我用的是PT型別的陣列。
uj5u.com熱心網友回復:
舉個呼叫例子吧!dim tmpPt() as Pt,RtmpPt() as Pt
'這里把隨機的圓點傳入tmpPt 中
RtmpPt()=GetPt(tmpPt)
for i = 0 to ubound(rtmppt)
msgbox "第" & i & "以半徑a范圍內包含了最多圓心的坐標為 " rtmppt(i).x & "," & rtmppt(i).y
next
代碼沒檢查 你試試估計沒有問題
uj5u.com熱心網友回復:
計算技術最基礎的方法,就是窮舉。求最多,恰恰是難以優化的。如果是求最少,如果當前項計算到比現有最少多,就可以停止計算了。而最多則不行。
因此,這樣的問題就需要一些“智能化”處理,排除一些點不予窮舉。
比如,你可以將 X 坐標以及 Y 坐標最小和最大的 n 項排除掉,因為它們的某一側沒有其他的點,因此不大可能是包含最多的。當然了,如果這些點是非均勻分布的,這一項優化就不適用。
總之,一旦涉及到“優化”,就會與具體問題密切相關。
uj5u.com熱心網友回復:
還有一個可優化的方法,在窮舉所有的其他點是否在當前點某半徑范圍內時,可排除掉 X 或 Y 坐標之差已經大于半徑的點,而不必計算兩點間距離了。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/128900.html
標籤:非技術類
上一篇:vb倉庫管理系統出入庫問題
下一篇:求一段小程式。影像處理的
