Example #1
0
void ModButterfly::rotateUntilBorder(RgbVertexC& v, Pos& pos)
{
	assert(v.vp() == pos.v);
	do 
	{
		pos.FlipE();
		pos.FlipF();
	} while (!pos.IsBorder());
	assert(v.vp() == pos.v);
}
Example #2
0
ModButterfly::RgbVertexC ModButterfly::move(RgbVertexC& v, Pos& pos, int level)
{
	assert(v.vp() == pos.v);
	assert(level >= v.getLevel());
	int vl = level;
	RgbVertexC lastv;
	do 
	{
		pos.FlipV();
		lastv = RgbVertexC(*v.m,*v.rgbInfo,pos.v);
		if (lastv.getLevel() <= vl)
			break; // no need to continue, in fact a rotation of exactly 6 can be impossible in some cases
		rotate(lastv,pos,6);
		pos.FlipF();
		
		assert(lastv.getLevel() > vl);
	} while (lastv.getLevel() > vl);
	
	return RgbVertexC(*v.m,*v.rgbInfo,pos.v);
}
Example #3
0
void ModButterfly::rotate(RgbVertexC& v, Pos& pos,int angle)
{
	//std::cerr << v.index << " requested: " << angle << " ----- ";
	assert(v.vp() == pos.v);
	while (angle > 0)
	{
		RgbTriangleC t = RgbTriangleC(v.m,v.rgbInfo,pos.F()->Index());
		int realz = -1;
		for (int i = 0; i<3; i++)
			if (t.V(i).vp() == pos.v)
					realz = i;
		assert(realz != -1);
		
		angle -= t.getAngle(realz);
		//std::cerr << "| " << t.getAngle(realz);
		pos.FlipE();
		pos.FlipF();
	}
	//std::cerr << " ----- result : " << angle << std::endl;
	//assert(angle == 0);
}