使用C+中的单元格列表/平铺/网格进行碰撞检测的最佳数据结构+; 我是C++的新成员,基于这个问题:我想实现单元格列表,这里也描述了:从碰撞检测算法中获得更好的性能。 围绕这个主题,可能有很多不同的算法,但我想重点讨论一下这个

使用C+中的单元格列表/平铺/网格进行碰撞检测的最佳数据结构+; 我是C++的新成员,基于这个问题:我想实现单元格列表,这里也描述了:从碰撞检测算法中获得更好的性能。 围绕这个主题,可能有很多不同的算法,但我想重点讨论一下这个,c++,algorithm,C++,Algorithm,现在我正在计算二维区域上大小相同的n个球体之间的碰撞。 我将该区域划分为网格单元。 网格是单元格位置的二维数组,3是一个向量,用于存储当前在该网格单元格中的球体数量 std::array<std::array<std::vector<int>, cols>, rows> grid; 然后,我可以将球编号添加到相应的单元格中: grid[row][col].push_back(ball); 然后我检查每个网格单元中是否有球。如果是,我将实际单元格和周围单元格

现在我正在计算二维区域上大小相同的n个球体之间的碰撞。 我将该区域划分为网格单元。 网格是单元格位置的二维数组,3是一个向量,用于存储当前在该网格单元格中的球体数量

std::array<std::array<std::vector<int>, cols>, rows> grid;
然后,我可以将球编号添加到相应的单元格中:

grid[row][col].push_back(ball);
然后我检查每个网格单元中是否有球。如果是,我将实际单元格和周围单元格中的所有球连接起来,形成一个向量(网格球),并在此组中对碰撞进行暴力检查

for( int i = 1; i <rows; i = i + 1 ){
        for( int j = 1; j <cols; j = j + 1 ){
            if (grid[i][j].size()!=0){ 
                gridballs=grid[i][j];
                int nextx[]={1,1,0,-1,-1,-1,0,1}; 
                int nexty[]={0,1,1,1,0,-1,-1,-1};
                for( int k = 1; k <8; k = k + 1 ){
                    if (grid[i+nextx[k]][j+nexty[k]].size()!=0){   
                        gridballs.insert(gridballs.end(), grid[i+nextx[k]][j+nexty[k]].begin(), grid[i+nextx[k]][j+nexty[k]].end());
                    }
                }
         collisioncheck (gridballs);
        }
    }
}

for(int i=1;i首先,您的循环编写得非常糟糕。而不是:

            gridballs=grid[i][j];
            int nextx[]={1,1,0,-1,-1,-1,0,1}; 
            int nexty[]={0,1,1,1,0,-1,-1,-1};
            for( int k = 1; k <8; k = k + 1 ){
                if (grid[i+nextx[k]][j+nexty[k]].size()!=0){   
                    gridballs.insert(gridballs.end(), grid[i+nextx[k]][j+nexty[k]].begin(), grid[i+nextx[k]][j+nexty[k]].end());
                }
            }

谢谢,这个循环确实好得多。关于四叉树,这确实是一个更合适的方法,但我想了解如何改进上述链接单元格算法。你的大多数单元格都是空的吗?
            gridballs=grid[i][j];
            int nextx[]={1,1,0,-1,-1,-1,0,1}; 
            int nexty[]={0,1,1,1,0,-1,-1,-1};
            for( int k = 1; k <8; k = k + 1 ){
                if (grid[i+nextx[k]][j+nexty[k]].size()!=0){   
                    gridballs.insert(gridballs.end(), grid[i+nextx[k]][j+nexty[k]].begin(), grid[i+nextx[k]][j+nexty[k]].end());
                }
            }
balls.clear();
for (int dx=-1; dx<=1; dx++)
    for (int dy=-1; dy<=1; dy++) {
        const std::vector<int>& cell = grid[i+dx][j+dy];
        balls.insert(balls.end(), cell.begin(), cell.end());
    }
class Quadtree {
public:
    Quadtree(const vector<int>& vBalls, Quadtree* parent=NULL);
    int size() const {return nBalls;}
    bool empty() const {return nBalls == 0;}
    bool IsInside(double x, double y, double r) const; // is the ball completely inside the square?
    bool IsOutside(double x, double y, double r) const; // is the ball completely outside the square?
    // ... other member functions
private:
    double xMin, yMin, xMax, yMax; // all balls must be within this square
    vector<int> vBigBalls; // balls which occupy more than one sub-square
    vector<Quadtree> vSubsquares; // 4 subsquares
    int nBalls; // total number of balls in the square and subsquares
    Quadtree* parent; // not sure if you need this
}