Пример #1
0
        //-------------------------------------------------------------------------------------------------------------------

        /*
         *       _____ _          _             _      _                 _____       _                          _   _
         *      / ____(_)        | |           | |    (_)               |_   _|     | |                        | | (_)
         *     | |     _ _ __ ___| | ___ ______| |     _ _ __   ___ ______| |  _ __ | |_ ___ _ __ ___  ___  ___| |_ _  ___  _ __
         *     | |    | | '__/ __| |/ _ \______| |    | | '_ \ / _ \______| | | '_ \| __/ _ \ '__/ __|/ _ \/ __| __| |/ _ \| '_ \
         *     | |____| | | | (__| |  __/      | |____| | | | |  __/     _| |_| | | | ||  __/ |  \__ \  __/ (__| |_| | (_) | | | |
         *      \_____|_|_|  \___|_|\___|      |______|_|_| |_|\___|    |_____|_| |_|\__\___|_|  |___/\___|\___|\__|_|\___/|_| |_|
         *                                                                                                       *Credits Corey(L$)
         *
         */

        public static CircInter GetCircleLineInteraction(Vector3 from, Vector2 to, Vector2 cPos, float radius)
        {
            var res = new CircInter();
            var dx  = from.X - to.X;
            var dy  = from.Y - to.Y;
            var a   = dx * dx + dy * dy;
            var b   = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y));
            var c   = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius;
            var det = b * b - 4 * a * c;

            if ((a <= 0.0000001) || (det < 0))
            {
                res.None = true;
            }
            else if (det == 0)
            {
                res.One = true;
                var t = -b / (2 * a);
                res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            else
            {
                var t = (float)((-b + Math.Sqrt(det)) / (2 * a));
                res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy);
                t          = (float)((-b - Math.Sqrt(det)) / (2 * a));
                res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            return(res);
        }
Пример #2
0
        public static CircInter GetCicleLineInteraction(Vector2 from, Vector2 to, Vector2 cPos, float radius)
        {
            var res = new CircInter();

            var dx = from.X - to.X;
            var dy = from.Y - to.Y;

            var A = dx * dx + dy * dy;
            var B = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y));
            var C = (to.X - cPos.X) * (to.X - cPos.X) +
                    (to.Y - cPos.Y) * (to.Y - cPos.Y) -
                    radius * radius;

            var det = B * B - 4 * A * C;

            if ((A <= 0.0000001) || (det < 0))
            {
                res.None = true;
                // No real solutions.
            }
            else if (det == 0)
            {
                res.One = true;
                // One solution.
                var t = -B / (2 * A);
                res.Inter1 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            else
            {
                // Two solutions.
                var t = (float)((-B + Math.Sqrt(det)) / (2 * A));
                res.Inter1 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
                t          = (float)((-B - Math.Sqrt(det)) / (2 * A));
                res.Inter2 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
            }


            return(res);
        }
Пример #3
0
        public static CircInter GetCicleLineInteraction(Vector2 from, Vector2 to, Vector2 cPos, float radius)
        {
            var res = new CircInter();

            var dx = from.X - to.X;
            var dy = from.Y - to.Y;

            var A = dx * dx + dy * dy;
            var B = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y));
            var C = (to.X - cPos.X) * (to.X - cPos.X) +
                (to.Y - cPos.Y) * (to.Y - cPos.Y) -
                radius * radius;

            var det = B * B - 4 * A * C;
            if ((A <= 0.0000001) || (det < 0))
            {
                res.None = true;
                // No real solutions.
            }
            else if (det == 0)
            {
                res.One = true;
                // One solution.
                var t = -B / (2 * A);
                res.Inter1 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            else
            {
                // Two solutions.
                var t = (float)((-B + Math.Sqrt(det)) / (2 * A));
                res.Inter1 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
                t = (float)((-B - Math.Sqrt(det)) / (2 * A));
                res.Inter2 =
                    new Vector2(to.X + t * dx, to.Y + t * dy);
            }

            return res;
        }
Пример #4
0
        //-------------------------------------------------------------------------------------------------------------------
        /*
        *       _____ _          _             _      _                 _____       _                          _   _             
        *      / ____(_)        | |           | |    (_)               |_   _|     | |                        | | (_)            
        *     | |     _ _ __ ___| | ___ ______| |     _ _ __   ___ ______| |  _ __ | |_ ___ _ __ ___  ___  ___| |_ _  ___  _ __  
        *     | |    | | '__/ __| |/ _ \______| |    | | '_ \ / _ \______| | | '_ \| __/ _ \ '__/ __|/ _ \/ __| __| |/ _ \| '_ \ 
        *     | |____| | | | (__| |  __/      | |____| | | | |  __/     _| |_| | | | ||  __/ |  \__ \  __/ (__| |_| | (_) | | | |
        *      \_____|_|_|  \___|_|\___|      |______|_|_| |_|\___|    |_____|_| |_|\__\___|_|  |___/\___|\___|\__|_|\___/|_| |_|
        *                                                                                                       *Credits Corey(L$)             
        *                                                                                                                       
        */

        public static CircInter GetCircleLineInteraction(Vector3 from, Vector2 to, Vector2 cPos, float radius)
        {
            var res = new CircInter();
            var dx = from.X - to.X;
            var dy = from.Y - to.Y;
            var a = dx * dx + dy * dy;
            var b = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y));
            var c = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius;
            var det = b * b - 4 * a * c;

            if ((a <= 0.0000001) || (det < 0))
            {
                res.None = true;
            }
            else if (det == 0)
            {
                res.One = true;
                var t = -b / (2 * a);
                res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            else
            {
                var t = (float)((-b + Math.Sqrt(det)) / (2 * a));
                res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy);
                t = (float)((-b - Math.Sqrt(det)) / (2 * a));
                res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy);
            }
            return res;
        }