Beispiel #1
0
        public static bool RectToCircle(float rX, float rY, float rW, float rH, Vector2 cPosition, float cRadius)
        {
            //Check if the rectangle contains the circle's center point
            if (Collide.RectToPoint(rX, rY, rW, rH, cPosition))
            {
                return(true);
            }

            //Check the circle against the relevant edges
            Vector2      edgeFrom;
            Vector2      edgeTo;
            PointSectors sector = GetSector(rX, rY, rW, rH, cPosition);

            if ((sector & PointSectors.Top) != 0)
            {
                edgeFrom = new Vector2(rX, rY);
                edgeTo   = new Vector2(rX + rW, rY);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo))
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Bottom) != 0)
            {
                edgeFrom = new Vector2(rX, rY + rH);
                edgeTo   = new Vector2(rX + rW, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo))
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Left) != 0)
            {
                edgeFrom = new Vector2(rX, rY);
                edgeTo   = new Vector2(rX, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo))
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Right) != 0)
            {
                edgeFrom = new Vector2(rX + rW, rY);
                edgeTo   = new Vector2(rX + rW, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo))
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #2
0
        static public bool RectToCircle(float rX, float rY, float rW, float rH, Vector2 cPosition, float cRadius)
        {
            if (CircleToPoint(cPosition, cRadius, new Vector2(rX + rW / 2, rY + rH / 2)) == true)
            {
                return(true);
            }

            Vector2      edgeFrom;
            Vector2      edgeTo;
            PointSectors sector = GetSector(rX, rY, rW, rH, cPosition);

            if ((sector & PointSectors.Top) != 0)
            {
                edgeFrom = new Vector2(rX, rY);
                edgeTo   = new Vector2(rX + rW, rY);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true)
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Bottom) != 0)
            {
                edgeFrom = new Vector2(rX, rY + rH);
                edgeTo   = new Vector2(rX + rW, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true)
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Left) != 0)
            {
                edgeFrom = new Vector2(rX, rY);
                edgeTo   = new Vector2(rX, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true)
                {
                    return(true);
                }
            }

            if ((sector & PointSectors.Right) != 0)
            {
                edgeFrom = new Vector2(rX + rW, rY);
                edgeTo   = new Vector2(rX + rW, rY + rH);
                if (CircleToLine(cPosition, cRadius, edgeFrom, edgeTo) == true)
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #3
0
        static public PointSectors getSector(float rX, float rY, float rW, float rH, Vector2 point)
        {
            PointSectors sector = PointSectors.Center;

            if (point.X < rX)
            {
                sector |= PointSectors.Left;
            }
            else if (point.X >= rX + rW)
            {
                sector |= PointSectors.Right;
            }

            if (point.Y < rY)
            {
                sector |= PointSectors.Top;
            }
            else if (point.Y >= rY + rH)
            {
                sector |= PointSectors.Bottom;
            }

            return(sector);
        }
Beispiel #4
0
        /*
         *  Bitflags and helpers for using the Cohen–Sutherland algorithm
         *  http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm
         *
         *  Sector bitflags:
         *      1001  1000  1010
         *      0001  0000  0010
         *      0101  0100  0110
         */

        static public PointSectors getSector(RectangleF rect, Vector2 point)
        {
            PointSectors sector = PointSectors.Center;

            if (point.X < rect.left)
            {
                sector |= PointSectors.Left;
            }
            else if (point.X >= rect.right)
            {
                sector |= PointSectors.Right;
            }

            if (point.Y < rect.top)
            {
                sector |= PointSectors.Top;
            }
            else if (point.Y >= rect.bottom)
            {
                sector |= PointSectors.Bottom;
            }

            return(sector);
        }
Beispiel #5
0
        static PointSectors GetSector(Rectangle rect, Vector2 point)
        {
            PointSectors sector = PointSectors.Centre;

            if (point.X < rect.Left)
            {
                sector |= PointSectors.Left;
            }
            else if (point.X >= rect.Right)
            {
                sector |= PointSectors.Right;
            }

            if (point.Y < rect.Top)
            {
                sector |= PointSectors.Top;
            }
            else if (point.Y >= rect.Bottom)
            {
                sector |= PointSectors.Bottom;
            }

            return(sector);
        }
Beispiel #6
0
        /*
         *  Bitflags and helpers for using the Cohen–Sutherland algorithm
         *  http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm
         *
         *  Sector bitflags:
         *      1001  1000  1010
         *      0001  0000  0010
         *      0101  0100  0110
         */

        static public PointSectors GetSector(RectangleF rect, System.Numerics.Vector2 point)
        {
            PointSectors sector = PointSectors.Center;

            if (point.X < rect.Left)
            {
                sector |= PointSectors.Left;
            }
            else if (point.X >= rect.Right)
            {
                sector |= PointSectors.Right;
            }

            if (point.Y < rect.Top)
            {
                sector |= PointSectors.Top;
            }
            else if (point.Y >= rect.Bottom)
            {
                sector |= PointSectors.Bottom;
            }

            return(sector);
        }
Beispiel #7
0
        public static bool RectToLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo)
        {
            PointSectors fromSector = MyEngine.Collide.GetSector(rX, rY, rW, rH, lineFrom);
            PointSectors toSector   = MyEngine.Collide.GetSector(rX, rY, rW, rH, lineTo);

            if (fromSector == PointSectors.Center || toSector == PointSectors.Center)
            {
                return(true);
            }
            else if ((fromSector & toSector) != 0)
            {
                return(false);
            }
            else
            {
                PointSectors both = fromSector | toSector;

                //Do line checks against the edges
                Vector2 edgeFrom;
                Vector2 edgeTo;

                if ((both & PointSectors.Top) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX + rW, rY);
                    if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Bottom) != 0)
                {
                    edgeFrom = new Vector2(rX, rY + rH);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Left) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX, rY + rH);
                    if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Right) != 0)
                {
                    edgeFrom = new Vector2(rX + rW, rY);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (MyEngine.Collide.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Beispiel #8
0
        static public bool RectToLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo)
        {
            PointSectors fromSector = GetSector(rX, rY, rW, rH, lineFrom);
            PointSectors toSector   = GetSector(rX, rY, rW, rH, lineTo);

            if (fromSector == PointSectors.Centre || toSector == PointSectors.Centre)
            {
                return(true);
            }
            else if ((fromSector & toSector) != 0)
            {
                return(false);
            }
            else
            {
                PointSectors both = fromSector | toSector;

                Vector2 edgeFrom;
                Vector2 edgeTo;

                if ((both & PointSectors.Top) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX + rW, rY);
                    if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true)
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Bottom) != 0)
                {
                    edgeFrom = new Vector2(rX, rY + rH);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true)
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Left) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX, rY + rH);
                    if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true)
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Right) != 0)
                {
                    edgeFrom = new Vector2(rX + rW, rY);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (LineCheck(edgeFrom, edgeTo, lineFrom, lineTo) == true)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Beispiel #9
0
        public static bool RectangleLine(float rX, float rY, float rW, float rH, Vector2 lineFrom, Vector2 lineTo)
        {
            //throw new Exception("rectangle-line collision not implemented.");
            PointSectors fromSector = Collision.GetSector(rX, rY, rW, rH, lineFrom);
            PointSectors toSector   = Collision.GetSector(rX, rY, rW, rH, lineTo);

            if (fromSector == PointSectors.Center || toSector == PointSectors.Center)
            {
                return(true);
            }
            else if ((fromSector & toSector) != 0)
            {
                return(false);
            }
            else
            {
                PointSectors both = fromSector | toSector;

                //Do line checks against the edges
                Vector2 edgeFrom;
                Vector2 edgeTo;

                if ((both & PointSectors.Top) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX + rW, rY);
                    if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Bottom) != 0)
                {
                    edgeFrom = new Vector2(rX, rY + rH);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Left) != 0)
                {
                    edgeFrom = new Vector2(rX, rY);
                    edgeTo   = new Vector2(rX, rY + rH);
                    if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }

                if ((both & PointSectors.Right) != 0)
                {
                    edgeFrom = new Vector2(rX + rW, rY);
                    edgeTo   = new Vector2(rX + rW, rY + rH);
                    if (Collision.LineCheck(edgeFrom, edgeTo, lineFrom, lineTo))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }