public static bool IsGrounded(this Matrix m) { var clusters = new CoordClusters(); for (int y = 0; y < m.R; y++) { for (int x = 0; x < m.R; x++) { for (int z = 0; z < m.R; z++) { if (m[x, y, z] == Voxel.Void) { continue; } clusters.Add(Coord.Of(x, y, z)); if (x > 0 && m[x - 1, y, z] == Voxel.Full) { clusters.Unite(Coord.Of(x, y, z), Coord.Of(x - 1, y, z)); } if (y > 0 && m[x, y - 1, z] == Voxel.Full) { clusters.Unite(Coord.Of(x, y, z), Coord.Of(x, y - 1, z)); } if (z > 0 && m[x, y, z - 1] == Voxel.Full) { clusters.Unite(Coord.Of(x, y, z), Coord.Of(x, y, z - 1)); } } } } return(clusters.Count == 1); }
private void Inspect() { mHarmonics = new List <Harmonics>() { Low }; var clusters = new CoordClusters(); for (int y = MinY; y <= MaxY; y++) { for (int x = MinX; x <= MaxX; x++) { for (int z = MinZ; z <= MaxZ; z++) { if (S.Matrix[x, y, z] == Voxel.Void) { continue; } Coord c = Coord.Of(x, y, z); clusters.Add(c); if (x > MinX && S.Matrix[x - 1, y, z] == Voxel.Full) { clusters.Unite(c, Coord.Of(x - 1, y, z)); } if (y > MinY && S.Matrix[x, y - 1, z] == Voxel.Full) { clusters.Unite(c, Coord.Of(x, y - 1, z)); } if (z > MinZ && S.Matrix[x, y, z - 1] == Voxel.Full) { clusters.Unite(c, Coord.Of(x, y, z - 1)); } } } mHarmonics.Add(clusters.Count == 1 ? Low : High); } }