0

假设我有一个二维数组,我想检查一个插槽是否相邻并与另一个插槽接触。

假设坐标在 4 字节变量中:OneX, OneY, TwoX, TwoY

我有一段时间的解决方案是,如果你有差异OneX - OneYTwoX - TwoY添加它们,如果结果是1or -1,那么是的,插槽是相邻的并且是接触的。

mov EBX,[oneX]
sub EBX,[oneY]
mov ECX,[twoX]
sub ECX,[twoY]
add EBX,ECX
; Compare EBX with 1 or -1.......

这几乎可以工作。但没有 - 给定格式 (x,y),取:(3,3) 和 (0,1)。它们显然不相邻也不接触,但函数会说它们是。

获取二维数组中的相邻元素?有点用,但它侧重于查找所有相邻的匹配项,而我想检查两个特定的插槽。

我的数组的结构是这样的:

map: dd 'a','b','c','d'  ; Double words just to make my life easier

这被解释为

a b
c d

这是一张方形地图。

4

2 回答 2

1

这是一些基于@libik 答案的实用代码:

针对速度进行了优化:

; eax = OneX-TwoX; ecx = OneY-TwoY
        mov    eax, [OneX]
        mov    ecx, [OneY]
        sub    eax, [TwoX]
        sub    ecx, [TwoY]

; eax = abs(eax); ecx=abs(ecx)
        mov    ebx, eax
        mov    edx, ecx
        sar    ebx, 31
        sar    edx, 31
        xor    eax, ebx
        xor    ecx, edx
        sub    eax, ebx
        sub    ecx, edx

; eax=abs(delta1)+abs(delta2); if eax = 1, jump to where needed
        add    eax, ecx
        dec    eax
        lz     .adjacent 

尺寸优化:

; eax = abs(OneX-TwoX); ecx = abs(OneY-TwoY)
        mov    eax, [OneX]
        mov    ecx, [OneY]
        sub    eax, [TwoX]
        jns    @f
        neg    eax
@@:
        sub    ecx, [TwoY]
        jns    @f
        neg    ecx
@@:
; eax=abs(delta1)+abs(delta2); if eax = 1, jump to where needed
        add    eax, ecx
        dec    eax
        lz     .adjacent 

包括对角线案例

替换add eax, ecxor eax, ecx

于 2013-10-24T06:36:40.317 回答
1

没有理由添加它们!而且您还减去了不正确的变量:)。

你必须有两个条件:OneX - TwoX两者OneY - TwoY都必须是 1、0 或 -1。

例如,一是 [4,5],二是 [5,5] >=OneX - TwoX = -1OneY - TwoY = 0=> 它是相邻的瓷砖。

编辑:对于非对角线,有两种方法:

a) 一个条件必须为 0,另一个条件必须为 1 或 -1

b) 的绝对值相加, 的OneX - TwoX绝对值OneY - TwoY必须为 1

于 2013-10-24T01:02:28.147 回答