我正在制作一个抖动库。为了找到平铺有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
点上会有另一个加号。这是如何在数学上完成的?任何语言,伪代码也都很棒。 :)
答案 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