これは可能な解決策の 1 つです [テストされていません]。メソッドはAddNearestColumn()
各行をループし、テーブル内の他のポイントまでの距離のリストを取得します。次に、リストをループして最小値を取得します。 手動でループするのではなくdistances.Sort()
inを使用する必要がありますが、それはあなたに任せます。AddNearestColumn()
:-)
Public Sub ProcessTable(table As Data.DataTable)
AddNearestColumn(table)
End Sub
Private Sub AddNearestColumn(table As Data.DataTable)
table.Columns.Add("Nearest", GetType(Double))
For Each r As Data.DataRow In table.Rows
Dim distances As List(Of Double) = GetDistancesFromPoint(table, r)
Dim nearest As Double = Double.MaxValue
For Each distance As Double In distances
If (distance < nearest) Then nearest = distance
Next
r.Item("Nearest") = nearest
Next
End Sub
Private Function GetDistancesFromPoint(table As Data.DataTable, referenceRow As Data.DataRow) As List(Of Double)
Dim output As New List(Of Double)
For Each r As Data.DataRow In table.Rows
Dim referenceId As String = CStr(referenceRow.Item("ID"))
Dim rowId As String = CStr(r.Item("ID"))
If (rowId = referenceId) Then Continue For
Dim x1 As Double = Convert.ToDouble(referenceRow.Item("X"))
Dim y1 As Double = Convert.ToDouble(referenceRow.Item("Y"))
Dim x2 As Double = Convert.ToDouble(r.Item("X"))
Dim y2 As Double = Convert.ToDouble(r.Item("Y"))
output.Add(Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))))
Next
Return output
End Function