/// <summary> /// 生成外轮廓多边形 /// </summary> /// <param name="grid"></param> /// <param name="me"></param> /// <param name="startSearchPoint"></param> /// <param name="limitDistance"></param> /// <param name="isBlockOutPoly">是否为挡格的轮廓多边形,是的时候需要倒序处理</param> /// <returns></returns> private static ContourPoly GeneralOutPoly(RLEGridMap grid, MapElement me, Float2 startSearchPoint, float limitDistance, bool isBlockOutPoly) { ContourPoly poly = new ContourPoly(); List <Double2> points = me.GetContourPoints(grid, startSearchPoint); if (isBlockOutPoly == true) { points.Reverse(); } List <int> listIndex = ConvexPolygon2D.GenerateConvexPolygonIndex(points.ToArray()); List <Double2> polys = new List <Double2>(); for (int i = 0; i < listIndex.Count; i++) { if (i < listIndex.Count - 1) { OptimizationContourConvexLine(listIndex[i], listIndex[i + 1], false, limitDistance, points, ref polys); } else { OptimizationContourConvexLine(listIndex[i], listIndex[0], true, limitDistance, points, ref polys); } } poly.InitData(polys); return(poly); }
/// <summary> /// 添加挡格轮廓多边形 /// </summary> /// <param name="unit"></param> public void AddBlockPoly(ContourPoly poly) { if (poly == null) { return; } blockPolys.Add(poly); }
/// <summary> /// 生成外轮廓多边形 /// </summary> /// <param name="grid"></param> /// <param name="limitDistance"></param> /// <returns></returns> public static ContourUnit GeneralContourUnit(RLEGridMap grid, MapElement me, float limitDistance) { ContourPoly poly = GeneralOutPoly(grid, me, me.GetKeyPoint(), limitDistance, false); ContourUnit unit = new ContourUnit(poly);; if (me is MapArea) { Float2 keyPoint = Float2.zero; while (poly.FindKeyPoint(grid, ref keyPoint) == true) { ContourPoly poly1 = GeneralOutPoly(grid, me, keyPoint, limitDistance, true); unit.AddBlockPoly(poly1); } } return(unit); }
public ContourUnit(ContourPoly outPoly) { OutPoly = outPoly; }