Ejemplo n.º 1
0
        /// <summary>
        /// Két, a középpontjával és sugarával adott körnek számolja ki a metszéspontjait, ha lézetnek, vagy létezik
        /// </summary>
        /// <param name="P0">Az első kör középpontja</param>
        /// <param name="r0">Az első kör sugara</param>
        /// <param name="P1">A második kör középpontja</param>
        /// <param name="r1">A második kör sugara</param>
        /// <returns>Az Intersection objektum a metszéspontokat reprezentálja, melyben egy lista tárolja, hogy hány metszéspontja van a két körnek</returns>
        public static Intersection CalculateIntersection(Point P0, double r0, Point P1, double r1)
        {
            double d, a, h;
            Point  P2, isPoint1, isPoint2;

            d = LocationCalculator.Distance(P0, P1);

            if (d > r0 + r1)
            {
                return(new Intersection(new List <Point>()));               // Két külön körről van szó
            }
            if (d < Math.Abs(r0 - r1))
            {
                return(new Intersection(new List <Point>()));                        // Az egyik kör a másikon belül van
            }
            if (d == 0 && r0 == r1)
            {
                return(new Intersection(null));                         // A két kör éppen egybeesik
            }
            //TODO: megvizsgálni, hogy két metszéspont lesz, egy, végtelen, vagy nem érintkeznek

            a  = (Math.Pow(r0, 2) - Math.Pow(r1, 2) + Math.Pow(d, 2)) / (2 * d);
            h  = Math.Sqrt(Math.Pow(r0, 2) - Math.Pow(a, 2));
            P2 = new Point(P0.X + a * (P1.X - P0.X) / d, P0.Y + a * (P1.Y - P0.Y) / d);

            isPoint1 = new Point(P2.X + h * (P1.Y - P0.Y) / d, P2.Y - h * (P1.X - P0.X) / d);
            isPoint2 = new Point(P2.X - h * (P1.Y - P0.Y) / d, P2.Y + h * (P1.X - P0.X) / d);

            // Ha a két kör éppen érinti egymást egy ponton (d = r1 + r2), akkor is két pont lesz a metszet eredménye, de ezek egybeesnek
            List <Point> solutions = new List <Point>();

            solutions.Add(isPoint1);
            solutions.Add(isPoint2);
            return(new Intersection(solutions));
        }
 public bool Includes(TagDisplay OtherTag)
 {
     if (this.radius > LocationCalculator.Distance(this.origo, OtherTag.origo) + OtherTag.Distance)
     {
         return(true);
     }
     return(false);
 }