/// <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(); }
/// <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); }