【问题标题】:Align object position to grid将对象位置与网格对齐
【发布时间】:2012-08-27 03:50:31
【问题描述】:

我想将对象位置与网格对齐。 例如,如果我的对象位置是 (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 我可以做些什么来对齐位置?

【问题讨论】:

  • 你为什么还要考虑使用浮点数——假设你正在对齐像素——因为你不能有一个像素的一小部分
  • @AdrianCornish 我会考虑的。但我必须对齐 5*n 值(n > 2)。
  • 所以 - 你仍然无法对齐到半个像素

标签: c++ math


【解决方案1】:

你可以使用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;
}

【讨论】:

    【解决方案2】:

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

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

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

    inline int AlignTo16(int value)
    {
        return value & 0xfff0
    }
    

    【讨论】:

    • 请注意,这将始终向下舍入,而不是最接近的(即 99 将四舍五入为 90,而不是 100)。修改后的版本会在除法前添加size/2 以获得更好的舍入。
    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2021-05-03
    • 2018-03-03
    • 2014-02-18
    • 2010-10-02
    相关资源
    最近更新 更多