Beispiel #1
0
        public void Operator_isInside_ReturnsFalse()
        {
            var cube  = new Cubes.Cube(new Point(0, 0, 0), 1);
            var point = new Point(2, 2, 2);

            var result = Operators.IsInside(cube, point);

            Assert.IsFalse(result);
        }
Beispiel #2
0
        public void Operator_cubeIntersec_ReturnsBoxWithVolume()
        {
            var cubes = new Cubes.Cube[2]
            {
                new Cubes.Cube(new Point(1, 1, 1), 4),
                new Cubes.Cube(new Point(-1, -1, -1), 3)
            };

            var result = Operators.CubeIntersec(cubes[0], cubes[1]);

            Assert.GreaterOrEqual(result.Volume(), 0);
        }
Beispiel #3
0
        public void Operator_cubeIntersec_ReturnsNull()
        {
            var cubes = new Cubes.Cube[2]
            {
                new Cubes.Cube(new Point(1, 1, 1), 1),
                new Cubes.Cube(new Point(-1, -1, -1), 1)
            };

            var result = Operators.CubeIntersec(cubes[0], cubes[1]);

            Assert.IsNull(result);
        }
Beispiel #4
0
        public void I3dObject_Volume_NonNegative()
        {
            bool failed = false;

            for (int i = 0; i < 100; i++)
            {
                var object1 = new Cubes.Cube(new Point(new Random().NextDouble(), new Random().NextDouble(), new Random().NextDouble()), new Random().NextDouble());
                if (object1.Volume() < 0)
                {
                    failed = true; break;
                }
            }

            Assert.IsFalse(failed);
        }
Beispiel #5
0
        static void GenerateCubes(int edgeIndex)
        {
            if (edgeIndex == Cube.EDGE_COUNT)
            {
                Cube cube = new Cube(currentEdges);
                if (isomorphicCubes.Contains(cube))
                {
                    return;
                }

                for (int i = 0; i < 4; i++)
                {
                    cube.RotateXY();
                    for (int j = 0; j < 4; j++)
                    {
                        cube.RotateXZ();
                        for (int k = 0; k < 4; k++)
                        {
                            cube.RotateYZ();
                            isomorphicCubes.Add(new Cube(cube));
                        }
                    }
                }

                cubesCount++;
                //Console.WriteLine(cube);
                return;
            }

            for (int color = 1; color <= Cube.MAX_COLOR; color++)
            {
                if (colorsLeftCount[color] > 0)
                {
                    colorsLeftCount[color]--;
                    currentEdges[edgeIndex] = color;
                    GenerateCubes(edgeIndex + 1);
                    colorsLeftCount[color]++;
                }
            }
        }
Beispiel #6
0
        public void I3dObject_minDimension_maxDimension()
        {
            bool failed = false;

            for (int i = 0; i < 100; i++)
            {
                var object1 = new Cubes.Cube(new Point(new Random().NextDouble(), new Random().NextDouble(), new Random().NextDouble()), new Random().NextDouble());
                if (object1.MinDimension(Dimension.Axis.x) > object1.MaxDimension(Dimension.Axis.x))
                {
                    failed = true; break;
                }
                if (object1.MinDimension(Dimension.Axis.y) > object1.MaxDimension(Dimension.Axis.y))
                {
                    failed = true; break;
                }
                if (object1.MinDimension(Dimension.Axis.z) > object1.MaxDimension(Dimension.Axis.z))
                {
                    failed = true; break;
                }
            }

            Assert.IsFalse(failed);
        }
Beispiel #7
0
        /// <summary>
        /// checkHookCubeCollision checks wheter the magnet collides with a cube.
        /// True: the magnet collides with a cube
        /// False: the manget does not collide with a cube
        /// </summary>
        /// <param name="cube"></param>
        /// <returns></returns>
        private bool checkHookCubeCollision(Cube cube)
        {
            BoundingSphere hookSphere = TransformBoundingSphere((BoundingSphere)theHook.Model.Tag, theHook.World);
            BoundingBox cubeSphere = TransformBoundingBox((BoundingSphere)cube.Model.Tag, cube.World);

            if (hookSphere.Intersects(cubeSphere))
                return true;
            else
                return false;
        }
Beispiel #8
0
        /// <summary>
        /// checkCubeCollision check wheter the cubes collide.
        /// True: the cubes collide
        /// False: the cubes do not collide.
        /// </summary>
        /// <param name="cube1"></param>
        /// <param name="cube2"></param>
        /// <returns></returns>
        private bool checkCubeCollision(Cube cube1, Cube cube2)
        {
            BoundingBox cube1Sphere = TransformBoundingBox((BoundingSphere)cube1.Model.Tag, cube1.World);
            BoundingBox cube2Sphere = TransformBoundingBox((BoundingSphere)cube2.Model.Tag, cube2.World);

            if (cube1Sphere.Intersects(cube2Sphere))
                return true;
            else
                return false;
        }
Beispiel #9
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            #region Keyboard input
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            #region Keyboar logic
            //Oppretter kuber i et tilfeldig sted
            if (input.KeyboardState.IsKeyDown(Keys.T) && input.KeyboardState != oldState)
            {
                Random rnd = new Random();
                //Cube tmp = new Cube(this, new Vector3(rnd.Next(-70, 70), rnd.Next(-70, 70), rnd.Next(-70, 70)), effect);
                Cube tmp = new Cube(this, new Vector3(50, 50, 0), effect);
                tmp.TextureSide = Content.Load<Texture2D>("Textures\\Cube-side");
                tmp.TextureTop = Content.Load<Texture2D>("Textures\\Cube-topbottom");
                tmp.Model = LoadModel("Models\\Cube2");
                this.Components.Add(tmp);
                theCubeList.Add(tmp);

            }
            if (input.KeyboardState.IsKeyDown(Keys.H) && input.KeyboardState != oldState)
            {
                showHelp = !showHelp;
            }
            #endregion

            if (input.KeyboardState.IsKeyDown(Keys.Y) && input.KeyboardState != oldState)
            {
                theCubeList.Clear();
            }
            #endregion

            #region Kubenes kollisjonsdeteksjonalgoritme
            foreach (Cube c1 in theCubeList)
            {
                List<Cube> collideList = new List<Cube>();
                float lowY = c1.World.Translation.Y;
                if (theHook.Active && !c1.Hooked && !theHook.HasBlock)
                {
                    c1.Hooked = theHook.HasBlock = checkHookCubeCollision(c1);
                }
                else if (!theHook.Active)
                {
                    c1.Hooked = false;
                }

                foreach (Cube c2 in theCubeList)
                {

                    if (!c1.Equals(c2))
                    {

                        if (checkCubeCollision(c1, c2))
                        {
                            Vector3 c1Pos = c1.World.Translation;
                            Vector3 c2Pos = c2.World.Translation;
                            if (c1Pos.Y < c2Pos.Y && !c1.Hooked && !c2.Hooked)
                            {
                                collideList.Add(c2);
                                foreach (Cube cLow in collideList)
                                {
                                    if (cLow.World.Translation.Y < lowY)
                                    {
                                        lowY = cLow.World.Translation.Y;
                                    }
                                }
                                if (c1.World.Translation.Y > lowY)
                                {
                                    c1.Move = true;
                                    break;
                                }
                            }
                            else
                            {
                                c1.Move = false;
                                c1.FallSpeed = 0;
                                break;
                            }
                        }
                        else
                        {
                            c1.Move = true;
                        }
                    }
                }
            }
            #endregion

            oldState = input.KeyboardState;
            base.Update(gameTime);
        }
Beispiel #10
0
 public Cube(Cube cube)
     : this()
 {
     Array.Copy(cube.edges, this.edges, EDGE_COUNT);
 }
Beispiel #11
0
        public static float volumeCollision(float l1, Cube cube1, float l2, Cube cube2)
        {
            float        volume;
            List <float> heigth;
            float        segment;

            List <float[, ]> numCollisionAB = pointsInsideCube(cube1, cube2);
            List <float[, ]> numCollisionBA = pointsInsideCube(cube2, cube1);
            List <float>     deltas         = new List <float>();
            List <float[, ]> numCollision   = new List <float[, ]>();
            List <float[, ]> numNotColision = new List <float[, ]>();

            Cube cube = new Cube(0, 0, 0, 0);

            if (numCollisionAB.Count == 0 && numCollisionBA.Count == 0) //both are outside
            {
                volume = 0;
            }
            else if (numCollisionAB.Count == 8 && numCollisionBA.Count == 8)//both are the same cube
            {
                volume = l1 * l1 * l1;
            }
            else
            {
                if (numCollisionAB.Count == 8) // cube1 inside cube2
                {
                    volume = l1 * l1 * l1;
                }
                else if (numCollisionBA.Count == 8) // cube2 inside cube1
                {
                    volume = l2 * l2 * l2;
                }
                else//partial collision 1,2 or 4 points inside 1 cube into the other IMPORTANT cubes are parallel;
                {
                    if (numCollisionAB.Count > numCollisionBA.Count)// cube1 smaller than cube2
                    {
                        numCollision   = numCollisionAB;
                        numNotColision = cube1.pointsCube.Where(item => !numCollision.Any(i => i == item)).ToList();
                        cube           = cube2;
                    }
                    else if (numCollisionAB.Count == numCollisionBA.Count)//point inside each cube
                    {
                        numCollision.Add(numCollisionAB[0]);
                        numCollision.Add(numCollisionBA[0]);
                        numNotColision = cube1.pointsCube.Where(item => !numCollision.Any(i => i == item)).ToList();
                        cube           = cube1;
                    }
                    else// cube2 smaller than cube1
                    {
                        numCollision   = numCollisionBA;
                        numNotColision = cube2.pointsCube.Where(item => !numCollision.Any(i => i == item)).ToList();
                        cube           = cube1;
                    }

                    deltas  = Geometry.getDeltas(numCollision);
                    segment = (float)Math.Sqrt(deltas[0] * deltas[0] + deltas[1] * deltas[1] + deltas[2] * deltas[2]);

                    if (numCollisionAB.Count == 4 || numCollisionBA.Count == 4)//plane inside big cube
                    {
                        heigth = heights(cube, segment, numCollision, numNotColision);
                        volume = segment * segment * heigth[0];
                    }
                    else if ((numCollisionAB.Count == 2 || numCollisionBA.Count == 2) && (numCollisionAB.Count != 1 && numCollisionBA.Count != 1))//line inside big cube
                    {
                        heigth = heights(cube, segment, numCollision, numNotColision);
                        volume = segment * heigth[0] * heigth[1];
                    }
                    else//point inside cube
                    {//volume usign diagonal points
                        volume = (float)Math.Pow((segment / (float)Math.Sqrt(3)), 3);
                    }
                }
            }
            return(volume);
        }