计算坐标间的距离有三种方法比较常用,分别是曼哈顿距离、欧式距离和切比雪夫距离。
曼哈顿距离:
其原理为求两个坐标中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
以上三种方法在不同情况下的运算效率及结果可能会有差异,可根据实际情况选择合适的方法。
预览时标签不可点
声明:
1、本站发布的内容部分购买于网络,仅供读者学习与参考,如有侵权,请联系站长进行删除处理。
2、本站一切资源不代表本站立场,不代表本站赞同其观点和对其真实性负责。
3、本站仅分享资源,以极低的价格降低大家被割韭菜的损失。本站无法保证资源质量,所以介意的小伙伴请勿下单!
4、资源大多存储在云盘,如发现链接失效,请联系站长第一时间更新。