예제 #1
0
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;
}
예제 #2
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");
	}
}
예제 #3
0
파일: puke.cpp 프로젝트: qristofer/ggj
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;
}
예제 #4
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]];
		}
	}
}