我想知道如何将“ a-(a%b)”转换为“ a&(〜b)”(捕捉网格公式)

时间:2019-04-07 17:05:19

标签: python gml

当我搜索捕捉网格功能时。实际上是Tile Collide。(您可能知道我是因为标签而学习GMS2的。)

这对我的问题并不重要。

追逐追赶,我了解了这个公式。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets  

fig = plt.figure() 
ax = plt.axes() 
x = np.arange(0,2*np.pi)  
y = np.sin(x) 
ax.plot(x,y) 
ax.set_title('[Press \'enter\' and \'shift+enter\' to select the intervals]')

def onselect(vmin, vmax):
    if plot_key_input == 'enter':
        print('Interval type 1:', vmin, vmax)
    if plot_key_input == 'enter+shift':
        print('Interval type 2:', vmin, vmax)

# The variable plot_key_input will store the key that is pressed during the plot visualization
plot_key_input = None
# Get the key pressed during the plot visualization
def onPressKey(event):
# Defined as a global variable so it will affect other programs and functions
    global plot_key_input
    plot_key_input = event.key

# Connect the keys to the function onPressKey during the plot visualization
cid = fig.canvas.mpl_connect('key_press_event', onPressKey)

span = mwidgets.SpanSelector(ax, onselect, 'horizontal') 

plt.show() 

# Disconnect the keys to the function onPressKey
fig.canvas.mpl_disconnect(cid)

我想要的效果很好。我发现了不同的公式。

此公式适用于obj和tile的碰撞。

pos.x - (pos.x % gridwidth)  <- this is number calculation.

它具有相同的工作。发生什么事??我不明白这些公式是如何转换的。

实际上,我知道'&'与减法具有相同的作用。 但是我不理解其他人。

例如

(pos.x)&~(gridwidth-1)    <- this is binary calculation.

1 个答案:

答案 0 :(得分:1)

仅当gridwidth是2的偶数幂(例如128、256、2048等)时,这两个公式才等效。

在两种情况下,pos.x - (pos.x % gridwidth)都将floor返回gridwidth的偶数倍,“捕捉”到该网格单元格的开始处,其中网格由宽度gridwidth

如果您可以假设gridwidth是2的偶数次幂,那么(pos.x)&~(gridwidth-1)在做同样的事情。基本上,在这种假设下,一个网格单元中的每个值的不同之处仅在于其较低阶位……gridwidth位以下的位。该代码只是清除这些位,从而将结果计算为gridwidth的偶数倍,它将是网格中该单元格中的第一个位置。