private static Cube[] GetCubeFromVector(int n, Vector3D vector) { var cubes = new List <Cube>(); var o = new Vector3D(0, 0, 0); var vs = VectorVariantFinder.FindAllVariantsAtRightAnglesTo(vector); var bs = vs.Where(v => Math.Abs(v.LengthSquared - vector.LengthSquared) < 1e-9 && Math.Abs(Math.Abs(Vector3D.AngleBetween(v, vector)) - 90) < 1e-9); foreach (var b in bs) { var c = Vector3D.CrossProduct(vector, b); c *= (vector.Length / c.Length); Cube cube; if (Cube.TryMakeCubeFrom(o, vector, b, c, out cube) && !cubes.Contains(cube)) { cubes.Add(cube); } } if (!cubes.Any()) { throw new InvalidOperationException($"No cubes found for vector {vector}"); } cubes.RemoveAll(cube => !cube.Dimensions.All(d => d <= n)); return(cubes.Distinct().ToArray()); }
public Cube GetCube(int n) { var possibleBasicCubes = GetCubeFromVector(n, Vector).ToArray(); var basicCube = possibleBasicCubes.FirstOrDefault(); //might not be any if too big if (basicCube != null) { var vs = VectorVariantFinder.FindAllCombinationsOf(Vector); var extraCubes = vs.SelectMany(v => GetCubeFromVector(n, v)).Distinct().Where(c => !c.Equals(basicCube)).ToArray(); if (possibleBasicCubes.Length > 1) { var otherExtras = possibleBasicCubes.Skip(1).Where(c => !extraCubes.Contains(c)).ToArray(); if (otherExtras.Any()) { LogManager.GetCurrentClassLogger().Warn($"Variants of {basicCube}: {string.Join(" \n", otherExtras.Select(c => c.ToString()))}"); } } basicCube.Variants = extraCubes; } return(basicCube); }