В настоящее время я работаю над этим: я создаю файл .vtm Paraview, содержащий несколько .vtr-файлов. Каждый файл .vtr содержит значение и координаты, как это, предполагая, что я работаю над размерностью 8:Разделить трехмерную матрицу на более мелкие «кубы»
<PointData Scalars="U">
<DataArray type="Float32" Name="U" format="ascii">
<!-- 8*8*8 values -->
</DataArray>
</PointData>
<Coordinates>
<DataArray type="Float32" Name="x" format="ascii">
<!-- 8 x values -->
</DataArray>
<DataArray type="Float32" Name="y" format="ascii">
<!-- 8 y values -->
</DataArray>
<DataArray type="Float32" Name="z" format="ascii">
<!-- 8 z values -->
</DataArray>
</Coordinates>
я использую quadridimensionnal массив для хранения своих значений: float ****tab
с tab[s][x][y][z]
, где:
s
- текущий шаг разделения. Он увеличивается каждый раз, когда я начинаю работать над следующим .vtr-файлом.x, y, z
значения.
Теперь вот что вызывает у меня проблемы: координаты, где я должен размещать эти точки, могут быть любыми. Он может быть постоянным (после шага, например 0, 0,1, 0,2 и т. Д.), Или нет.
Я хранил координаты в трех массивах: x[], y[], z[]
. Моя цель - сократить набор значений на более мелкие кубики. Предположим, что я разделил свои значения на 8 файлов (2^3 файла), я должен получить правильные координаты для 8 маленьких кубов. И я не могу найти способ сделать это.
Я уверен, что мой выбор структур данных ужасен, может ли кто-нибудь помочь мне с этим?
EDIT:
Вот функция генерации моего четыре звезды массива:
float**** fill_array_random4d(int split, int size)
{
float**** ret;
ret = malloc(sizeof(float***) * split);
for (int i = 0; i < split; i++)
{
ret[i] = malloc(sizeof (float**) * size);
for (int j = 0; j < size; j++)
{
ret[i][j] = malloc(sizeof (float*) * size);
for (int k = 0; k < size; k++)
{
ret[i][j][k] = malloc(sizeof (float) * size);
for (int l = 0; l < size; l++)
ret[i][j][k][l] = rand() % 100;
}
}
}
return ret;
}
Это довольно простой материал. Сейчас я использую случайные значения. Вот как я создавать и заполнять мои x, y, z
массивы:
float *x, *y, *z;
x = malloc(sizeof (float) * size);
y = malloc(sizeof (float) * size);
z = malloc(sizeof (float) * size);
for (int i = 0; i < size * split; i++)
x[i] = step * i;
for (int i = 0; i < size * split; i++)
y[i] = step * i;
for (int i = 0; i < size * split; i++)
z[i] = step * i;
Это по-прежнему очень простой, и, наконец, здесь является функция печати координат в файле, после ВТК существующего формата:
void print_Coordinates(FILE *file, float *x, float *y, float *z, int size, int split)
{
fprintf(file, " <Coordinates>\n");
for (int i = 0; i < 3; i++)
{
const char *text1 = " <DataArray type=\"Float32\" Name=\"";
const char *text2 = "\" format=\"ascii\">\n";
fprintf(file, "%s%c%s", text1, 'x' + i, text2);
for (int j = 0; j < size; j++)
{
if (i == 0)
fprintf(file, " %f\n", x[j]);
else if (i == 1)
fprintf(file, " %f\n", y[j]);
else
fprintf(file, " %f\n", z[j]);
}
fprintf(file, " </DataArray>\n");
}
fprintf(file, " </Coordinates>\n");
}
Итак, да, это не делает то, что я хочу вообще. Вот скриншот результата:
Все кубы находятся друг на друге. С кодом, который я использовал ранее, у меня было несколько кубов (по одному на файл), но они были выровнены по диагонали (что тоже плохо).
А 4- звездный программист. Впечатляет. Очень хорошо. – Igor
Не могли бы вы разместить пример кода, чтобы у нас было лучшее представление о том, что вы уже делаете? –
@Igor Да, я знаю, что это отстой, но на данный момент это выглядело как хорошая идея. – Nepho