Пример #1
0
        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());
        }
Пример #2
0
        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);
        }