Пример #1
0
        public bool IsPointInPoly(VectorF point)
        {
            int  i, j;
            bool c = false;

            for (i = 0, j = Points.Count - 1; i < Points.Count; i++)
            {
                switch (SimpleGeometry.GetEdgeType(point, Points[i] + Position, Points[j] + Position))
                {
                case SimpleGeometry.EdgeType.TOUCHING:
                    return(true);

                case SimpleGeometry.EdgeType.CROSSING:
                    c = !c;
                    break;
                }
                j = i;
            }

            return(c);
        }
Пример #2
0
        public override bool IsCollision(Collision collision)
        {
            if (GetMacroCollisionRect().IsMacroCollision(collision.GetMacroCollisionRect()) == false)
            {
                return(false);
            }

            if (collision.GetType() == typeof(PolygonCollision))
            {
                PolygonCollision poly = (PolygonCollision)collision;

                for (int i = 0, p = Points.Count - 1; i < Points.Count; i++)
                {
                    for (int j = 0, q = poly.Points.Count - 1; j < poly.Points.Count; j++)
                    {
                        if (SimpleGeometry.IsIntersection(Points[i] + Position, Points[p] + Position, poly.Points[j] + poly.Position, poly.Points[q] + poly.Position))
                        {
                            return(true);
                        }
                        q = j;
                    }
                    p = i;
                }

                return(IsPointInPoly(poly.Points[0] + poly.Position) || poly.IsPointInPoly(Points[0] + Position));
            }
            else if (collision.GetType() == typeof(BoxCollision))
            {
                BoxCollision box = (BoxCollision)collision;

                for (int i = 0, j = Points.Count - 1; i < Points.Count; i++)
                {
                    if (SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position, box.Position + new VectorF(box.Size.X, 0)) ||
                        SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + new VectorF(box.Size.X, 0), box.Position + box.Size) ||
                        SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + box.Size, box.Position + new VectorF(0, box.Size.Y)) ||
                        SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + new VectorF(0, box.Size.Y), box.Position))
                    {
                        return(true);
                    }
                    j = i;
                }

                return(IsPointInPoly(box.Position) || (((Points[0].X + Position.X) > box.Position.X) && ((Points[0].X + Position.X) < (box.Position.X + box.Size.X)) &&
                                                       ((Points[0].Y + Position.Y) > box.Position.Y) && ((Points[0].Y + Position.Y) < (box.Position.Y + box.Size.Y))));
            }
            else if (collision.GetType() == typeof(CircleCollision))
            {
                CircleCollision circle = (CircleCollision)collision;

                for (int i = 0, j = Points.Count - 1; i < Points.Count; i++)
                {
                    if (SimpleGeometry.IsSegmentIntersectsWithCircle(circle.Center(), circle.Radius, Points[i] + Position, Points[j] + Position))
                    {
                        return(true);
                    }

                    j = i;
                }

                return(IsPointInPoly(circle.Center()) || ((Points[0] + Position - circle.Center()).Length() < circle.Radius));
            }
            else
            {
                return(collision.IsCollision(this));
            }
        }