예제 #1
0
        /// <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);
                }
            }
        }