internal void UndoVertex()
{
Otri fliptri;
Otri botleft = default(Otri), botright = default(Otri), topright = default(Otri);
Otri botlcasing = default(Otri), botrcasing = default(Otri), toprcasing = default(Otri);
Otri gluetri = default(Otri);
Osub botlsubseg = default(Osub), botrsubseg = default(Osub), toprsubseg = default(Osub);
Vertex botvertex, rightvertex;
// Walk through the list of transformations (flips and a vertex insertion)
// in the reverse of the order in which they were done, and undo them.
while (flipstack.Count > 0)
{
// Find a triangle involved in the last unreversed transformation.
fliptri = flipstack.Pop();
// We are reversing one of three transformations: a trisection of one
// triangle into three (by inserting a vertex in the triangle), a
// bisection of two triangles into four (by inserting a vertex in an
// edge), or an edge flip.
if (flipstack.Count == 0)
{
// Restore a triangle that was split into three triangles,
// so it is again one triangle.
fliptri.Dprev(ref botleft);
botleft.LnextSelf();
fliptri.Onext(ref botright);
botright.LprevSelf();
botleft.Sym(ref botlcasing);
botright.Sym(ref botrcasing);
botvertex = botleft.Dest();
fliptri.SetApex(botvertex);
fliptri.LnextSelf();
fliptri.Bond(ref botlcasing);
botleft.SegPivot(ref botlsubseg);
fliptri.SegBond(ref botlsubseg);
fliptri.LnextSelf();
fliptri.Bond(ref botrcasing);
botright.SegPivot(ref botrsubseg);
fliptri.SegBond(ref botrsubseg);
// Delete the two spliced-out triangles.
TriangleDealloc(botleft.triangle);
TriangleDealloc(botright.triangle);
}
else if (flipstack.Peek().triangle == null) // Dummy flip
{
// Restore two triangles that were split into four triangles,
// so they are again two triangles.
fliptri.Lprev(ref gluetri);
gluetri.Sym(ref botright);
botright.LnextSelf();
botright.Sym(ref botrcasing);
rightvertex = botright.Dest();
fliptri.SetOrg(rightvertex);
gluetri.Bond(ref botrcasing);
botright.SegPivot(ref botrsubseg);
gluetri.SegBond(ref botrsubseg);
// Delete the spliced-out triangle.
TriangleDealloc(botright.triangle);
fliptri.Sym(ref gluetri);
if (gluetri.triangle != Mesh.dummytri)
{
gluetri.LnextSelf();
gluetri.Dnext(ref topright);
topright.Sym(ref toprcasing);
gluetri.SetOrg(rightvertex);
gluetri.Bond(ref toprcasing);
topright.SegPivot(ref toprsubseg);
gluetri.SegBond(ref toprsubseg);
// Delete the spliced-out triangle.
TriangleDealloc(topright.triangle);
}
flipstack.Clear();
}
else
{
// Undo an edge flip.
Unflip(ref fliptri);
}
}
}