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