示例#1
0
        private List <Node> FloydSmooth(List <Node> srcPath)
        {
            //直线处理
            int len = srcPath.Count;

            if (len > 2)
            {
                FloydVector vector = new FloydVector(0, 0);
                FloydVector tmpVct = new FloydVector(0, 0);

                CalFloydVector(vector, srcPath[len - 1], srcPath[len - 2]);

                for (int i = len - 3; i >= 0; i--)
                {
                    CalFloydVector(tmpVct, srcPath[i + 1], srcPath[i]);

                    if (vector.x == tmpVct.x && vector.y == tmpVct.y)
                    {
                        srcPath.RemoveAt(i + 1);
                    }
                    else
                    {
                        vector.x = tmpVct.x;
                        vector.y = tmpVct.y;
                    }
                }
            }

            //消除拐点
            len = srcPath.Count;
            for (int i = len - 1; i >= 0; i--)
            {
                for (int j = 0; j < i - 1; j++)
                {
                    if (!SceneDataMgr.Instance.SceneGrid.HasBarrier(srcPath[i], srcPath[j]))
                    {
                        for (int k = i - 1; k > j; k--)
                        {
                            srcPath.RemoveAt(k);
                        }

                        i   = j;
                        len = srcPath.Count;

                        break;
                    }
                }
            }

            return(srcPath);
        }
示例#2
0
 private void CalFloydVector(FloydVector vector, Node node1, Node node2)
 {
     vector.x = node1.x - node2.x;
     vector.y = node1.y - node2.y;
 }