Как я могу записать ландшафт в файл .raw? - PullRequest
0 голосов
/ 08 февраля 2012

Я хочу создать ландшафт с помощью шума Перлина и сохранить его в файле .raw.

Из Учебник Nehe's HeightMap Я знаю, что .raw файл читается так:

#define MAP_SIZE        1024    

void LoadRawFile(LPSTR strName, int nSize, BYTE *pHeightMap)
{
    FILE *pFile = NULL;

    // Let's open the file in Read/Binary mode.
    pFile = fopen( strName, "rb" );

    // Check to see if we found the file and could open it
    if ( pFile == NULL )    
    {
        // Display our error message and stop the function
        MessageBox(NULL, "Can't find the height map!", "Error", MB_OK);
        return;
    }

    // Here we load the .raw file into our pHeightMap data array.
    // We are only reading in '1', and the size is the (width * height)
    fread( pHeightMap, 1, nSize, pFile );

    // After we read the data, it's a good idea to check if everything read fine.
    int result = ferror( pFile );

    // Check if we received an error.
    if (result)
    {
        MessageBox(NULL, "Can't get data!", "Error", MB_OK);
    }

    // Close the file.
    fclose(pFile);

}

pHeightMap одномерный, поэтому я не понимаю, как бы я записал соответствие x, y значению высоты.Я планировал использовать либо libnoise , либо функцию noise2 на странице Кена Перлина , чтобы каждое значение в матрице 1024x1024 соответствовало высоте для точки, но файл .rawхранится в одном измерении, как я могу заставить работу x, y работать там?

1 Ответ

1 голос
/ 09 февраля 2012

Пусть A - двумерный массив с равными размерами:

A[3][3] = {
            {'a', 'b', 'c'},
            {'d', 'e', 'f'},
            {'g', 'h', 'i'}
          }

Вы также можете создать эту матрицу как одномерный массив:

A[9] = {
         'a', 'b', 'c',
         'd', 'e', 'f',
         'g', 'h', 'i'
       }

В первом случае (2-мерном) вы получаете доступ к первому элементу во втором массиве, используя обозначение, подобное A[1][0]. Тем не менее, во втором случае (1-измерение) вы получите доступ к тому же элементу, используя нотацию, подобную A[1 * n + 0], где n - длина каждого из логически содержащихся массивов, 3 в этом случае. Обратите внимание, что вы по-прежнему используете те же значения индекса (1 и 0), но для одномерного случая вы должны включить этот множитель n для смещения.

...