public static Triangle[] Triangulate(this TerrainFile @this) { var heightMap = @this.GenerateRealMap(); var weight = heightMap.GetLength(0); var height = heightMap.GetLength(1); bool TryGetValue(int x, int y, out Vector3 value) { try { value = heightMap[x, y]; return(true); } catch { value = Vector3.Zero; return(false); } } var triangles = new List <Triangle>(); for (var y = 0; y < height; y += 1) { for (var x = 0; x < weight; x += 1) { { if (!TryGetValue(x, y, out var source)) { continue; } if (!TryGetValue(x + 1, y, out var next)) { continue; } if (!TryGetValue(x, y + 1, out var top)) { continue; } var triangle = new Triangle { Position1 = top, Position2 = next, Position3 = source }; triangles.Add(triangle); } { if (!TryGetValue(x, y + 1, out var source)) { continue; } if (!TryGetValue(x + 1, y + 1, out var next)) { continue; } if (!TryGetValue(x + 1, y, out var top)) { continue; } var triangle = new Triangle { Position1 = source, Position2 = next, Position3 = top }; triangles.Add(triangle); } } } return(triangles.ToArray()); }