/// <summary>
        /// floyed line smooth func
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private static void Floyd(ref List <Point> path)
        {
            if (path == null)
            {
                return;
            }
            var index = 0;

            if (path.Count > 2)
            {
                while (index < path.Count - 2)
                {
                    if (Math.Abs(path[index + 2].X - path[index].X) == 1 &&
                        Math.Abs(path[index + 2].Y - path[index].Y) == 1)
                    {
                        path.RemoveAt(index + 1);
                    }
                    index++;
                }
            }
            var len = path.Count;

            if (len > 2)
            {
                var vector     = new Point(0, 0);
                var tempVector = new Point(0, 0);
                // loop all the node in the path and unite all the points which are in a same row
                FloydVector(ref vector, path[len - 1], path[len - 2]);
                for (var i = path.Count - 3; i >= 0; i--)
                {
                    FloydVector(ref tempVector, path[i + 1], path[i]);
                    if (vector.X == tempVector.X && vector.Y == tempVector.Y)
                    {
                        path.RemoveAt(i + 1);
                    }
                    else
                    {
                        vector.X = tempVector.X;
                        vector.Y = tempVector.Y;
                    }
                }
            }
            // delete the inflexions
            len = path.Count;
            for (var i = len - 1; i >= 0; i--)
            {
                for (var j = 0; j <= i - 2; j++)
                {
                    if (!MathUi.HasBarrier(path[i], path[j]))
                    {
                        for (var k = i - 1; k > j; k--)
                        {
                            path.RemoveAt(k);
                        }
                        i = j;
                        break;
                    }
                }
            }
        }
        /// <summary>
        ///  find the path
        /// </summary>
        /// <returns></returns>
        protected List <Vector2> PathFinding(Vector2 start, Vector2 end)
        {
            var result    = new List <Vector2>();
            var startPosX = Math.Round(start.X / 32f) > 99 ? 99 : Math.Round(start.X / 32f);
            var startPosY = Math.Round(start.Y / 32f) > 99 ? 99 : Math.Round(start.Y / 32f);
            var startPos  = new Point((int)startPosX, (int)startPosY);

            var endPosX = Math.Round(end.X / 32) > 99 ? 99 : Math.Round(end.X / 32);
            var endPosY = Math.Round(end.Y / 32) > 99 ? 99 : Math.Round(end.Y / 32);
            var endPos  = new Point((int)endPosX, (int)endPosY);

            if ((startPosX < 0 && startPosY < 0) || (startPosX > 99 && startPosY > 99) ||
                (endPosX < 0 && endPosY < 0) || (endPosX > 99 && endPosY > 99))
            {
                return(result);
            }
            if (ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.mStaticBarriers.ContainsKey(endPos) ||
                ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.mDynamicBarriers.ContainsKey(endPos))
            {
                endPos = ScreenManager.mPlayScreen.mObjectHandler.mAbstractMap.FindSubstitutePosition(endPos);
                if (endPos == Point.Zero)
                {
                    return(result);
                }
            }
            var hasBarrier = MathUi.HasBarrier(startPos, endPos);

            if (hasBarrier)
            {
                var path = BidirectionAStar(startPos, endPos);
                result.AddRange(path.Select(node => new Vector2(node.X * 32, node.Y * 32)));
            }
            else
            {
                result.Add(new Vector2(endPos.X * 32, endPos.Y * 32));
            }
            return(result);
        }