[英]How to check if a point lies on the (minimum) manhattan distance line?
我有一个8x10矩阵,其中某些方块被遮挡了:
no = [(2,4),(3,4),(6,4),(7,4),(2,5),(3,5),(6,5),(7,5)]
而且我需要找出两点之间的最短(曼哈顿)路径(作为嵌套元组(((0,5),(6,2))给予此功能)是否包含任何块,然后围绕它进行重新布线。
现在要执行此操作,我试图通过将从A到C的距离加到从C到B的距离上并看是否等于C来求出欧几里德距离的逻辑,以查看C是否在A和B之间的线上。 A到B ,但我不相信数学……
def manhattan_dist(move): #order doesn't matter
a = move[0][0]
b = move[0][1]
c = move[1][0]
d = move[1][1]
mandist = abs(a-c)+abs(b-d)
if (any (abs(a-box[0])+abs(b-box[1])) == (mandist-(abs(c-box[0])+abs(d-box[1]))) for box in no):
print("blocked")
#calculate go-around logic
return mandist
它为manhattan_dist(((0,1),(0,7)))
打印“ blocked”,所以我知道我在python中也做错了。
由于缺少代表,回答而不是发表评论(...我是新来的)。
在我看来有点不明确。 曼哈顿距离没有一条最短的路线...实际上,按照定义,它有许多最短的路线。
所以也许尝试弄清楚你的意思?
顺便说一句,如果您想知道是否有任何曼哈顿路径被阻止,那么这意味着您有一个带有
min([a, c]) < box[0] < max([a, c]) and min([b, d]) < box[1] < max([b, d])
根据评论中的讨论进行编辑:
首先,总是有精确的abs(ac) + abs(bd)
选择具有最小曼哈顿距离的abs(ac)
路径。 (对不正确的表示法表示抱歉;仅在出现参数params的情况下,不幸的是缺少乳胶支持)。
如果您正确地处理了几何图形,那么所有被阻塞的最小路径都是非常棘手的,而且不会很快。 我不会立即看到一种避免循环遍历所有路径的方法,通过将路径分类为分层树并在正方形被阻塞时删除完整分支而获得了一些优化……
现在要执行此操作,我试图通过将从A到C的距离加到从C到B的距离上并看是否等于C来求出欧几里德距离的逻辑,以查看C是否在A和B之间的线上。 A到B
您在此处使用的数学概念称为“度量”。 这只是您已经熟悉的欧几里得距离的概括。 有关详细信息,请参见Wikipedia文章 。 曼哈顿距离满足度量标准的所有要求。 这意味着可以确信,如果d(A, B) + d(B, C) = d(A, C)
则B
位于A
和C
之间A
最短路径上。 与欧几里得距离不同,从A
到C
的距离可能很多,并且其中许多路径可能会经过B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.