次のようにフォーマットされた四面体を含むファイルを読み取るプログラムを作成しようとしています。
T 109 20 10 19
[T X1 X2 X3 X4 ]
T 123 34 24 33
T 182 83 82 92
各行の各数値 X は、データ ファイルの行 X の (x、y、z 座標の) トリプレットを示します。
line 1 x y z
line 2 x y z
[.......]
line n x y z
ここに同様の(しかしより単純な)質問を投稿しましたParsing data from ASCIIformatted file in C . 今回は、四面体ファイルを読み取り、これらの四面体の頂点の座標を表す 4 つの行番号を配列vertid[]
(0 から 3) に格納し、ポインターの配列を使用して四面体を頂点にリンクすることを考えています。Vertex
構造。要約すると、ライン ID 番号を四面体構造に格納し、ポインターを正しい頂点に「ポイント」するように設定します。
私はプログラマーではないことに注意してください (ボロノイ図を生成するにはこれが必要です)。また、四面体を構成する頂点を保存する代わりに、エッジを保存した方が簡単でしょうか (ボロノイ D の生成には、頂点データではなくエッジ データが実際に必要になると思います)。私は日曜日にこれに取り組んでいますが、機能していません。その理由はわかりません。ありがとうございました。
(動作しない) 例:
#define FILEPATHtri "/pathto/grid1DT.txt"
#define FILEPATHorg "/pathto/grid1.txt"
#define MAX 10000
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "math.h"
typedef struct
{
float x;
float y;
float z;
char ID;
}Vertex;
/* NOT USED ATM
typedef struct {
edge_ref next[4]; // pointers to other edges (AQE data structure)
void *data[4]; // pointers to endpoints of edge
unsigned ID; // ID of edge
}Edge;
*/
typedef struct
{
Vertex *vert[4];
int vertid[4];
char t;
}Tetra;
void file_link (void)
{
Vertex *vert_dt = malloc( MAX * sizeof (Vertex) ) ;
Vertex *vert_std = malloc( MAX * sizeof (Vertex) ) ;
Tetra *tetrahedron = malloc(MAX * sizeof (Tetra) );
FILE *fp1,*fp2 ;
fp1 = fopen( FILEPATHtri,"r");
int i = 0;
while(fscanf(fp1, "%c %i %i %i %i ", &tetrahedron[i].t, &tetrahedron[i].vertid[0], &tetrahedron[i].vertid[1],
&tetrahedron[i].vertid[2], &tetrahedron[i].vertid[3] ) == 5 ) // Saving the line numbers into vertid[0..3]
{
i++;
}
fclose(fp1);
fp2 = fopen( FILEPATHorg,"r");
int j = 0;
while(fscanf(fp2, "%f %f %f ", &vert_std[j].x, &vert_std[j].y, &vert_std[j].z ) == 3 )
{
j++;
}
fclose(fp2);
int n;
for (n=0; n<i; n++) {
tetrahedron[n]->vert[0]=vert_std[ tetrahedron[n].vertid[0] ]; // retriving coords from the standard file and storing
tetrahedron[n]->vert[1]=vert_std[ tetrahedron[n].vertid[1] ]; // them in the vertex pointer array of tretrahedron
tetrahedron[n]->vert[2]=vert_std[ tetrahedron[n].vertid[2] ];
tetrahedron[n]->vert[3]=vert_std[ tetrahedron[n].vertid[3] ];
}
int m = 100; //used to retrieve m'th tetra, so that I can print the tetra that I want,just for checking purposes..
// printing 13 variables in total...
printf("These are the 4 coordinates of the vertices of the %i th tetrahedron from the DT file %f %f %f\n%f %f %f\n%f %f %f\n%f %f %f\n", n,
tetrahedron[n]->vert[0]->x,tetrahedron[n]->vert[0]->y,tetrahedron[n]->vert[0]->z,
tetrahedron[n]->vert[1]->x,tetrahedron[n]->vert[1]->y,tetrahedron[n]->vert[1]->z,
tetrahedron[n]->vert[2]->x,tetrahedron[n]->vert[2]->y,tetrahedron[n]->vert[2]->z,
tetrahedron[n]->vert[3]->x,tetrahedron[n]->vert[3]->y,tetrahedron[n]->vert[3]->z);
free(vert_dt);
free(vert_std);
free(tetrahedron);
}
int main(void) {
file_link();
return 0;
}