private static void DummyBoundsFeatures(Manifold manifold, out CollisionFeatures features)
        {
            var aRect = new AlignedRectangle(manifold.A.Entity.Transform.WorldPosition, manifold.A.AABB.Size / 2);
            var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, manifold.B.AABB.Size / 2);

            CalculateCollisionFeatures(aRect, bRect, 1, out features);
        }
        public void CreateRandomStudents <T>(int nStudents, AlignedRectangle region) where T : IndividualIntelligence, new()
        {
            for (int i = 0; i < nStudents; ++i)
            {
                var newPerson = new Person(this, new Point(0, 0));
                newPerson.Intelligence = new T
                {
                    Owner = newPerson
                };

                while (true)
                {
                    double x = RandomGenerator.NextDouble(region.UpperLeft.X, region.LowerRight.X);
                    double y = RandomGenerator.NextDouble(region.UpperLeft.Y, region.LowerRight.Y);
                    Point  proposedPosition = new Point(x, y);
                    if (!HitsWall(proposedPosition, newPerson.PhysicalRadius) &&
                        !BreachesPersonalSpace(newPerson, proposedPosition))
                    {
                        newPerson.Position = proposedPosition;
                        People.Add(newPerson);
                        break;
                    }
                }
            }
        }
        static public void Run()
        {
            const double roomRadius = 20;
            const double doorSize   = 4;
            const int    nStudents  = 20;

            var engine = new FireDrillEngine
            {
                Floor = new AlignedRectangle(new Point(-roomRadius, roomRadius), new Point(roomRadius, -roomRadius))
            };

            // Left wall
            engine.Walls.Add(new Wall(new Point(-roomRadius, -roomRadius), new Point(-roomRadius, 0)));
            // Right wall
            engine.Walls.Add(new Wall(new Point(roomRadius, -roomRadius), new Point(roomRadius, 0)));
            // Back wall
            engine.Walls.Add(new Wall(new Point(-roomRadius, -roomRadius), new Point(roomRadius, -roomRadius)));
            // Front walls
            engine.Walls.Add(new Wall(new Point(-roomRadius, 0), new Point(-doorSize / 2, 0)));
            engine.Walls.Add(new Wall(new Point(roomRadius, 0), new Point(doorSize / 2, 0)));

            var usableRegion = new AlignedRectangle(new Point(-roomRadius, 0), new Point(roomRadius, -roomRadius));

            // Make students
            engine.CreateRandomStudents <IndividualIntelligenceADVAIT>(nStudents, usableRegion);

            var visualization = new FireDrillVisualization(engine);
            var viz           = new MotionVisualizer3D.MotionVisualizer3DControl(visualization);

            viz.Show();
        }
        private static void BoxBox(Manifold manifold, PhysShapeAabb a, PhysShapeAabb b, float flip,
                                   out CollisionFeatures features)
        {
            var aRect = new AlignedRectangle(manifold.A.Entity.Transform.WorldPosition, a.LocalBounds.Size / 2);
            var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, b.LocalBounds.Size / 2);

            CalculateCollisionFeatures(in aRect, in bRect, flip, out features);
        }
        public void BoxBox_NotCollide()
        {
            var a = new AlignedRectangle(new Vector2(1, 0), new Vector2(0.5f, 0.5f));
            var b = new AlignedRectangle(Vector2.Zero, new Vector2(0.5f, 0.5f));

            CollisionSolver.CalculateCollisionFeatures(in a, in b, 1, out var results);

            Assert.That(results.Collided, Is.False);
        }
        private static void CircleBox(Manifold manifold, PhysShapeCircle a, PhysShapeAabb b, float flip,
                                      out CollisionFeatures features)
        {
            var aRad = a.Radius;
            var aPos = manifold.A.Entity.Transform.WorldPosition;

            var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, b.LocalBounds.Size / 2);

            CalculateCollisionFeatures(bRect, new Circle(aPos, aRad), (float)flip * -1, out features);
        }
        public void BoxBox_Collide()
        {
            var a = new AlignedRectangle(new Vector2(1, 0), new Vector2(0.5f, 0.5f));
            var b = new AlignedRectangle(new Vector2(0.25f, 0.15f), new Vector2(0.5f, 0.5f));

            CollisionSolver.CalculateCollisionFeatures(in a, in b, 1, out var results);

            Assert.That(results.Collided, Is.True);
            Assert.That(results.Normal, Is.EqualTo(new Vector2(-1, 0)));
            Assert.That(results.Penetration, Is.EqualTo(0.25f / 2));
            Assert.That(results.Contacts, Is.Not.Null);
            Assert.That(results.Contacts.Length, Is.EqualTo(1));
            Assert.That(results.Contacts[0], Is.EqualTo(new Vector2(0.5f, 0.15f)));
        }