コード例 #1
0
        /// <summary>
        /// Провери дали се сече или допира со правоаголник
        /// </summary>
        /// <param name="rect"></param>
        /// <param name="points"></param>
        /// <returns></returns>
        private bool Intersects(GameRectangle rect, List<Vector2D> points)
        {
            /* Ќе сметаме дека правоаголникот секогаш е претставен како
             *
             * UL                         UR
             *  ---------------------------
             *  |                         |
             *  |                         |
             *  |                         |
             *  ---------------------------
             * DL                         DR
             *
             */

            //темиња на првиот правоаголник
            Vector2D pointUL = PositionUL;
            Vector2D pointUR = PositionUR;
            Vector2D pointDL = PositionDL;
            Vector2D pointDR = GetPositionVectorDR();

            //темиња на вториот правоаголник
            Vector2D pointUL2 = rect.PositionUL;
            Vector2D pointUR2 = rect.PositionUR;
            Vector2D pointDL2 = rect.PositionDL;
            Vector2D pointDR2 = rect.GetPositionVectorDR();

            //Провери вториот дали се содржи целосно во првиот. Врати ги темињата на внатрешниот во тој случај
            if (pointUL2.X > pointUL.X && pointUR2.X < pointUR.X && pointDL2.Y < pointDL.Y)
            {
                points.Add(pointUL2);
                points.Add(pointUR2);
                points.Add(pointDL2);
                points.Add(pointDR2);
                return true;
            }
            else if (pointUL.X > pointUL2.X && pointUR.X < pointUR2.X && pointDL.Y < pointDL2.Y)
            {
                //обратната ситуација
                points.Add(pointUL);
                points.Add(pointUR);
                points.Add(pointDL);
                points.Add(pointDR);
                return true;
            }

            //провери дали двете вертикални од вториот ја сечат горната хоризонтална страна од првиот
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointUL2, pointDL2, pointUL, pointUR)));
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(pointUR2, pointDR2, pointUL, pointUR)));

            //провери дали двете вертикали од вториот ја сечат долната хоризонтала од првиот
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointUL2, pointDL2, pointDL, pointDR)));
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointUR2, pointDR2, pointDL, pointDR)));

            //провери дали двете хоризонтали од вториот ја сечат левата вертикала од првиот
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointUL2, pointUR2,
                pointUL, pointDL)));
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointDL2, pointDR2,
                pointUL, pointDL)));

            //провери дали двете хоризонтали од вториот ја сечат десната вертикала од првиот
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointUL2, pointUR2,
                pointUR, pointDR)));
            points.AddRange((GeometricAlgorithms.IntersectLineSegments(
                pointDL2, pointDR2,
                pointUR, pointDR)));

            //ако е најдена барем една заедничка точка, врати true
            return points.Count > 0;
        }