int main() { int N, M, L, W, O; while (scanf("%d %d %d %d", &N, &M, &L, &W) == 4) { scanf("%d", &O); memset(g, '0', sizeof(g)); for (int i = 0; i < O; i++) { int x, y; scanf("%d %d", &x, &y); g[y][x] = '2'; } int lx = 0, ly = 0, cmd; while (scanf("%d", &cmd) == 1) { int tx, ty, rx, ry; rx = lx+W-1, ry = ly+L-1; if (cmd == 0) { for (int i = 0; i < N; i++) { static char out[512]; out[M] = '\0'; for (int j = 0; j < M; j++) { if (ly <= i && i <= ry && lx <= j && j <= rx) out[j] = '1'; else out[j] = g[i][j]; } puts(out); } continue; } tx = lx+dx[cmd], ty = ly+dy[cmd]; if (tx < 0 || ty < 0 || tx+W > M || ty+L > N) continue; int ob = 0; if (cmd == 1) ob = vfind(rx+1, ly, ry); else if (cmd == 2) ob = hfind(ry+1, lx, rx); else if (cmd == 3) ob = vfind(lx-1, ly, ry); else if (cmd == 4) ob = hfind(ly-1, lx, rx); else if (cmd == 5) { ob = vfind(rx+1, ly+1, ry+1); if (ob <= 1) ob += hfind(ry+1, lx+1, rx); } if (ob > 1) continue; if (ob == 1) g[fy][fx] = '0'; lx = tx, ly = ty; } } return 0; }
/* Routine to process a transitive verb */ trverb() { switch(verb){ case CALM: case WALK: case QUIT: case SCORE: case FOO: case BRIEF: case SUSPEND: case HOURS: case LOG: actspk(verb); break; case TAKE: vtake(); break; case DROP: vdrop(); break; case OPEN: case LOCK: vopen(); break; case SAY: vsay(); break; case NOTHING: rspeak(54); break; case ON: von(); break; case OFF: voff(); break; case WAVE: vwave(); break; case KILL: vkill(); break; case POUR: vpour(); break; case EAT: veat(); break; case DRINK: vdrink(); break; case RUB: if (object != LAMP) rspeak(76); else actspk(RUB); break; case THROW: vthrow(); break; case FEED: vfeed(); break; case FIND: case INVENTORY: vfind(); break; case FILL: vfill(); break; case READ: vread(); break; case BLAST: vblast(); break; case BREAK: vbreak(); break; case WAKE: vwake(); break; default: printf("This verb is not implemented yet.\n"); } }
int mesh_out( const char*name) { FILE*f=fopen( name , "wb"); if(!f) return printf("File could not open: %s\n",name), -1; { //quick, non-optimal export int count = v_tri.size() / 3; std::vector<vertex_t>vertices; std::vector<u16>indices; for ( int i=0; i<count; ++i){ int j=i*3; int vix = v_tri[j]; int nix = v_tri[j+1]; int tix = v_tri[j+2]; vertex_t v={ v_pos[vix*3], v_pos[vix*3+1], v_pos[vix*3+2], v_uv[tix*2], 1.f-v_uv[tix*2+1], v_normal[nix*3], v_normal[nix*3+1], v_normal[nix*3+2], (float)v_jw[vix].joint_a, (float)v_jw[vix].joint_b, v_jw[vix].weight_a, v_jw[vix].weight_b }; int index = vfind( &vertices[0], v, vertices.size() ); if( index == (int)vertices.size() ) vertices.push_back(v); indices.push_back( index ); } //write int num_indices = indices.size(); int num_vertices = vertices.size(); int num_bone = v_keyframes.size(); int num_frame = v_keyframes[0].size()/ 16; u8 num_child[16]={}; u8 level[16]={}; char stack_instr[16]={}; std::vector<mat4_t>invm; int child_count = 0; assert( num_bone <= 16 && " TOO MANY BONES "[0] ); assert( !v_keyframes.empty() && "KEYFRAMES EMPTY"[0]); //for( size_t i= 0 ; i < joint_hier.size(); ++i) joint_ride(invm,num_child, joint_hier[0], level, child_count); for(int i = 0; i<num_bone-1; ++i) stack_instr[i]=(int)level[i+1]-(int)level[i]; //WRITE header fwrite( &num_indices, sizeof( int ), 1, f ); fwrite( &num_vertices, sizeof( int ), 1, f ); fwrite( &num_bone, sizeof( int ) , 1, f); fwrite( &num_frame, sizeof( int ) , 1, f); //fwrite( num_child, sizeof(u8), 16, f);// hierarchy fwrite( stack_instr, sizeof(char), 16, f);// stack_instr //WRITE indices fwrite( &indices[0], sizeof( u16 ), num_indices, f ); //WRITE vertices fwrite( &vertices[0], sizeof( vertex_t ), num_vertices, f ); //transpose all matrices mtranspose( &bind_shape_matrix[0] ); for( int i=0; i<num_bone; ++i ){ float res[16]; mtranspose( res,invm[i].data ); //PRE-MULTIPLY WITH BSM mmul(invm[i].data, res, &bind_shape_matrix[0]); for( int k=0;k<num_frame; ++k){ mtranspose(&v_keyframes[i][k*16] ); } } //fwrite( bind_shape_matrix.data(), sizeof(float),16,f); //WRITE inverse matrices fwrite( invm[0].data, sizeof(float),16*num_bone,f); //KEYFRAMES //create joints ( pos , dir/quat ) from matrices //WRITE keyframes (and reorder frame wise, not bone wise) //AND convert to joint quat jq_t jq={}; std::vector<jq_t>jointquats; jointquats.reserve(num_frame*num_bone); for( int k=0;k<num_frame; ++k) for( int i=0;i<num_bone; ++i){ quat_from_mat4(jq.quat,&v_keyframes[i][k*16]); jq.pos[0]=v_keyframes[i][k*16+12]; jq.pos[1]=v_keyframes[i][k*16+13]; jq.pos[2]=v_keyframes[i][k*16+14]; jq.child[0]=jq.child[1]=jq.child[2]=jq.child[3]=0; jointquats.push_back(jq); //fwrite( &v_keyframes[i][k*16], sizeof(float),16,f); } fwrite(jointquats.data(), sizeof(jq_t),num_frame*num_bone,f); //done fclose(f); //print stuff... for( int i=0;i<16; ++i) printf( "m = %.4f\tinv = %.4f\n",v_keyframes[0][i], invm[0].data[i]); printf("\nOUTPUT\n"); printf( "INDICES: %d\n", num_indices); printf( "VERTICES: %d\n", num_vertices); printf("BONES = %d\n", num_bone); printf("FRAMES = %d\n", num_frame); printf("STACK = \n\t"); for( int i=0;i<num_bone; ++i) printf("%d, ",stack_instr[i]); printf("\nHIERARCHY = \n\t"); for( int i=0;i<num_bone; ++i) printf("%d, ",num_child[i]); printf("\n"); } return 0; }
void findChain(asmMerge & merge, asmMerge & merge1,fastaSeq & pbOnly, fastaSeq & merged,double propCutoff) { vector<string> temp_rname; vector<string> temp_qname; temp_rname = merge1.r_name; temp_qname = merge1.q_name; vector<string> seqs; vector<string> refSeqToAdd; vector<string> refSeqToRemove; string tempname,lRseq,lQseq,rRseq,rQseq,tlRseq,trRseq,tlQseq,trQseq; string ref,refForSideL,refForSideR,prevElem,guruR; //guruR stores the name of the anchor contig for(map<string,vector<string> >::iterator it= merge.cAnchor.begin();it!=merge.cAnchor.end();it++) { lRseq = ""; //left reference lQseq = ""; //left query rRseq = ""; //right reference rQseq = ""; //right query tlRseq = ""; trRseq = ""; tlQseq = ""; trQseq = ""; refForSideL = ""; refForSideR = ""; prevElem = ""; tempname = it->first; // tempname is the reference name ref = tempname; guruR = tempname; seqs = vfind(tempname,temp_rname,temp_qname,merge,guruR,propCutoff); fillToRemove(merge,seqs); lQseq = longestLeft(tempname,seqs,merge,'Q','N',prevElem); rQseq = longestRt(tempname,seqs,merge,'Q','N',prevElem); if((lQseq == "") && (rQseq == "")) //for those which are innie { refSeqToAdd.push_back(tempname); } if(merge.cAnchor[tempname].size() == 0) //anchors which are partners of previously used query chain elements { lQseq = ""; rQseq = ""; } while((rQseq != "")|(rRseq != "")|(lQseq != "")|(lRseq != "")) { if(lQseq != "") { merge.lseq[tempname].push_back(lQseq); seqs = vfind(lQseq,temp_qname,temp_rname,merge,guruR,propCutoff); // temp_qname is where lQseq should be present. temp_rname is where the references will be searched from if(!seqs.empty()) //check that empty returns null when vfind does not resturn an argument { if(ref != "") //if tempname is currently the reference { prevElem = ref+lQseq; tlRseq = longestLeft(lQseq,seqs,merge,'R',merge.sideInfoQ[tempname+lQseq],prevElem); prevElem = ""; } if(ref == "") //if lRseq was the previous reference { prevElem = refForSideL+lQseq; tlRseq = longestLeft(lQseq,seqs,merge,'R',merge.sideInfoQ[refForSideL+lQseq],prevElem); //tlRseq inside the parentheses are from previous alignment prevElem = ""; } lRseq = tlRseq; refSeqToRemove.push_back(lRseq); } tlQseq = lQseq; //store the info to get info about the alignment NEW lQseq = ""; //reset lQseq } if(lRseq != "") { merge.lseq[tempname].push_back(lRseq); seqs = vfind(lRseq,temp_rname,temp_qname,merge,guruR,propCutoff); fillToRemove(merge,seqs); if(!seqs.empty()) { if(merge.sideInfo[lRseq+tlQseq] == 'L') //if the previous alignment was on the left side of the reference { lQseq = longestRt(lRseq,seqs,merge,'Q','N',prevElem); //'N' because this one does not require to check for query side } if(merge.sideInfo[lRseq+tlQseq] == 'R') { lQseq = longestLeft(lRseq,seqs,merge,'Q','N',prevElem); //'N' because this one does not require to check for query side } } refForSideL = lRseq; lRseq = ""; tlQseq = "";//reset tlQseq } if(rQseq != "") { merge.rseq[tempname].push_back(rQseq); seqs = vfind(rQseq,temp_qname,temp_rname,merge,guruR,propCutoff); if(!seqs.empty()) { if(ref != "") //because rRseq is empty when tempname was the previous reference { prevElem = ref + rQseq; trRseq = longestRt(rQseq,seqs,merge,'R',merge.sideInfoQ[tempname+rQseq],prevElem); prevElem = ""; } if(ref == "") { prevElem = refForSideR + rQseq; trRseq = longestRt(rQseq,seqs,merge,'R',merge.sideInfoQ[refForSideR+rQseq],prevElem); prevElem = ""; } rRseq = trRseq; refSeqToRemove.push_back(rRseq); } ref = ""; trQseq = rQseq; rQseq = ""; } if(rRseq != "") { merge.rseq[tempname].push_back(rRseq); seqs = vfind(rRseq,temp_rname,temp_qname,merge,guruR,propCutoff); fillToRemove(merge,seqs); if(!seqs.empty()) { if(merge.sideInfo[rRseq+trQseq] == 'R') //if previous alignment was on the right side of the reference { rQseq = longestLeft(rRseq,seqs,merge,'Q','N',prevElem); // again N because no need to check for query side } if(merge.sideInfo[rRseq+trQseq] == 'L') //if previous alignment was on the right side of the reference { rQseq = longestRt(rRseq,seqs,merge,'Q','N',prevElem); // again N because no need to check for query side NEW } } refForSideR = rRseq; rRseq = ""; trQseq = ""; //reset trQseq } } } for(unsigned int i =0 ;i<refSeqToAdd.size();i++) { if(find(refSeqToRemove.begin(),refSeqToRemove.end(),refSeqToAdd[i]) == refSeqToRemove.end()) { merged.seq[refSeqToAdd[i]] = pbOnly.seq[refSeqToAdd[i]]; } } }