/// <summary> /// 查找最小区域 /// </summary> /// <param name="interiorWalls"></param> /// <param name="separateInterior"></param> /// <param name="spatials"></param> /// <param name="sortOutLines"></param> private void FindSpatialFromLinesModel(List <LineModel> interiorLines, List <LineModel> separateLines, List <SpatialModel> spatialModels, List <LineModel> outModels) { //查找一个任意起点 Line2D startLine = null; //从外边缘线开发查找 if (outModels.Count > 0) { startLine = outModels[0].Line; } //查找内装墙体 if (startLine == null) { if (tick >= interiorLines.Count) { return; } startLine = interiorLines.OrderByDescending(x => x.UseAge).ElementAtOrDefault(tick).Line; tick++; } //需要处理的墙体 List <Line2D> remainingLines = new List <Line2D>(); //记录需要查找的线 interiorLines.ForEach(x => { remainingLines.Add(x.Line); }); //查找和这个墙相关的封闭区域 List <LineModel> spatialLines = new List <LineModel>(); List <Line2D> Lines = null; try { //查找最小封闭区域 Lines = GraphicAlgorithm.FindClosedLines(remainingLines, false, false, startLine); } catch (Exception ex) { string message = ex.Message; } //假如出现查找不到的情况,会继续查找 if (Lines == null) { if (remainingLines.Count > 0) { FindSpatialFromLinesModel(interiorLines, separateLines, spatialModels, outModels); } } else { tick = 0; //假如出现了一条线还当前多边形内部,则说明当前多边形不合法,需要重新查询 bool reSearch = false; //循环所有线段 foreach (Line2D x in remainingLines) { //假如成立 if (x.IsInRegion(Lines)) { //说明内部有线,则需要重新查找 reSearch = true; break; } } if (reSearch) { FindSpatialFromLinesModel(interiorLines, separateLines, spatialModels, outModels); return; } //需要移除的线 List <LineModel> removeInteriorLines = new List <LineModel>(); //查找所有细分的墙体 foreach (Line2D line in Lines) { LineModel iw = interiorLines.Find(x => x.Line.IsAlmostEqualTo(line)); if (iw != null) { iw.UseAge -= 1; spatialLines.Add(iw); if (iw.UseAge == 0) { removeInteriorLines.Add(iw); } } } //移除已经使用完成的墙体 removeInteriorLines.ForEach(x => { if (x.LineType == LineType.outer) { outModels.Remove(outModels.Find(u => u.Line.IsAlmostEqualTo(x.Line))); } interiorLines.Remove(x); }); List <Line2D> boundary = null; //合并相关的内墙线 List <LineModel> mergeInteriorLines = this.MergeSpatialLines(spatialLines, separateLines, out boundary); //声明封闭区域 SpatialModel spatial = new SpatialModel(); //合并完成后,查找轮廓线 if (boundary.Count != Lines.Count) { Lines = GraphicAlgorithm.FindClosedLines(boundary, false, false, startLine); } List <Line2D> mergeLines = GraphicAlgorithm.MergeLines(new List <Line2D>(Lines)); spatial.LineModels = mergeInteriorLines; //当前底部的区域信息 //添加一个封闭区域 spatialModels.Add(spatial); if (interiorLines.Count > 0) { FindSpatialFromLinesModel(interiorLines, separateLines, spatialModels, outModels); } } }