private void btnTessellateConcave_Click(object sender, RoutedEventArgs e) { try { ClearAllVisuals(); // Create some random triangles Point[][] initialPolys = new Point[5][]; for (int cntr = 0; cntr < initialPolys.Length; cntr++) { Point[] triangle = Enumerable.Range(0, 3). Select(o => Math3D.GetRandomVector_Circular(20d)). Select(o => new Point(o.X, o.Y)). ToArray(); initialPolys[cntr] = triangle; } // Turn into polygons Polygon2D[] unionPolys = Math2D.GetUnion_Polygons(initialPolys); TriangleIndexed[][] triangulated = new TriangleIndexed[unionPolys.Length][]; for (int cntr = 0; cntr < unionPolys.Length; cntr++) { //http://wiki.unity3d.com/index.php?title=Triangulator Point3D[] poly3D = unionPolys[cntr].Polygon.Select(o => o.ToPoint3D()).ToArray(); triangulated[cntr] = Triangulator.Triangulate(unionPolys[cntr].Polygon). Select(o => new TriangleIndexed(o.Item1, o.Item2, o.Item3, poly3D)). ToArray(); } #region Draw Visual3D visual; // Orig polygons foreach (Polygon2D polygon in unionPolys) // ignoring holes { visual = GetVisual_PolygonLines(polygon.Polygon.Select(o => o.ToPoint3D()).ToArray(), Colors.Gray, 2); _debugVisuals.Add(visual); _viewport.Children.Add(visual); } // Individual triangles foreach (TriangleIndexed triangle in triangulated.SelectMany(o => o)) { visual = GetVisual_Triangle(new ITriangle[] { triangle }, UtilityWPF.GetRandomColor(128, 0, 255)); _debugVisuals.Add(visual); _viewport.Children.Add(visual); } #endregion } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }