I don’t understand the condition i3 < i1 in the following code segment.
If I draw a simple triangle like the following
i3
/ \
/ \
i1-----i2
where i1, i2 and i3 are indices into the vertex table e.g. i1 = 0, i2 = 1, i3 = 2.
If I try the code on that triangle I end up with two egdes e1 for i1<i2 and e2 for i2<i3 but shouldn’t there be three edges so the e3 for i3 to i1.
This is the code from Eric Lengyels website and book so it should be correct - but could please someone explain to me why there is this condition and I get 2 edges for this triangle instead of what I think would be more correct 3 edges.
Thanks
long BuildEdges(long triangleCount,
const Triangle *triangleArray, Edge **edgeArray)
{
// Allocate enough space to hold all edges
*edgeArray = new Edge[triangleCount * 3];
long edgeCount = 0;
Edge *edge = *edgeArray;
// First pass: find edges
const Triangle *triangle = triangleArray;
for (long a = 0; a < triangleCount; a++)
{
long i1 = triangle->index[0];
long i2 = triangle->index[1];
long i3 = triangle->index[2];
if (i1 < i2)
{
edge->vertexIndex[0] = i1;
edge->vertexIndex[1] = i2;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
if (i2 < i3)
{
edge->vertexIndex[0] = i2;
edge->vertexIndex[1] = i3;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
if (i3 < i1)
{
edge->vertexIndex[0] = i3;
edge->vertexIndex[1] = i1;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
triangle++;
}
// Second pass: match triangles to edges
triangle = triangleArray;
for (long a = 0; a < triangleCount; a++)
{
long i1 = triangle->index[0];
long i2 = triangle->index[1];
long i3 = triangle->index[2];
if (i1 > i2)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i2) &&
(edge->vertexIndex[1] == i1) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
if (i2 > i3)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i3) &&
(edge->vertexIndex[1] == i2) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
if (i3 > i1)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i1) &&
(edge->vertexIndex[1] == i3) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
triangle++;
}
return (edgeCount);
}