in GraphLayout/MSAGL/GraphmapsWithMesh/Tiling.cs [1151:1314]
public void ComputeShortcutMesh(WeightedPoint[] pt, int numPoints)
{
//COMPUTE NEIGHBORHOOD SHORTCUTS
for (int i = numPoints; i >= 1; i--)
{
var x = pt[i].X;
var y = pt[i].Y;
//if v_i has a neighbor in the first (top right) quadrant
int neighb;
while (x + 1 < N && y + 1 < N && NodeMap[x + 1, y + 1] > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y + 1]].Id) break;
}
if (EList[NodeMap[x, y], neighb].Selected == 0) break;
x = x + 1;
y = y + 1;
}
while (x + 1 < N && y + 1 < N && NodeMap[x + 1, y + 1] > 0 && VList[NodeMap[x + 1, y + 1]].CId == 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y + 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x + 1;
y = y + 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.V.Add(VList[NodeMap[x, y]]);
}
if (x + 1 < N && y + 1 < N && NodeMap[x + 1, y + 1] > 0 && VList[NodeMap[x + 1, y + 1]].CId > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y + 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x + 1;
y = y + 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
x = pt[i].X;
y = pt[i].Y;
//if v_i has a neighbor in the top left quadrant
while (x - 1 > 0 && y + 1 < N && NodeMap[x - 1, y + 1] > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y + 1]].Id) break;
}
if (EList[NodeMap[x, y], neighb].Selected == 0) break;
x = x - 1;
y = y + 1;
}
while (x - 1 > 0 && y + 1 < N && NodeMap[x - 1, y + 1] > 0 && VList[NodeMap[x - 1, y + 1]].CId == 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y + 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x - 1;
y = y + 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
if (x - 1 > 0 && y + 1 < N && NodeMap[x - 1, y + 1] > 0 && VList[NodeMap[x - 1, y + 1]].CId > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y + 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x - 1;
y = y + 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
x = pt[i].X;
y = pt[i].Y;
//if v_i has a neighbor in the bottom right quadrant
while (x + 1 < N && y - 1 > 0 && NodeMap[x + 1, y - 1] > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y - 1]].Id) break;
}
if (EList[NodeMap[x, y], neighb].Selected == 0) break;
x = x + 1;
y = y - 1;
}
while (x + 1 < N && y - 1 > 0 && NodeMap[x + 1, y - 1] > 0 && VList[NodeMap[x + 1, y - 1]].CId == 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y - 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x + 1;
y = y - 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
if (x + 1 < N && y - 1 > 0 && NodeMap[x + 1, y - 1] > 0 && VList[NodeMap[x + 1, y - 1]].CId > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x + 1, y - 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x + 1;
y = y - 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
x = pt[i].X;
y = pt[i].Y;
//if v_i has a neighbor in the bottom-left quadrant
while (x - 1 > 0 && y - 1 > 0 && NodeMap[x - 1, y - 1] > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y - 1]].Id) break;
}
if (EList[NodeMap[x, y], neighb].Selected == 0) break;
x = x - 1;
y = y - 1;
}
while (x - 1 > 0 && y - 1 > 0 && NodeMap[x - 1, y - 1] > 0 && VList[NodeMap[x - 1, y - 1]].CId == 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y - 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x - 1;
y = y - 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
if (x - 1 > 0 && y - 1 > 0 && NodeMap[x - 1, y - 1] > 0 && VList[NodeMap[x - 1, y - 1]].CId > 0)
{
for (neighb = 1; neighb <= DegList[NodeMap[x, y]]; neighb++)
{
if (EList[NodeMap[x, y], neighb].NodeId == VList[NodeMap[x - 1, y - 1]].Id) break;
}
SelectEdge(EList, DegList, VList[NodeMap[x, y]], VList[EList[NodeMap[x, y], neighb].NodeId], 6);
x = x - 1;
y = y - 1;
VList[NodeMap[x, y]].CId = 1;
_sNet.AddVertex(VList[NodeMap[x, y]]);
}
}
}