2012年4月28日星期六

C++で3次元の座標を格納し、辺のリストを作成し表示するには?

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;

}

没有评论:

发表评论