void GetData::readPlateData(SpiceInt handle,SpiceDLADescr dladsc) { SpiceInt n; SpiceInt start; int i; //dasopr_c("/Users/m5151134/kernels/generic_kernels/dsk/hay_a_amica_5_itokawashape_v1_0_64q.bds.txt", &handle); dlabfs_c(handle,&dladsc,&found); for( i = 1 ; i <= np ; i++ ){ start = 3*(i-1); dski02_c ( handle, &dladsc, SPICE_DSK_KWPLAT, start, 3, &n, pd[i-1] ); } //dascls_c ( handle ); }
void GetData::readVerticesData(SpiceInt handle,SpiceDLADescr dladsc){ SpiceInt n; SpiceInt start; int i; //dasopr_c("/Users/m5151134/kernels/generic_kernels/dsk/hay_a_amica_5_itokawashape_v1_0_64q.bds.txt", &handle); dlabfs_c(handle,&dladsc,&found); for ( i = 1; i <= nv; i++ ) { start = 3*(i-1); dskd02_c ( handle, &dladsc, SPICE_DSK_KWVERT, start, 3, &n, vd[i-1] ); } //printf("getData %lf",vd[0][0]); //dascls_c ( handle ); }
GetData::GetData(string dskfilepath, string currentPath){ SpiceInt handle; SpiceDLADescr dladsc; //int i,j,k,l,norme1,norme2,p,q; //int flag = 0; //int cont; FILE *f; printf("getdata\n"); string fname = "/Desktop/commonF_aft.dat"; fname = currentPath + fname; dasopr_c(dskfilepath.c_str(), &handle); dlabfs_c(handle,&dladsc,&found); //f = fopen("/Users/m5151134/Desktop/commonF_aft.dat", "w"); f = fopen(fname.c_str(), "w"); if(!found){ setmsg_c ( "No segments found in DSK file #." ); sigerr_c ( "SPICE(NODATA)" ); } //Get Number of Plate dski02_c ( handle, &dladsc, SPICE_DSK_KWNP, 0, 1, &n, &np ); pd = new int*[np]; pd[0] = new int[np * 3]; for (i = 1; i < np; i++) pd[i] = pd[0] + i * 3; //Get Number of Vertices dski02_c ( handle, &dladsc, SPICE_DSK_KWNV, 0, 1, &n, &nv ); vd = new double*[nv]; vd[0] = new double[nv*3]; for (i = 1; i < nv; i++) vd[i] = vd[0] + i * 3; readPlateData(handle,dladsc); readVerticesData(handle,dladsc); dascls_c ( handle ); /* for (i = 0 ; i < nv ; i++) { printf("%d %d %d %d %d\n",i,nv,pd[i][0],pd[i][1],pd[i][2]); } */ int fppp=0,fppm=0,fpmp=0,fmpp=0,fpmm=0,fmpm=0,fmmp=0,fmmm=0; for ( i = 0 ; i < np ; i++) { for ( int j = 0 ; j < 3 ; j++) { //printf("check:%d %d %d %d %d\n",i,j,nv,np,pd[i][j]); double x = vd[pd[i][j]-1][0]; double y = vd[pd[i][j]-1][1]; double z = vd[pd[i][j]-1][2]; //+x+y+z if (x >= 0 && y >= 0 && z>= 0 && fppp == 0) { ppp.push_back(i+1); fppp = 1; } //+x+y-z if (x >= 0 && y >= 0 && z <= 0 && fppm == 0) { ppm.push_back(i+1); fppm = 1; } //+x-y+z if (x >= 0 && y <= 0 && z >= 0 && fpmp == 0) { pmp.push_back(i+1); fpmp = 1; } //-x+y+z if (x <= 0 && y >= 0 && z >= 0 && fmpp == 0) { mpp.push_back(i+1); fmpp = 1; } //+x-y-z if (x >= 0 && y <= 0 && z <= 0 && fpmm == 0) { pmm.push_back(i+1); fpmm = 1; } //-x+y-z if (x <= 0 && y >= 0 && z <= 0 && fmpm == 0) { mpm.push_back(i+1); fmpm = 1; } //-x-y+z if (x <= 0 && y <= 0 && z >= 0 && fmmp == 0) { mmp.push_back(i+1); fmmp = 1; } //-x-y-z if (x <= 0 && y <= 0 && z <= 0 && fmmm == 0) { mmm.push_back(i+1); fmmm = 1; } } fppp=0; fppm=0; fpmp=0; fmpp=0; fpmm=0; fmpm=0; fmmp=0; fmmm=0; } commonF = new int*[np]; commonF[0] = new int[np * 3]; for (i = 1; i < np; i++) commonF[i] = commonF[0] + i * 3; /* for( i = 0 ; i < np ; i++){ printf("nv:%d np:%d pd0:%d p1:%d p2:%d\n",nv,np,pd[i][0],pd[i][1],pd[i][2]); } */ map<int,set<int> > dict; for(int i = 0; i < np; ++i){ for(int j = 0; j < 3; ++j){ dict[pd[i][j]].insert(i); } } int *conts = new int[np]; for(int i = 0; i < np; ++i){ conts[i] = 0; } for(int i = 0; i < np; ++i){ set<int> ids; for(int j = 0; j < 3; ++j){ for(set<int>::iterator it = dict[pd[i][j]].begin(); it != dict[pd[i][j]].end(); ++it){ ids.insert( *it ); } } int cnt = 0; int id_array[ids.size()]; for(set<int>::iterator it = ids.begin(); it != ids.end(); ++it){ id_array[cnt++] = *it; } for(int j = 0; j < ids.size(); ++j){ int fid = 0; fid = id_array[j]; for(int k = 0; k < ids.size(); ++k){ int sid = 0; sid = id_array[k]; if( fid != sid ){ for(int ii = 0; ii < 3; ++ii){ int norme1 = pd[fid][ii]; int norme2 = pd[fid][(ii+1)%3]; for(int jj = 0; jj < 3; ++jj){ int normf1 = pd[sid][jj]; int normf2 = pd[sid][(jj+1)%3]; if( (norme1 == normf1 && norme2 == normf2) || (norme1 == normf2 && norme2 == normf1) ){ if( conts[fid] >= 3 ) continue; bool ng = false; for(int kk = 0; kk < conts[fid]; ++kk){ if( commonF[fid][kk] == sid+1 ){ ng = true; } } if( !ng ){ commonF[fid][conts[fid]++] = sid+1; } } } } } } } } //printf("getdata: %d",commonF[0][0]); fclose(f); }
int main(int ac, char** av) { /* Constants */ #define PBUFSIZ 10000 #define FILSIZ 256 /* Local variables */ SpiceBoolean found; SpiceChar dsk [ FILSIZ ]; SpiceDLADescr dladsc; SpiceDouble normal [3]; SpiceDouble verts [3][3]; SpiceDouble BoundRadius; SpiceInt handle; SpiceInt i; SpiceInt j; SpiceInt n; SpiceInt np; SpiceInt nread; SpiceInt nv; SpiceInt nvtx; SpiceInt plates[PBUFSIZ][3]; SpiceInt plix; SpiceInt remain; SpiceInt start; int iAc; int doMdl = 1; /* Prompt for name of DSK and open file for reading. */ *dsk = '\0'; for (iAc=1; iAc<ac; ++iAc) { if ( strcmp(av[iAc], "--wrl") ) { strncpy(dsk,av[1],FILSIZ); continue; } else { doMdl = 0; } } if ( ! *dsk) { if ( doMdl ) { prompt_c ( "### Enter DSK (*.bds) filepath > ", FILSIZ, dsk ); } else { fprintf( stderr, "### Enter DSK (*.bds) filepath > " ); prompt_c ( "", FILSIZ, dsk ); } } dasopr_c ( dsk, &handle ); dlabfs_c ( handle, &dladsc, &found ); if ( !found ) { setmsg_c ( "No segment found in file #." ); errch_c ( "#", dsk ); sigerr_c ( "SPICE(NOSEGMENT)" ); } /* Get segment vertex and plate counts. */ dskz02_c ( handle, &dladsc, &nv, &np ); /*******************************************************************/ if ( doMdl ) { printf( "\ ### File: %s\n\ Component DSK\n\ PolygonMesh\n\ FaceColor %%255255255\n\ SmoothShading No\n\ BackfaceCullable Yes\n\ Translucency 0.5\n\ Specularity 0.59375000\n\ Shininess 76.000000\n\ \n\ NumVerts %d\n\ Data\n", dsk, nv ); } else {