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