私は現在これに取り組んでいます: 複数の .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 などのように、ステップに続く) にすることも、そうでないこともできます。
座標を 3 つの配列に格納しますx[], y[], z[]
。私の目標は、一連の値を小さな立方体に分割することです。値を 8 つのファイル (2^3 ファイル) に分割するとします。8 つの小さな立方体の正しい座標を取得する必要があります。そして、私はそれを行う方法を見つけることができません。
私のデータ構造の選択はひどいものだと確信しています。
編集 :
これが私の4つ星配列を生成する関数です:
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 レガシー形式に従って、ファイル内の座標を出力する関数を次に示します。
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");
}
だから、ええ、それは私が望むことをまったくしません。結果のスクリーンショットは次のとおりです。
すべての立方体が重なり合っています。以前使用していたコードでは、いくつかの立方体 (ファイルごとに 1 つ) がありましたが、対角線上に配置されていました (これも良くありません)。