private static bool CanRemoveVertex(List<Polygon> polys, int remove)
{
//count number of polygons to remove
int numRemovedVerts = 0;
int numTouchedVerts = 0;
int numRemainingEdges = 0;
for (int i = 0; i < polys.Count; i++)
{
Polygon p = polys[i];
int nv = p.VertexCount;
int numRemoved = 0;
int numVerts = 0;
for (int j = 0; j < nv; j++)
{
if (p.Vertices[j] == remove)
{
numTouchedVerts++;
numRemoved++;
}
numVerts++;
}
if (numRemoved > 0)
{
numRemovedVerts += numRemoved;
numRemainingEdges += numVerts - (numRemoved + 1);
}
}
//don't remove a vertex from a triangle since you need at least three vertices to make a polygon
if (numRemainingEdges <= 2)
return false;
//find edges which share removed vertex
int maxEdges = numTouchedVerts * 2;
int nedges = 0;
int[] edges = new int[maxEdges * 3];
for (int i = 0; i < polys.Count; i++)
{
Polygon p = polys[i];
int nv = p.VertexCount;
//collect edges which touch removed vertex
for (int j = 0, k = nv - 1; j < nv; k = j++)
{
if (p.Vertices[j] == remove || p.Vertices[k] == remove)
{
//arrange edge so that a has the removed value
int a = p.Vertices[j], b = p.Vertices[k];
if (b == remove)
{
int temp = a;
a = b;
b = temp;
}
//check if edge exists
bool exists = false;
for (int m = 0; m < nedges; m++)
{
int e = m * 3;
if (edges[e + 1] == b)
{
//increment vertex share count
edges[e + 2]++;
exists = true;
}
}
//add new edge
if (!exists)
{
int e = nedges * 3;
edges[e + 0] = a;
edges[e + 1] = b;
edges[e + 2] = 1;
nedges++;
}
}
}
}
//make sure there can't be more than two open edges
//since there could be two non-adjacent polygons which share the same vertex, which shouldn't be removed
int numOpenEdges = 0;
for (int i = 0; i < nedges; i++)
{
if (edges[i * 3 + 2] < 2)
numOpenEdges++;
}
if (numOpenEdges > 2)
return false;
return true;
}