Как мне получить правильные ответы, используя мой код с барицентрической формулой?

#c

#c

Вопрос:

Моя функция getHeightOfTerrain() вызывает функцию барицентрической формулы, которая не возвращает правильную высоту для одной заданной тестовой высоты в : heightMapFromArray[][] .

Я пытался посмотреть руководства по JAVA-играм OpenGL 14,21, 22 от «thin matrix», и я запутался в том, как использовать мой массив: heightMapforBaryCentric в обеих предоставленных функциях и как каким-то образом установить аргументы, которые передаются в baryCentic() функцию, чтобы я мог решить проблему.

 int creaateTerrain(int height, int width)
{
    float holderY[6] = { 0.f ,0.f,0.f,0.f,0.f,0.f };
    float scaleit = 1.5f;
    float holder[6] = { 0.f,0.f,0.f,0.f,0.f,0.f };
    for (int z = 0, z2 =0; z < iterationofHeightMap;z2  )
    {
        //each loop is two iterations and creates one quad (two triangles)
        //however because each iteration is by two (i.e. : x=x 2) om bottom
        //the amount of triangles is half the x value
        //
        //number of vertices : 80 x 80 x 6.

        //column
        for (int x = 0, x2 = 0; x < iterationofHeightMap;x2  ) 
        {

            //relevant - A   :  first triangle - on left triangle
            //[row] [colum[]
            holder[0] = heightMapFromArray[z][x];
            //holder[0] = (float)imageData[(z / 2 * MAP_Z   (x / 2)) * 3];
            //holder[0] = holder[0] / 255;// *scaleit;
            vertices.push_back(glm::vec3(x, holder[0], z));
            //match height map with online barycentric use
            heightMapforBaryCentric[x2][z2] = holder[0];

            holder[1] = heightMapFromArray[z 2][x];
            //holder[1] = (float)imageData[(((z   2) / 2 * MAP_Z   ((x) / 2))) * 3];
            //holder[1] = holder[1] / 255;// 6 * scaleit;
            vertices.push_back(glm::vec3(x, holder[1], z   2));
            //match height map with online barycentric use
            heightMapforBaryCentric[x2][z2 1] = holder[1];

            holder[2] = heightMapFromArray[z 2][x 2];
            //holder[2] = (float)imageData[(((z   2) / 2 * MAP_Z   ((x   2) / 2))) * 3];
            //holder[2] = holder[2] / 255;// *scaleit;
            vertices.push_back(glm::vec3(x   2, holder[2], z   2));
            ////match height map with online barycentric use
            heightMapforBaryCentric[x2 1][z2 1] = holder[2];


            //relevant - B  - second  triangle (on right side)

            holder[3] = heightMapFromArray[z][x];
            //holder[3] = (float)imageData[((z / 2)*MAP_Z   (x / 2)) * 3];
            //holder[3] = holder[3] / 255;// 256 * scaleit;
            vertices.push_back(glm::vec3(x, holder[3], z));


            holder[4] = heightMapFromArray[x 2][z 2];
            //holder[4] = (float)imageData[(((z   2) / 2 * MAP_Z   ((x   2) / 2))) * 3];
            //holder[4] = holder[4] / 255;// *scaleit;
            vertices.push_back(glm::vec3(x   2, holder[4], z   2));

            holder[5] = heightMapFromArray[x 2][z];
            //holder[5] = (float)imageData[((z / 2)*MAP_Z   ((x   2) / 2)) * 3];
            //holder[5] = holder[5] / 255;// *scaleit;
            vertices.push_back(glm::vec3(x   2, holder[5], z));
            x = x   2;
        }
        z = z   2;
    }
    return(1);
}


float getHeightOfTerrain(float worldX, float worldZ) {


    float terrainX = worldX;
    float terrainZ = worldZ;
    int gridSquareSize = 2.0f;
    gridX = (int)floor(terrainX / gridSquareSize);
    gridZ = (int)floor(terrainZ / gridSquareSize);
    xCoord = ((float)(fmod(terrainX, gridSquareSize)) / (float)gridSquareSize);
    zCoord = ((float)(fmod(terrainZ, gridSquareSize)) / (float)gridSquareSize);

    if (xCoord <= (1 - zCoord)) 
    {

        answer = baryCentric(
        //left triangle
        glm::vec3(0.0f, heightMapforBaryCentric[gridX][gridZ], 0.0f),
        glm::vec3(0.0f, heightMapforBaryCentric[gridX][gridZ 1], 1.0f),
        glm::vec3(1.0f, heightMapforBaryCentric[gridX 1][gridZ 1], 1.0f),
        glm::vec2(xCoord, zCoord));

    //  if (answer != 1)
    //  {
    //      fprintf(stderr, "Z:gridx: %d  gridz: %d  answer: %fn", gridX, gridZ,answer);
    //      
    //  }
    }
    else
    {
        //right triangle
        answer = baryCentric(glm::vec3(0, heightMapforBaryCentric[gridX][gridZ], 0),
            glm::vec3(1,heightMapforBaryCentric[gridX 1][gridZ 1], 1), 
            glm::vec3(1,heightMapforBaryCentric[gridX 1][gridZ], 0), 
            glm::vec2(xCoord, zCoord));


    }

    if (answer == 1)

    {
        answer = 0;
    }

    //answer = abs(answer - 1);

    return(answer);
}


float baryCentric(glm::vec3 p1, glm::vec3 p2, glm::vec3 p3 , glm::vec2 pos) {
    float det = (p2.z - p3.z) * (p1.x - p3.x)   (p3.x - p2.x) * (p1.z - p3.z);
    float l1 = ((p2.z - p3.z) * (pos.x - p3.x)   (p3.x - p2.x) * (pos.y - p3.z)) / det;
    float l2 = ((p3.z - p1.z) * (pos.x - p3.x)   (p1.x - p3.x) * (pos.y - p3.z)) / det;
    float l3 = 1.0f - l1 - l2;
    return (l1 * p1.y   l2 * p2.y   l3 * p3.y);
}
  

Мои ожидаемые результаты заключались в том, что центр высоты тестовой сетки должен был иметь заданное значение .5 и постепенно уменьшаться по мере уменьшения высоты. Моими результатами были высоты, которые были одинаковыми, варьировались или увеличивались. Обычно эти высоты были меньше единицы.

Комментарии:

1. Выполните функцию с помощью отладчика и посмотрите, где программа отклоняется от ожидаемого. Скорее всего, ошибка именно в этом.

2. Хорошо. Я не уверен, правильно ли я вообще вызываю барицентрическую формулу, правильно ли это выглядит? Спасибо!