public void _CreateSpaceSpanGroup(SolidSpanGroup solidSpanGroup)
        {
            Dictionary <int, LinkedList <SolidSpan> > soildSpanDict = solidSpanGroup.soildSpanDict;
            LinkedList <SolidSpan> solidSpanList;
            SpaceSpan spaceSpan;

            int[]            cellIdxs;
            Vector3d[]       voxRect;
            CellSpaceSpans   cellSpaceSpans;
            List <SpaceSpan> spaceSpanList;
            double           startpos;
            double           endpos;

            foreach (var item in soildSpanDict)
            {
                cellIdxs = solidSpanGroup.GetCellIdxs(item.Key);
                voxRect  = voxSpace.GetFloorGridCellRect(cellIdxs[0], cellIdxs[1]);

                solidSpanList = item.Value;
                var node = solidSpanList.First;

                cellSpaceSpans = new CellSpaceSpans();
                spaceSpanList  = new List <SpaceSpan>();
                cellSpaceSpans.spaceSpanList = spaceSpanList;
                cellSpaceSpans.rect          = voxRect;

                for (; node != null; node = node.Next)
                {
                    startpos = node.Value.endPos;
                    if (node.Next != null)
                    {
                        endpos = node.Next.Value.startPos;
                    }
                    else
                    {
                        endpos = startpos + 1000000;
                    }

                    if (endpos - startpos >= minWalkHeight)
                    {
                        spaceSpan                = new SpaceSpan();
                        spaceSpan.startPos       = startpos;
                        spaceSpan.endPos         = endpos;
                        spaceSpan.cellSpaceSpans = cellSpaceSpans;
                        spaceSpan.connectSpan    = new SpaceSpan[] { null, null, null, null };
                        spaceSpanList.Add(spaceSpan);
                    }
                }

                spaceSpanDict[item.Key] = cellSpaceSpans;
            }
        }
        /// <summary>
        /// 根据障碍方向,和角色行走半径,给当前span上的角色半径范围内不可移动的周边spans作标记
        /// </summary>
        /// <param name="spanIdx"></param>
        /// <param name="span"></param>
        /// <param name="obstacleDir">以当前span为中心,按左手顺时针: 0←  1↑  2→  3↓</param>
        void SetNotWalkSpansByObstacleDir(int[] spanIdx, SpaceSpan span, int obstacleDir)
        {
            int x, y;
            int flag = 1;

            if (obstacleDir == 2 || obstacleDir == 3)
            {
                flag = -1;
            }

            double limitEndPosY = span.startPos + minWalkHeight;

            switch (obstacleDir)
            {
            case 0:
            case 2:
            {
                for (int i = 0; i < walkRadiusVoxCount; i++)
                {
                    x = spanIdx[0] + i * flag;
                    SetNotWalkSpans(x, spanIdx[1], span.startPos, limitEndPosY);

                    for (int j = 0; j <= i + 1; j++)
                    {
                        SetNotWalkSpans(x, spanIdx[1] - j, span.startPos, limitEndPosY);
                        SetNotWalkSpans(x, spanIdx[1] + j, span.startPos, limitEndPosY);
                    }
                }
            }
            break;

            case 1:
            case 3:
            {
                for (int i = 0; i < walkRadiusVoxCount; i++)
                {
                    y = spanIdx[0] + i * flag;
                    SetNotWalkSpans(spanIdx[0], y, span.startPos, limitEndPosY);

                    for (int j = 1; j <= i + 1; j++)
                    {
                        SetNotWalkSpans(spanIdx[0] - j, y, span.startPos, limitEndPosY);
                        SetNotWalkSpans(spanIdx[0] + j, y, span.startPos, limitEndPosY);
                    }
                }
            }
            break;
            }
        }
        void SplitOneRegion(SpaceSpan startSpan, int region)
        {
            SpaceSpan        centerSpan, connectSpan;
            List <SpaceSpan> tmp;
            List <SpaceSpan> frontSpanlist = new List <SpaceSpan>(200);
            List <SpaceSpan> backSpanlist  = new List <SpaceSpan>(200);

            frontSpanlist.Add(startSpan);

            while (frontSpanlist.Count > 0)
            {
                for (int i = 0; i < frontSpanlist.Count; i++)
                {
                    centerSpan        = frontSpanlist[i];
                    centerSpan.isEdge = false;

                    for (int j = 0; j < 4; j++)
                    {
                        connectSpan = centerSpan.connectSpan[j];

                        if (connectSpan == null ||
                            connectSpan.region > 0 ||
                            connectSpan.type == 1)
                        {
                            centerSpan.isEdge = true;
                            continue;
                        }

                        if (connectSpan.cellSpaceSpans.region == region)
                        {
                            centerSpan.isEdge = true;
                            continue;
                        }

                        connectSpan.region = region;

                        backSpanlist.Add(connectSpan);
                    }
                }

                tmp           = frontSpanlist;
                frontSpanlist = backSpanlist;
                backSpanlist  = tmp;
                backSpanlist.Clear();
            }
        }