private static bool IsRayIntersectWithBeaconAccuracy(PointF ray, Beacon beacon)
        {
            if (beacon == null)
                return false;

            var x = beacon.X;
            var y = beacon.Y;
            var r = beacon.Accuracy;
            return r > Math.Sqrt((ray.X - x) * (ray.X - x) + (ray.Y - y) * (ray.Y - y));
        }
        private static IEnumerable<PointF> GetCircleCircleIntersections(Beacon b1, Beacon b2)
        {
            var p1 = new PointF(b1.X, b1.Y);
            var p2 = new PointF(b2.X, b2.Y);
            var d = GetDistanceBetween(p1, p2);
            var r1 = b1.Accuracy;
            var r2 = b2.Accuracy;

            // if to far away, or self contained - can't be done
            if ((d >= (r1 + r2)) || (d <= Math.Abs(r1 - r2))) {
                return new List<PointF>();
            }

            var a = (r1*r1 - r2*r2 + d*d)/(2*d);
            var h = Math.Sqrt(r1*r1 - a*a);
            var x0 = p1.X + a*(p2.X - p1.X)/d;
            var y0 = p1.Y + a*(p2.Y - p1.Y)/d;
            var rx = -(p2.Y - p1.Y)*(h/d);
            var ry = -(p2.X - p1.X)*(h/d);

            return new List<PointF>
            {
                new PointF((float) (x0 + rx), (float) (y0 - ry)),
                new PointF((float) (x0 - rx), (float) (y0 + ry))
            };
        }
 private static bool IsOverBeaconAccuracyRadius(Beacon beacon, float x, float y)
 {
     var dx = MetersToPixels * beacon.X + ShiftX - x;
     var dy = MetersToPixels * beacon.Y + ShiftY - y;
     var dist = Math.Sqrt(dx*dx + dy*dy);
     var acc = MetersToPixels*beacon.Accuracy;
     return Math.Abs(dist - acc) < 12;
 }