C++で3次元の座標を格納し、辺のリストを作成し表示するには?
objのファイルから読み込んで、立体の座標を読み込み
辺のリストを作成したいのですが、格納がうまくいきません。。。
アドバイス等、参考になるサイトがありましたらお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MELM 1000
#define MBFF 256
typedef struct vtex { // 頂点
double x;
double y;
double z;
} VTEX;
typedef struct face { //面
int vtx[4];
int vec;
} FACE;
int main(){
VTEX node[MELM];
NVEC nvct[MELM];
FACE surf[MELM];
char *p,bff[MBFF];
char grp[3];
char srf[12];
int nv,nn,nf;
int k;
// 入力ループ
nv = nn = nf = 0;
while(fgets(bff,MBFF,stdin)!=NULL) {
strcpy(grp,strtok(bff," "));
p = NULL;
//点リスト
if(strcmp("v",grp)==0) {
node[nv].x =strtod(strtok(NULL," \n"),NULL);
node[nv].y =strtod(strtok(NULL," \n"),NULL);
node[nv].z =strtod(strtok(NULL," \n"),NULL);
printf("v%d %9f %9f %9f\n",nv,node[nv].x,node[nv].y,node[nv].z);
nv++;
} else
// 面リスト
} else {
printf("f%d",nf);
for(k=0;k<4;k++) {
strcpy(srf,strtok(NULL," \n"));
surf[nf].vtx[k] = strtol(srf,NULL,10)-1;
surf[nf].vec = strtol(srf+3,NULL,10)-1;
printf(" %d",surf[nf].vtx[k]);
}
printf(" //%d\n",surf[nf].vec);
nf++;
}
}
//辺リストの作成、格納
ココの部分になります。。。
return 0;
}
/*
辺リストの用途はともかく、頂点と面のデータから、
作成し格納し、表示する処理を追加しました。
法泉の入力は削除されたようですが、面が矩形平面に
決まっているなら、辺と同じようにして(計算は必要)
頂点と面から生成できます。質問には含まれてないので
ここでは省きます。
今回はコンパイルもしていませんので、何かバグってる
かも知れませんが、よろしく。
*/
#include_<stdio.h>
#include_<stdlib.h>
#include_<string.h>
#define_MELM_1000
#define_MBFF_256
typedef_struct_vtex_{_//_頂点
__double_x;___//_x_座標
__double_y;___//_y_座標
__double_z;___//_z_座標
}_VTEX;
typedef_struct_edge_{
__int___vs;___//_始点VTEXインデクス
__int___ve;___//_終点VTEXインデクス
}_EDGE;
typedef_struct_face_{_//面
__int_vtx[4];_//_4隅の頂点インデクス
__int_vec;____//_法線インデクス:未定
}_FACE;
int_main(){
__VTEX__node[MELM];_//_頂点テーブル
__NVEC__nvct[MELM];_//_法線テーブル:未定
__FACE__surf[MELM];_//_面テーブル
__EDGE__edge[MELM];_//_辺テーブル
__int___vs,ve;______//_辺の始点終点インデクス
__char__bff[MBFF];__//_入力バッファ
__char__grp[3];_____//_行の先頭のコード
__char__srf[12];____//_面データ文字列
__int___nv;_________//_頂点数
__int___nf;_________//_面の数
__int___nn;_________//_法線の数:未定
__int___ne;_________//_辺の数
__int___i,j,k;______//_インデクス
__int___n;__________//_インデクス
__//_入力ループ
__nv_=_nf_=_ne_=_0;
__while(fgets(bff,MBFF,stdin)!=NULL)_{
____strcpy(grp,strtok(bff,"_"));
____//点リスト:入力、格納、表示
____if('v'==*grp)_{
______node[nv].x_=strtod(strtok(NULL,"_\n"),NULL);
______node[nv].y_=strtod(strtok(NULL,"_\n"),NULL);
______node[nv].z_=strtod(strtok(NULL,"_\n"),NULL);
______printf("v%d_%9f_%9f_%9f\n",
______nv,node[nv].x,node[nv].y,node[nv].z);
______nv++;
____//_面リスト:入力、格納、表示
____}_else_if('f'==*grp)_{
______printf("f%d",nf);
______for(k=0;k<4;k++)_{
________strcpy(srf,strtok(NULL,"_\n"));
________surf[nf].vtx[k]_=_strtol(srf,NULL,10)-1;
________surf[nf].vec_=_strtol(srf+3,NULL,10)-1;
________printf("_%d",surf[nf].vtx[k]);
______}
______printf("_//%d\n",surf[nf].vec);
______nf++;
____}
__}
__//_入力終了
__//_辺リスト:作成、格納、表示
__//_面ループ
__for(k=0;k<nf;k++)_{
____//_面頂点ループ
____for(i=0;i<4;i++)_{
______j_=_(i<3)_?_i+1_:_0;
______vs_=_surf[k].vtx[i];
______ve_=_surf[k].vtx[j];
______for(n=0;n<ne;n++)_{
________if((edge[n].vs==vs_&&_edge[n].ve==ve)_||
___________(edge[n].vs==ve_&&_edge[n].ve==vs)_){
___________;_//_同一辺:何もしない
________}_else_{
__________edge[ne].vs_=_vs;
__________edge[ne].ve_=_ve;
__________printf("e%d_v[%d]_v[%d]\n",ne,vs,ve);
__________ne++;
________}
______}
____}
__}
__//_辺リスト作成終了
__return_0;
}
没有评论:
发表评论