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::Point ModButterfly::computeExtraordinary(RgbVertexC& v, Pos& pos)
{
	int rank;
	if (v.getLevel() == 0) 
		rank = baseArity(v);
	else
		rank = 4;
	
	vector<Point> points;
	vector<double> coeff;
	computeExtraordinaryPattern(coeff,rank);
	points.reserve(rank+1);
	points.push_back(v.getCoord());
	
	if (!v.getIsBorder())
	{
		int angle = rank * 2;
		do
		{
			pos.FlipV();
			points.push_back(pos.v->P());
			assert(pos.v != v.vp());
			pos.FlipV();
			rotate(v,pos,2);
			angle -= 2;
			assert (angle >= 0);
		} 
		while (angle != 0);
	}
	else
	{
		Pos pos2 = pos;
		// Border
		int angle = (rank-1) * 2;
		do
		{
			pos.FlipV();
			points.push_back(pos.v->P());
			assert(pos.v != v.vp());
			pos.FlipV();
			assert(pos.v == v.vp());
			rotate(v,pos,2);
			angle -= 2;
			assert (angle >= 0);
		} 
		while ((!pos.IsBorder()) && (angle != 0));
		
		pos.FlipV();
		points.push_back(pos.v->P());
		assert(pos.v != v.vp());
		pos.FlipV();
		
		assert(angle >= 0);
		vector<Point> pointsreverse;

		pos2.FlipF();
		rotate(v,pos2,2);
		angle -= 2;
		if ((!pos2.IsBorder()) && (angle != 0))
		{
			do
			{
				pos2.FlipV();
				pointsreverse.push_back(pos2.v->P());
				assert(pos2.v != v.vp());
				pos2.FlipV();
				assert(pos2.v == v.vp());
				rotate(v,pos2,2);
				angle -= 2;
				assert (angle >= 0);
			} 
			while ((!pos2.IsBorder()) && (angle != 0));
		}
		assert(angle == 0);

		pos.FlipV();
		points.push_back(pos.v->P());
		assert(pos.v != v.vp());
		pos.FlipV();
		
		for(int i=pointsreverse.size()-1;i>= 0; i--)
			points.push_back(pointsreverse[i]);
		
	}

	assert(points.size() == (unsigned int)(rank + 1));
	assert(points.size() == coeff.size());
	
	Point acc = Point(0.0,0.0,0.0);
	
	for (int i=0; i<rank+1; i++)
	{
		Point tmp = points[i] * coeff[i];
		acc += tmp;
	}
	
	return acc;
}