2

我想将对象位置与网格对齐。例如,如果我的对象位置是 (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);

我的问题是:这是将对象与网格对齐的好方法吗?

% 运算符很快(我经常使用它)?

如果我使用 float 而不是 int 我可以做些什么来对齐位置?

4

2 回答 2

3

您可以使用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;
}
于 2012-08-27T03:57:01.503 回答
1

使用整数数学做同样事情的另一种方法是这样的:

inline int Align(int value, int size)
{
    return (value/size)*size;
}

如果您的尺寸是 2 的幂,您可以使用位掩码(例如尺寸 16):

inline int AlignTo16(int value)
{
    return value & 0xfff0
}
于 2012-08-27T03:55:03.587 回答