private void BuildTerrain() { // Figure out where the extra ring of points should go double radius = BuildTerrainSprtRadius(_neurons.Select(o => o.Position.ToPoint2D()).ToArray()); // Figure out how many extra points to make int numExtra = BuildTerrainSprtNumExtra(_neurons.Length); // Lay down all the points into a single array _terrainPoints = UtilityCore.Iterate( _neurons.Select(o => o.Position), // first points are the neuron's locations (don't worry about Z right now, they will change each update) Math2D.GetCircle_Cached(numExtra).Select(o => new Point3D(o.X * radius, o.Y * radius, 0)) // tack on a bunch of points around the edge ).ToArray(); // Get the delaunay of these points TriangleIndexed[] triangles = Math2D.GetDelaunayTriangulation(_terrainPoints.Select(o => o.ToPoint2D()).ToArray(), _terrainPoints); // Convert into linked triangles List <TriangleIndexedLinked> trianglesLinked = triangles.Select(o => new TriangleIndexedLinked(o.Index0, o.Index1, o.Index2, o.AllPoints)).ToList(); TriangleIndexedLinked.LinkTriangles_Edges(trianglesLinked, true); _terrainTriangles = trianglesLinked.ToArray(); }