我正在使用 Box2D 和 SFML 编写游戏,我想让我的用户导入他们自己的纹理以用作物理多边形。多边形是使用图像的 Alpha 层创建的。它不需要像素完美,这就是我的问题所在。如果它是像素完美的,那么当玩家被困在两个相当复杂的形状之间时,它就会变得非常错误。我有一个有效的边缘检测算法,它会产生类似这样的东西。它是每个像素的像素(并且它所描绘的形状只是一个带有凹陷的正方形)。在那之后,我有一个简化算法来产生这个。它对我来说很好,但如果每个角落都这样追踪,我会有一些问题。向量简化的代码是这样的:
//borders is a std::vector containing simple Box2D b2Vec2 (2D vector class containing an x and a y)
//vector shortener
for(unsigned int i = 0; i < borders.size(); i++)
{
int x = 0, y = 0;
int counter = 0;
//get the values for x and y that need to be added to check whether in a line or not
x = borders[i].x - borders[i-1].x;
y = borders[i].y - borders[i-1].y;
//while points are aligned..
while((borders[i].x + x*counter == borders[i + counter].x) && (borders[i].y + y*counter == borders[i+counter].y))
{
counter++;
}
if(counter-1 > i)
{
borders.erase(borders.begin() + i, borders.begin() + i + counter -1);
}
}
所以我的问题是,我怎样才能将之前的一组向量转换成不太精确的东西?有没有舍入算法?如果是这样,哪个最好?你能给我什么建议吗?生成的多边形是凸面还是凹面都没有关系,无论如何我都会对其进行三角测量。
谢谢,
阿斯特阿尔夫