private void ExtractOutlineFromEdges()
{
// Clear old borders and outline
Array.Clear(bordersH, 0, width * height);
Array.Clear(bordersV, 0, width * height);
WorkingShape.Outlines.Clear();
foreach (var edge in allEdges)
{
IntVector2 edgeCoordsA = new IntVector2(edge.AX / 2, edge.AY / 2);
IntVector2 edgeCoordsB = new IntVector2(edge.BX / 2, edge.BY / 2);
if (edge.AX % 2 == 0)
{
if (bordersV[edgeCoordsA.X, edgeCoordsA.Y] == null)
bordersV[edgeCoordsA.X, edgeCoordsA.Y] = new Border(edge);
else
bordersV[edgeCoordsA.X, edgeCoordsA.Y].E1 = edge;
edge.B0 = bordersV[edgeCoordsA.X, edgeCoordsA.Y];
}
else
{
if (bordersH[edgeCoordsA.X, edgeCoordsA.Y] == null)
bordersH[edgeCoordsA.X, edgeCoordsA.Y] = new Border(edge);
else
bordersH[edgeCoordsA.X, edgeCoordsA.Y].E1 = edge;
edge.B0 = bordersH[edgeCoordsA.X, edgeCoordsA.Y];
}
if (edge.BX % 2 == 0)
{
if (bordersV[edgeCoordsB.X, edgeCoordsB.Y] == null)
bordersV[edgeCoordsB.X, edgeCoordsB.Y] = new Border(edge);
else
bordersV[edgeCoordsB.X, edgeCoordsB.Y].E1 = edge;
edge.B1 = bordersV[edgeCoordsB.X, edgeCoordsB.Y];
}
else
{
if (bordersH[edgeCoordsB.X, edgeCoordsB.Y] == null)
bordersH[edgeCoordsB.X, edgeCoordsB.Y] = new Border(edge);
else
bordersH[edgeCoordsB.X, edgeCoordsB.Y].E1 = edge;
edge.B1 = bordersH[edgeCoordsB.X, edgeCoordsB.Y];
}
}
foreach (Border b in bordersH)
{
if (b == null)
continue;
if (b.E0 != null)
{
ExtractOutline(b.E0);
}
if (b.E1 != null)
{
ExtractOutline(b.E1);
}
}
foreach (Border b in bordersV)
{
ExtractOutline(b?.E0);
ExtractOutline(b?.E1);
}
}