寻找加号形状的相对位置

时间:2017-09-01 14:27:20

标签: geometry

Example of what i need

我正在制作一个抖动库。为了找到平铺有4个单位正方形的二维平面中绝对点a的相对位置,我使用rel.x = abs.x % 4; rel.y = abs.y % 4。这很好,并产生预期的结果。但是,如果我用加号形状(3个单位)平铺飞机怎么办?我如何找到绝对位置?这里显示了瓷砖形状,1是形状的一部分,0是空白区域。

0 1 0
1 1 1 
0 1 0 

例如,如果我在a上放置了x = 1, y = 1点,则绝对位置应为x = 1, y = 1。但如果它开启,比如x = 4, y = 1,则绝对位置应为x = 1, y = 2。你看,在x = 1, y = 2点上会有另一个加号。这是如何在数学上完成的?任何语言,伪代码也都很棒。 :)

1 个答案:

答案 0 :(得分:2)

X轴和Y轴有周期性,周期为5.所以长的切换表达式可能如下所示:

case y % 5 of:
     0: case x % 5 of
         0: cx = x - 1; cy = y;
         1: cx = x; cy = y + 1;
         2: cx = x; cy = y - 1;
         3: cx = x + 1; cy = y;
         4: cx = x; cy = y; 
    1:...

或者我们可以创建常量数组5x5并使用移位-1,0,1来填充它。

 dx: [[-1,0,0,1,0],[1,0,-1,0,0],[0,0,1,0,-1],[0,-1,0,0,1],[0,1,0,-1,0]]
 dy: [[0,1,-1,0,0],[0,0,0,1,-1],[1,-1,0,0,0],[0,0,1,-1,0],[-1,0,0,0,1]]

我觉得可能存在一些简单的公式。

编辑:更简单的版本:

 const dx0: [-1,0,0,1,0]
 const dy0: [0,1,-1,0,0]

 ixy = (x - 2 * y + 10) % 5;
 dx = dx0[ixy];   
 dy = dy0[ixy]; 

最后疯狂的单行没有常数数组

 dx = (((11 + x - 2 * (y%5)) %  5) ^ 1 - 2) / 2    //^=xor; /2 - integer division
 dy = ((13 + x - 2 * (y%5)) %  5 - 2) / 2