计算坐标间的距离有三种方法比较常用,分别是曼哈顿距离、欧式距离和切比雪夫距离。

曼哈顿距离:

其原理为求两个坐标中x、y的绝对值总和。

源码:

Function 求曼哈顿距离(x1, y1, x2, y2)
求曼哈顿距离 = Abs(x1 - x2) + Abs(y1 - y2)
End Function

欧式距离:

其原理为勾股定理,通过两个坐标中x和y得到两条直角边长度,从而计算出距离。

源码:

Function 求欧式距离(x1, y1, x2, y2)
求欧式距离 = Sqr(((x1 - x2) ^ 2) + ((y1 - y2) ^ 2))
End Function

切比雪夫距离:

其原理为取两个坐标中x、y的绝对值中较大的一个作为距离。

源码:

Function 求切比雪夫距离(x1, y1, x2, y2)
Dim num1, num2
num1 = Abs(x1 - x2)
num2 = Abs(y1 - y2)
If num1 > num2 Then
求切比雪夫距离 = num1
Else
求切比雪夫距离 = num2
End If
End Function

下面我们应用以上方法来计算出距离某个目标点最近的目标点坐标。

调用方法:

Dim x, y, coordinates, i
x = 123
y = 456
coordinates = "321,123|456,123|123,321|456,654|789,987|321,654|654,987"
For i = 1 To 3
TracePrint "方法"&i&":距离目标"&x&","&y&"最近的目标为"&获取离人物最近的目标(x, y, coordinates,i)
Next

调试结果:

脚本 计算坐标间的距离.Q ,第6行:方法1:距离目标123,456最近的目标为123,321

脚本 计算坐标间的距离.Q ,第6行:方法2:距离目标123,456最近的目标为123,321

脚本 计算坐标间的距离.Q ,第6行:方法3:距离目标123,456最近的目标为123,321

源码:

Function 获取离人物最近的目标(x, y, coordinates,type_)
If coordinates = "" Then
获取离人物最近的目标 = ""
Exit Function
End If
coordinates = split(coordinates, "|")
Dim i, NearestPos,U_coordinates,coordinates1,coordinates2
NearestPos = coordinates(0)
coordinates2 = Split(NearestPos, ",")
U_coordinates = UBound(coordinates)
For i = 1 To U_coordinates
coordinates1 = Split(coordinates(i), ",")
If 求距离(x, y, CLng(coordinates1(0)), CLng(coordinates1(1)),type_) < 求距离(x, y, CLng(coordinates2(0)), CLng(coordinates2(1)),type_) Then
NearestPos = coordinates(i)
coordinates2 = Split(NearestPos, ",")
End If
Next
获取离人物最近的目标 = NearestPos
End Function
Function 求曼哈顿距离(x1, y1, x2, y2)
求曼哈顿距离 = Abs(x1 - x2) + Abs(y1 - y2)
End Function
Function 求欧式距离(x1, y1, x2, y2)
求欧式距离 = Sqr(((x1 - x2) ^ 2) + ((y1 - y2) ^ 2))
End Function
Function 求切比雪夫距离(x1, y1, x2, y2)
Dim num1, num2
num1 = Abs(x1 - x2)
num2 = Abs(y1 - y2)
If num1 > num2 Then
求切比雪夫距离 = num1
Else
求切比雪夫距离 = num2
End If
End Function
Function 求距离(x1, y1, x2, y2, type_)
If type_ = 1 Then
求距离 = 求曼哈顿距离(x1, y1, x2, y2)
ElseIf type_ = 2 Then
求距离 = 求欧式距离(x1, y1, x2, y2)
ElseIf type_ = 3 Then
求距离 = 求切比雪夫距离(x1, y1, x2, y2)
End If
End Function

以上三种方法在不同情况下的运算效率及结果可能会有差异,可根据实际情况选择合适的方法。

预览时标签不可点

发表回复

后才能评论