好的,所以我正在开发一个小程序,它使用递归函数在四个给定点之间细分,随机生成一张地形,地形由四边形组成。每次递归找到的中心点被赋予一个随机高度值,然后将所有顶点保存到一个数组中,然后在绘制时循环遍历。
最初,我定义了用于在堆栈上存储顶点的二维数组,但是根据细分的数量,这可能会变得非常大。例如,深度 3 产生 256 个顶点。所以,我决定尽可能在堆上定义这个数组,这对于更大的地形片更有效。在 Terrain 类中,我定义了以下浮点指针数组。
float* vertices[];
然后,在这个类的构造函数中,我执行以下操作来初始化它在堆上的大小。4 的给定细分数加 1 的幂得到 256,以及创建的顶点数。
int vertexCount = pow(4.0, subdivisions+1);
*vertices = new float[vertexCount];
然后,这些指针中的每一个都指向堆中的浮点值数组,定义如下。
for(int i = 0; i<vertexCount + 1; i++)
{
float* temp = new float[3];
vertices[i] = temp;
delete temp;
temp = 0;
}
我用于创建地形的递归函数如下所示:
void Terrain::Subdivide(float* a, float* b, float* c, float* d, int subdivisions, float maxHeight)
{
if(subdivisions>0)
{
float e[3];
float f[3];
float g[3];
float h[3];
float centre[3];
int i = 0;
srand(time(NULL));
for(i = 0; i<3; i++) if(i!= 1) e[i] = (a[i]+b[i])/2;
for(i = 0; i<3; i++) if(i!= 1) f[i] = (b[i]+c[i])/2;
for(i = 0; i<3; i++) if(i!= 1) g[i] = (c[i]+d[i])/2;
for(i = 0; i<3; i++) if(i!= 1) h[i] = (d[i]+a[i])/2;
centre[0] = (h[0]+f[0])/2;
centre[2] = (e[2]+g[2])/2;
e[1] = 0;
f[1] = 0;
g[1] = 0;
h[1] = 0;
centre[1] = (float)rand()/((float)RAND_MAX/maxHeight);
Subdivide(a, e, centre, h, subdivisions-1 , maxHeight);
Subdivide(e, b, f, centre, subdivisions-1, maxHeight);
Subdivide(centre, f, c, g, subdivisions-1, maxHeight);
Subdivide(h, centre, g, d, subdivisions-1, maxHeight);
}
else
{
int i = 0;
for(i = 0; i<3; i++) {vertices[vertexCounter][i] = a[i];} vertexCounter++;
for(i = 0; i<3; i++) {vertices[vertexCounter][i] = b[i];} vertexCounter++;
for(i = 0; i<3; i++) {vertices[vertexCounter][i] = c[i];} vertexCounter++;
for(i = 0; i<3; i++) {vertices[vertexCounter][i] = d[i];} vertexCounter++;
}
}
当我简单地将顶点定义为堆栈上的二维数组(在其他地方进行了一些更改)时,该代码似乎可以工作,但是当在我的主函数中调用 glutInit 时,此代码在 Glut.h 中的以下行中产生了一个未处理的异常:(行486)
static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
我已经多次查看代码,但看不出问题出在哪里,更奇怪的是应该从 Glut.h 而不是 Terrain 类抛出异常。任何人都可以在这里看到任何问题吗?