Beispiel #1
0
        /// <summary>
        /// 生成轮廓数据
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="limitDistance"></param>
        /// <param name="ret"></param>
        public void GeneralContour(RLEGridMap grid, ref ContourData ret)
        {
            if (ret == null)
            {
                ret = new ContourData();
            }
            ret.Clear();
            ret.tileSize = (int)grid.TileSize;
            ret.sdfValue = (int)grid.SdfValue;
            ret.width    = grid.tileXnum * ret.tileSize;
            ret.height   = grid.tileYnum * ret.tileSize;
            float limitDistance = ret.tileSize;

            for (int i = 0; i < this.myArea.Count; i++)
            {
                MapArea     submap = this.myArea[i];
                ContourUnit unit   = ContourOptimization.GeneralContourUnit(grid, submap, limitDistance);
                ret.AddAreaMap(unit);
            }

            for (int i = 0; i < this.mydoor.Count; i++)
            {
                StageGateArea stage = this.mydoor[i];
                ContourUnit   unit  = ContourOptimization.GeneralContourUnit(grid, stage, limitDistance);
                unit.SetDoorData(stage.MindoorCenter, stage.MaxdoorCenter, stage.isXdir, grid.TileSize, i);
                ret.AddStage(unit);
            }
            // 分析连接关系
            ret.ParseDoorLink();
        }
Beispiel #2
0
        /// <summary>
        /// 裁剪挡格数据
        /// </summary>
        /// <param name="ar"></param>
        /// <param name="listblock"></param>
        /// <param name="minPos"></param>
        /// <param name="maxPos"></param>
        /// <returns></returns>
        public bool CutBlockArea(StageGateArea ar, ref List <Short2> listblock, ref Short2 minPos, ref Short2 maxPos)
        {
            if (ar == null)
            {
                return(false);
            }
            Float2 min = Float2.Min(ar.leftBottom, ar.rightUp);
            Float2 max = Float2.Max(ar.leftBottom, ar.rightUp);

            Short2 min2 = GetIndex(min);
            Short2 max2 = GetIndex(max);

            Short2 diff   = max2 - min2;
            int    width  = diff.x + 1;
            int    height = diff.y + 1;

            maxPos = min2;
            minPos = max2;
            List <Short2> list = new List <Short2>();

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    Short2 pos = new Short2(x + min2.x, y + min2.y);
                    if (CheckBlock(pos) == true)
                    {
                        list.Add(new Short2(x, y));
                        minPos = Short2.Min(minPos, pos);
                        maxPos = Short2.Max(maxPos, pos);
                    }
                }
            }
            if (listblock == null)
            {
                listblock = new List <Short2>();
            }
            listblock.Clear();
            foreach (Short2 pos in list)
            {
                listblock.Add(pos - (minPos - min2));
            }
            return(true);
        }