我想将对象位置与网格对齐。 例如,如果我的对象位置是(102,93)和 我的网格大小为10,对齐位置(倍数)必须为(100,90)。 我的程序做了很多次。
目前我正在使用它:
inline int Align(int value, int size)
{
return (value - (value % size));
}
然后,当对象位置发生变化时,我会这样做:
this->m_x = Align(new_x, GRID_SIZE);
this->m_y = Align(new_y, GRID_SIZE);
我的问题是: 这是将对象与网格对齐的好方法吗?
%运算符很快(我经常使用它)?
如果我使用int intead of int我能做些什么来对齐位置?
答案 0 :(得分:2)
您可以使用std::fmod:
inline float Align(float value, float size)
{
// Added std::abs to give correct behaviour for negative values
return value - std::abs(std::fmod(value, size));
}
或者:
inline float Align(float value, float size)
{
return std::floor(value/size) * size;
}
答案 1 :(得分:1)
使用整数数学做同样事情的另一种方法是:
inline int Align(int value, int size)
{
return (value/size)*size;
}
如果您的大小是2的幂,则可以使用位掩码(例如,大小为16):
inline int AlignTo16(int value)
{
return value & 0xfff0
}