private bool TriangleContainsVertexInList(int indexPrev, int indexCurr, int indexNext, NativeLinkedList <int> list) { for (NativeLinkedList <int> .Enumerator currIndexNode = list.Head; currIndexNode.IsValid; currIndexNode.MoveNext()) { NativeLinkedList <int> .Enumerator prevIndexNode = (currIndexNode.Prev.IsValid) ? currIndexNode.Prev : list.Tail; NativeLinkedList <int> .Enumerator nextIndexNode = (currIndexNode.Next.IsValid) ? currIndexNode.Next : list.Head; bool isCurrentConvex = Math2DUtils.IsVertexConvex(Polygon[prevIndexNode.Value], Polygon[currIndexNode.Value], Polygon[nextIndexNode.Value], true); if (isCurrentConvex) { continue; } int currIndexToCheck = currIndexNode.Value; if (currIndexToCheck == indexPrev || currIndexToCheck == indexCurr || currIndexToCheck == indexNext) { continue; } if (Math2DUtils.IsInsideTriangle(Polygon[currIndexToCheck], Polygon[indexPrev], Polygon[indexCurr], Polygon[indexNext])) { return(true); } } return(false); }
private void Triangulate(int polygonIndex, NativeLinkedList <int> list) { int trisIndex = 0; for (int pi = 0; pi < polygonIndex; ++pi) { trisIndex += Polygons.GetPolygonHolesNum(pi) * 2 + Polygons.GetPolygonNumVertices(pi) - 2; } trisIndex *= 3; while (list.Length > 2) { bool hasRemovedEar = false; int currListIndex = 0; NativeLinkedList <int> .Enumerator currIndexNode = list.Head; for (int i = 0; i < list.Length; ++i) { NativeLinkedList <int> .Enumerator prevIndexNode = (currIndexNode.Prev.IsValid) ? currIndexNode.Prev : list.Tail; NativeLinkedList <int> .Enumerator nextIndexNode = (currIndexNode.Next.IsValid) ? currIndexNode.Next : list.Head; bool isCurrentConvex = Math2DUtils.IsVertexConvex(Polygons[prevIndexNode.Value], Polygons[currIndexNode.Value], Polygons[nextIndexNode.Value], true); if (isCurrentConvex) { bool triangleContainsAVertex = TriangleContainsVertexInList(prevIndexNode.Value, currIndexNode.Value, nextIndexNode.Value, list); if (!triangleContainsAVertex) { OutTriangles[trisIndex] = nextIndexNode.Value; OutTriangles[trisIndex + 1] = currIndexNode.Value; OutTriangles[trisIndex + 2] = prevIndexNode.Value; trisIndex += 3; list.Remove(currIndexNode); hasRemovedEar = true; break; } } currListIndex = (currListIndex + 1) % list.Length; currIndexNode = list.GetEnumeratorAtIndex(currListIndex); } if (!hasRemovedEar) { return; } } }