C++ 你有在圆上应用函数的技巧吗?

C++ 你有在圆上应用函数的技巧吗?,c++,algorithm,c++11,optimization,a-star,C++,Algorithm,C++11,Optimization,A Star,我想使用a*算法在有限的硬件(CPU:Vortex86256 MB)上找到一条从a点到B点的好路径。我有一个由300x200个单元格组成的网格,带有固定的障碍物。避免障碍物的击中框是一个磁盘 我正在寻找一种优化的方法来检查我的点击框是否与障碍物发生碰撞,因为它经常发生在* 最明显的方法是检查磁盘的整个区域,如: bool check(std::function<bool(const Coordinates &)> collide) { const std::uint3

我想使用a*算法在有限的硬件(CPU:Vortex86256 MB)上找到一条从a点到B点的好路径。我有一个由300x200个单元格组成的网格,带有固定的障碍物。避免障碍物的击中框是一个磁盘

我正在寻找一种优化的方法来检查我的点击框是否与障碍物发生碰撞,因为它经常发生在*

最明显的方法是检查磁盘的整个区域,如:

bool check(std::function<bool(const Coordinates &)> collide)
{
    const std::uint32_t RADIUS2 = radius * radius;
    Coordinates cell(-radius, -radius);

    for (; cell.x <= radius; cell.x++)
    {
        for (cell.y = -radius; cell.y <= radius; cell.y++)
        {
            if (cell.x * cell.x + cell.y * cell.y <= RADIUS2 && !collide(center + cell))
            {
                return false;
            }
        }
    }

    return true;
}
bool检查(std::函数冲突)
{
常数标准::uint32_t RADIUS2=半径*半径;
坐标单元(-radius,-radius);

对于嵌套循环中的(;cell.x而言,您正在调用
std::function::operator()
。这是一个间接调用,具有非平凡的抽象代价。现在,现代CPU将具有分支预测功能,它将在最初几次调用后成功预测该分支。但您的旧芯片将因此遭受很大的损失

所以,你确实需要避免这种情况。幸运的是,第一条评论已经一针见血。通过计算障碍物周围的禁区,你可以有效地预先计算命中测试


或者,假设障碍物不移动,您可以在每个单元格上缓存命中测试的结果。如果您有一个大网格,而您最初只需要一小部分,则这一方法尤其有效。

在嵌套循环中,您调用的是
std::function::operator()
。这是一个间接调用,具有非平凡的抽象惩罚。现在,现代CPU将具有分支预测功能,它将在最初几次调用后成功预测该分支。但您的旧芯片将因此受到很大影响

所以,你确实需要避免这种情况。幸运的是,第一条评论已经一针见血。通过计算障碍物周围的禁区,你可以有效地预先计算命中测试


或者,假设障碍物不移动,你可以在每个单元格上缓存命中测试的结果。如果你有一个大的网格,而你最初只需要一小部分,这尤其有效。

你不能在生成地图时将障碍物充气吗?然后碰撞测试将减少到一个像素。我不理解你是怎么做到的。让我们想象一个障碍物,比如角落里四分之一个圆盘。你怎么把它充气?@didile任何障碍物都很容易充气:只要标记为“充气”所有距离障碍物小于R的单元格。只做一次就足够了。完成后,你会立即检查它是否允许在这个单元格内。@didile:见幻灯片9@Ilya我想到了这个主意,它工作得很好!它非常昂贵,因为我必须复制整个网格,但它只在构造函数中花费:)你不能在生成地图时将障碍物充气吗?然后碰撞测试将减少到一个像素。我不明白你是如何做到的。让我们想象一个障碍物像一个角落里四分之一的圆盘。你如何充气?@didile任何障碍物都很容易充气:只要标记为“充气”所有距离障碍物小于R的单元格。只做一次就足够了。完成后,你会立即检查它是否允许在这个单元格内。@didile:见幻灯片9@Ilya我想到了这个主意,它工作得很好!它非常昂贵,因为我必须复制整个网格,但它只在构造函数中花费:)我使用
std::function
as一种改变有效障碍物的方法,网格上的固定障碍物或从另一个源移动障碍物或两者兼而有之。我使用
std::function
作为改变有效障碍物的方法,网格上的固定障碍物或从另一个源移动障碍物或两者兼而有之。