public NavigationGridlet Quad(float cx, float cy, float cz, float pitch, float yaw, float roll, int xLength, int yLength) { var cells = Util.Generate(xLength * yLength, i => new NavigationGridletCell(i, i % xLength, i / xLength)); for (var i = 0; i < cells.Length; i++) { var zzx = i % xLength - xLength / 2; var zzy = i / xLength - yLength / 2; cells[i].Height = 1; // cells[i].Height = (float)(Math.Sqrt(zzx * zzx + zzy * zzy) / 2); //(float)StaticRandom.NextDouble(2); } for (var y = 0; y < yLength; y++) { cells[y * xLength].Flags = CellFlags.Edge; cells[(y + 1) * xLength - 1].Flags = CellFlags.Edge; } for (var x = 1; x < xLength - 1; x++) { cells[x].Flags = CellFlags.Edge; cells[x + xLength * (yLength - 1)].Flags = CellFlags.Edge; } var gridlet = new NavigationGridlet { X = cx, Y = cy, Z = cz, XLength = xLength, YLength = yLength, Cells = cells, IsEnabled = true }; gridlet.Orientation = Matrix.RotationZ(yaw) * Matrix.RotationY(pitch) * Matrix.RotationZ(roll); foreach (var cell in cells) { cell.Gridlet = gridlet; } gridlet.Initialize(); for (var x = 20; x < 30; x++) { for (var y = 20; y < 30; y++) { cells[x + y * xLength].Flags |= CellFlags.Blocked; } } for (var x = 40; x < 50; x++) { for (var y = 20; y < 30; y++) { cells[x + y * xLength].Flags |= CellFlags.Blocked; } } return gridlet; }