我正在使用用c ++编写的粒子物理库来制作游戏。
为了绘制粒子,我必须得到所有位置的数组,如此...
b2Vec2* particlePositionBuffer = world->GetParticlePositionBuffer();
这将返回一个b2Vec2对象数组(表示物理引擎中的2维向量) 我也可以使用
来设置颜色 b2ParticleColor* particleColourBuffer = world->GetParticleColorBuffer();
我想让10%的粒子具有最高的Y值(然后改变它们的颜色)
我的想法是......
1.创建一个与particlePositionBuffer数组大小相同的结构数组,结构只包含一个int(particlePositionBuffer数组中的粒子索引)和一个浮点数(粒子y位置)
然后我按y位置对数组进行排序
然后我在结构数组中前10%结构的结构中使用int来在particleColourBuffer数组中将它们的颜色添加到它们的颜色中。
有人能告诉我如何对c ++中的结构进行排序和排列吗? 你认为这是一个体面的方式吗?我只需要做一次(不是每一帧)
答案 0 :(得分:1)
如果您的粒子数量很少,无论哪种方式都无关紧要,首先使用简单的stl排序例程对它们进行排序就可以了。
如果数字很大,我会创建一个二进制搜索树,其最大大小为粒子数的10%。然后我会保持minY实际存储在树中以便快速拒绝。然后这个算法应该这样做:
二叉搜索树具有快速插入,快速搜索和维护订购的优点。如果你想 FAST ,这比整个数组上的完整排序要好。
答案 1 :(得分:1)
以下可能会有所帮助:
// Functor to compare indices according to Y value.
struct comp
{
explicit comp(b2Vec2* particlePositionBuffer) :
particlePositionBuffer(particlePositionBuffer)
{}
operator (int lhs, int rhs) const
{
// How do you get Y coord ?
// note that I do rhs < lhs to have higher value first.
return particlePositionBuffer[rhs].getY() < particlePositionBuffer[lhs].getY();
}
b2Vec2* particlePositionBuffer;
};
void foo()
{
const std::size_t size = world->GetParticleCount(); // How do you get Count ?
const std::size_t subsize = size / 10; // check for not zero ?
std::vector<std::size_t> indices(size);
for (std::size_t i = 0; i != size; ++i) {
indices[i] = i;
}
std::nth_element(indices.begin(), indices.begin() + subsize, indices.end(),
comp(world->GetParticlePositionBuffer()));
b2ParticleColor* particleColourBuffer = world->GetParticleColorBuffer();
for (std::size_t i = 0; i != subsize; ++i) {
changeColor(particleColourBuffer[i])
}
}