1

好的,所以我正在开发一个小程序,它使用递归函数在四个给定点之间细分,随机生成一张地形,地形由四边形组成。每次递归找到的中心点被赋予一个随机高度值,然后将所有顶点保存到一个数组中,然后在绘制时循环遍历。

最初,我定义了用于在堆栈上存储顶点的二维数组,但是根据细分的数量,这可能会变得非常大。例如,深度 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 类抛出异常。任何人都可以在这里看到任何问题吗?

4

1 回答 1

1

这是一个错误

for(int i = 0; i<vertexCount + 1; i++)

应该

for(int i = 0; i<vertexCount; i++)

我们从零开始计算数组的原因是您不必加一。

这是另一个错误

for(int i = 0; i<vertexCount; i++)
{
    float* temp = new float[3];
    vertices[i] = temp;
    delete temp;
    temp = 0;
}

应该

for(int i = 0; i<vertexCount; i++)
{
    vertices[i] = new float[3];
}

由于某种原因,您分配了内存,立即再次释放它,但继续使用顶点数组中释放的内存。这将很快崩溃。

第三个(希望是最终的)错误是

*vertices = new float[vertexCount];

应该

vertices = new float*[vertexCount];

为了模拟二维数组,第一个维度是浮点指针数组。这就是固定代码分配的内容。

于 2012-10-27T14:37:22.997 回答