Example #1
0
        private static bool checkCollisionCircleWithSide(CollisionInfo collision)
        {
            CollisionCircle circle = collision.obj1 as CollisionCircle;
            CollisionSide   side   = collision.obj2 as CollisionSide;

            Logger.instance.Assert(null != circle && null != side, "Collision objects incorrect data for CircleWithSide");

            if ((side.P1 - circle.Center).Dot(side.DirOut) > circle.Radius)
            {
                return(false);
            }


            double distanceToLine     = (intersectLine(circle.Center, side.P1, side.P2) - circle.Center).Length;
            double distanceToInfinity = (side.P1 - circle.Center).Dot(side.DirOut);

            if (-circle.Radius - CollisionSide.SideWidth < distanceToInfinity && distanceToInfinity < circle.Radius &&
                distanceToLine <= distanceToInfinity + 1.0e-3)
            {
                Vector collisionPoint = circle.Center + side.DirOut * distanceToInfinity;
                collision.setCollisionData(collisionPoint, side.DirOut.Negative(), side.DirOut);
                return(true);
            }

            return(false);
        }
Example #2
0
        private static HashSet <TilePos> objectTiles(ICollisionObject obj)
        {
            switch (obj.Type)
            {
            case CollisionObjectType.Circle:
                CollisionCircle circle = obj as CollisionCircle;
                return(tilesByPosition(circle.Center.X - circle.Radius, circle.Center.Y - circle.Radius,
                                       circle.Center.X + circle.Radius, circle.Center.Y + circle.Radius));

            case CollisionObjectType.Rect:
                CollisionRect rect = obj as CollisionRect;

                Vector min = new Vector(double.MaxValue);
                Vector max = new Vector(double.MinValue);
                foreach (Vector point in rect.Points)
                {
                    min.set(Math.Min(point.X, min.X), Math.Min(point.Y, min.Y));
                    max.set(Math.Max(point.X, max.X), Math.Max(point.Y, max.Y));
                }

                return(tilesByPosition(min.X, min.Y, max.X, max.Y));
            }
            ;

            return(new HashSet <TilePos>());
        }
Example #3
0
        ///Other
        private List <ICollisionObject> objectsByTilesAndEdgesInfo(Dictionary <TilePos, TileDir[]> tilesInfo)
        {
            CollisionRect carRect = new CollisionRect(car);

            List <ICollisionObject> result = new List <ICollisionObject>();

            if (null != tilesInfo)
            {
                foreach (TilePos pos in tilesInfo.Keys)
                {
                    foreach (TileDir dir in tilesInfo[pos])
                    {
                        ICollisionObject obj = null;
                        if (dir.Correct())
                        {
                            obj = new CollisionSide(pos, dir);
                        }
                        else
                        {
                            obj = new CollisionCircle(pos, dir);
                        }

                        if (null == CollisionDetector.CheckCollision(carRect, obj))
                        {
                            result.Add(obj);
                        }
                    }
                }
            }
            return(result);
        }
Example #4
0
        private static bool checkCollisionCircleWithRect(CollisionInfo collision)
        {
            CollisionCircle circle = collision.obj1 as CollisionCircle;
            CollisionRect   rect   = collision.obj2 as CollisionRect;

            Logger.instance.Assert(null != circle && null != rect, "Collision objects incorrect data for CircleWithRect");

            if ((circle.Center - rect.Center).Length > circle.Radius + rect.MaxRadius)
            {
                return(false);
            }

            Vector TileDir        = circle.Center - rect.Center;
            double distanceLength = TileDir.Dot(rect.Dir);
            double distanceCross  = TileDir.Cross(rect.Dir);

            //inside
            if (Math.Abs(distanceLength) < rect.Width * 0.5 - circle.Radius && Math.Abs(distanceCross) < rect.Height * 0.5 - circle.Radius)
            {
                collision.setCollisionDataForInside(circle.Center);
                return(true);
            }

            Vector[] points = rect.Points;

            Vector[] intersects = new Vector[4] {
                intersectLine(circle.Center, points[0], points[1]),
                intersectLine(circle.Center, points[1], points[2]),
                intersectLine(circle.Center, points[2], points[3]),
                intersectLine(circle.Center, points[3], points[0])
            };

            int    minIndex    = -1;
            double minDistance = circle.Radius;

            for (int i = 0; i < 4; i++)
            {
                double distance = (intersects[i] - circle.Center).Length;
                if (distance < minDistance)
                {
                    minIndex    = i;
                    minDistance = distance;
                }
            }

            if (-1 != minIndex)
            {
                Vector n1 = (circle.Center - intersects[minIndex]).Normalize();
                Vector n2 = (rect.Center - intersects[minIndex]).Normalize();
                collision.setCollisionData(intersects[minIndex], n1, n2);
                return(true);
            }

            return(false);
        }
Example #5
0
        private static bool checkCollisionCircleWithCircle(CollisionInfo collision)
        {
            CollisionCircle circle1 = collision.obj1 as CollisionCircle;
            CollisionCircle circle2 = collision.obj2 as CollisionCircle;

            Logger.instance.Assert(null != circle1 && null != circle2, "Collision objects incorrect data for CircleWithCircle");

            Vector direction = (circle1.Center - circle2.Center);

            if (direction.Length < circle1.Radius + circle2.Radius)
            {
                direction = direction.Normalize();
                Vector collisionPoint = circle1.Center - direction * circle1.Radius;

                collision.setCollisionData(collisionPoint, direction, direction.Negative());
                return(true);
            }
            return(false);
        }