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); }
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); }
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); }