/// <summary> /// 用于创建当前的数据线段 /// </summary> /// <param name="lines"></param> /// <returns></returns> public static List <LineModel> Create(List <Line2D> lines) { //打断所有的线段 List <Line2D> decomposeLines = lines.Decompose(); //查找最外边缘 List <Line2D> outerLines = GraphicAlgorithm.FindClosedLines(decomposeLines, true, false); if (outerLines == null) { throw new Exception("当前没有一个封闭区域"); } for (int i = 0; i < outerLines.Count; i++) { Line2D line = decomposeLines.Find(x => x.IsAlmostEqualTo(outerLines[i])); decomposeLines.Remove(line); } //查找内墙 List <Line2D> innerLines = new List <Line2D>(decomposeLines); //数据模型 List <LineModel> lineModels = new List <LineModel>(); //组建数据源 outerLines.ForEach(x => { lineModels.Add(new LineModel(x, 1, LineType.outer)); }); //内装线添加 innerLines.ForEach(x => { lineModels.Add(new LineModel(x, 2, LineType.inner)); }); return(lineModels); }
/// <summary> /// /// </summary> /// <param name="allLines"> //allLines是连续的线</param> public List <List <Line3D> > FindAllFloorOutLines(List <Line3D> allLines) { // List<Line3D> resultDecomposedLinesTT = DecomposeLines(allLines); List <Line3D> resultDecomposedLines = new List <Line3D>(); DecomposeCurves(allLines, resultDecomposedLines); //查找外框线 List <Line3D> sortOutLines = GraphicAlgorithm.FindClosedLines(allLines, true, false); List <Line3D> decomposedOutlines = new List <Line3D>(); foreach (var line in resultDecomposedLines) { if (IsLineContained(line, sortOutLines)) { decomposedOutlines.Add(line); } } decomposedOutlines = decomposedOutlines.SortLinesByCounterClockwise(Vector3D.BasisZ); List <List <Line3D> > curveArrarys = new List <List <Line3D> >(); List <Line3D> usedLines = new List <Line3D>(); FindLineArrarys(resultDecomposedLines, decomposedOutlines, usedLines, curveArrarys); return(curveArrarys); }
/// <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); } } }
private void FindLineArrarys(List <Line3D> resultDecomposedLines, List <Line3D> sortOutLines, List <Line3D> usedLines, List <List <Line3D> > curveArrarys) { //首先要剔除那些线的两端和其他线不是相连的线段 //查找一个任意起点 Line3D startLine = null; if (sortOutLines.Count > 0) { startLine = sortOutLines[0]; } //需要移除的墙体 List <Line3D> remainingLines = new List <Line3D>(); remainingLines.AddRange(resultDecomposedLines); //查找最小封闭区域 List <Line3D> Lines = GraphicAlgorithm.FindClosedLines(resultDecomposedLines, false, false, startLine); curveArrarys.Add(Lines); foreach (var line in Lines) { //包含在外框线中 bool isContained = IsLineContained(line, sortOutLines); //包含在内框线中,并且已经被使用过 bool isUsed = IsLineContained(line, usedLines); if (isContained || isUsed) { Line3D targetLine = FindtargetLine(line, remainingLines); if (targetLine != null) { remainingLines.Remove(targetLine); } } else { usedLines.Add(line); } #region MyRegion //if (isContained) //{ // Line3D targetLine = FindtargetLine(line, remainingLines); // if (targetLine != null) // remainingLines.Remove(targetLine); //} ////添加到使用的线中 //else //{ // if (isUsed) // { // Line3D targetLine = FindtargetLine(line, remainingLines); // if (targetLine != null) // remainingLines.Remove(targetLine); // } //} #endregion } if (remainingLines.Count > 0) { FindLineArrarys(remainingLines, sortOutLines, usedLines, curveArrarys); } else { return; } }