我目前正在处理这个问题:我生成了一个包含多个 .vtr 文件的 Paraview .vtm 文件。每个 .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>
我使用四维数组来存储我的值 : float ****tab
, with tab[s][x][y][z]
, where :
s
是当前的拆分步骤。每次我开始处理下一个 .vtr 文件时,它都会增加。x, y, z
价值。
现在是给我带来麻烦的原因:我必须放置这些点的坐标可以是任何东西。它可以是恒定的(跟随一个步骤,如 0、0.1、0.2 等),也可以不是。
我将坐标存储在三个数组中:x[], y[], z[]
。我的目标是将一组值切割成更小的立方体。假设我将我的值分成 8 个文件(2^3 个文件),我必须检索 8 个小立方体的正确坐标。我找不到办法做到这一点。
我很确定我的数据结构选择很糟糕,有人可以帮我吗?
编辑 :
这是生成我的四星数组的函数:
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;
它仍然很基础,最后是打印文件中坐标的函数,遵循 vtk legacy 格式:
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");
}
所以,是的,它根本不符合我的要求。这是结果的屏幕截图:
所有的立方体都在彼此的顶部。使用我之前使用的代码,我有几个立方体(每个文件一个),但它们在对角线上对齐(这也不好)。