Esempio n. 1
0
        private static bool CheckOverlap(Arc arc, Circle circle)
        {
            vec2 p1 = arc.Position;
            vec2 p2 = circle.Position;

            float sumRadius       = arc.Radius + circle.Radius;
            float distanceSquared = Utilities.DistanceSquared(p1, p2);

            if (distanceSquared > sumRadius * sumRadius)
            {
                return(false);
            }

            float angle      = Utilities.Angle(p1, p2);
            float delta      = Utilities.CorrectAngle(Math.Abs(angle - arc.Angle));
            float halfSpread = arc.Spread / 2;

            if (delta <= halfSpread)
            {
                return(true);
            }

            vec2[] points = new vec2[2];

            for (int i = 0; i < 2; i++)
            {
                float a = arc.Angle + halfSpread * (i == 0 ? -1 : 1);

                points[i] = p1 + Utilities.Direction(a) * arc.Radius;
            }

            if (points.Any(circle.Contains))
            {
                return(true);
            }

            float radiusSquared = circle.Radius * circle.Radius;

            return(points.Any(p => Utilities.DistanceSquaredToLine(p2, p1, p) <= radiusSquared));
        }
Esempio n. 2
0
        private static bool CheckOverlap(Arc arc, Circle circle)
        {
            var p1              = arc.Position;
            var p2              = circle.Position;
            var sumRadius       = arc.Radius + circle.Radius;
            var distanceSquared = Utilities.DistanceSquared(p1, p2);

            if (distanceSquared > sumRadius * sumRadius)
            {
                return(false);
            }

            var angle      = Utilities.Angle(p1, p2);
            var delta      = Utilities.Delta(angle, arc.Angle);
            var halfSpread = arc.Spread / 2;

            if (delta <= halfSpread)
            {
                return(true);
            }

            var points = new vec2[2];

            for (int i = 0; i < 2; i++)
            {
                var a = arc.Angle + halfSpread * (i == 0 ? -1 : 1);

                points[i] = p1 + Utilities.Direction(a) * arc.Radius;
            }

            if (points.Any(p => circle.Contains(p, Coordinates.Absolute)))
            {
                return(true);
            }

            var squared = circle.Radius * circle.Radius;

            return(points.Any(p => Utilities.DistanceSquaredToLine(p2, p1, p, out _) <= squared));
        }