1

我对 vb.net 相当陌生,经过几个小时的搜索后找不到任何具体的帮助。

我有一个包含三列的数据点表,第 1 列是“点 id”,第 2 列是“x 坐标”,第 3 列是“y 坐标”。我需要添加第四列,然后用迭代过程中的第二低值填充它。

迭代过程是找到从该点到其他点的距离,并返回第二低的值,因为最小值将为 0(到自身的距离)。点 1 和点 2 之间的距离的数学公式是 sqrt(((x2-x1) (x2-x1))+((y2-y1) (y2-y1)))。

我正在努力在迭代过程中执行迭代过程以重新调整单个值。

任何帮助将不胜感激:)

4

2 回答 2

1

遍历表中的行。然后对于每一行再次遍历表中的行。但是,当您到达当前主要迭代所在的行时,您可以跳过该行并继续前进。此外,由于距离是点对之间的距离,因此您只需要遍历表中的一半行即可获得所有距离。

如果您发布有关您如何实现此功能的更多详细信息,则可能可以通过一些代码来帮助您,但是就像现在一样,您甚至不说您拥有什么样的表或您的程序是如何设置的,所以很难更具体。

于 2013-03-27T00:20:58.153 回答
1

这是一种可能的解决方案[未经测试]。该AddNearestColumn()方法遍历每一行并获取到表中其他点的距离列表。然后它遍历列表并获取最小值。您应该使用distances.Sort()inAddNearestColumn() 而不是手动循环,但我会把它留给您。:-)

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
于 2013-03-27T00:41:27.920 回答