Пример #1
0
        private List <Segment2D> CutOutDoor(Segment2D currentDoor, List <Segment2D> allWalls)
        {
            var listArray     = new List <List <Segment2D> >();
            var newWallList   = new List <Segment2D>();
            var wallsToRemove = new List <Segment2D>();

            Vector2D[] doorVertices    = currentDoor.GetVertices();
            Vector2D   doorVectorStart = doorVertices[0];
            Vector2D   doorVectorEnd   = doorVertices[1];
            Vector2D   doorVector      = doorVectorEnd.Difference(doorVectorStart).GetAsNormalized();

            foreach (Segment2D currentWall in allWalls)
            {
                Vector2D[] wallVertices    = currentWall.GetVertices();
                Vector2D   wallVectorStart = wallVertices[0];
                Vector2D   wallVectorEnd   = wallVertices[1];
                Vector2D   wallVector      = wallVectorEnd.Difference(wallVectorStart).GetAsNormalized();

                if (wallVectorStart.IsEqualTo(wallVectorEnd))
                {
                    wallsToRemove.Add(currentWall);
                    continue;
                }
                else if (GeoAdditionals.SegmentsLieOnTopOfEachOther(currentDoor, currentWall))
                {
                    double cos = wallVector.Dot(doorVector) / (wallVector.normalize() * doorVector.normalize());

                    if (cos < 0)
                    {
                        doorVectorStart = doorVertices[1];
                        doorVectorEnd   = doorVertices[0];
                    }

                    if (!wallVectorStart.IsEqualTo(doorVectorStart))
                    {
                        Segment2D wallToDoor = GeometryFactory.CreateSegment2D(new Vector2D[] { wallVectorStart, doorVectorStart }, currentWall.Name);
                        newWallList.Add(wallToDoor);
                    }
                    if (!doorVectorEnd.IsEqualTo(wallVectorEnd))
                    {
                        Segment2D wallFromDoor = GeometryFactory.CreateSegment2D(new Vector2D[] { doorVectorEnd, wallVectorEnd }, currentWall.Name);
                        newWallList.Add(wallFromDoor);
                    }

                    wallsToRemove.Add(currentWall);
                    continue;
                }
                else
                {
                    continue;
                }
            }
            foreach (Segment2D wallToRemove in wallsToRemove)
            {
                allWalls.Remove(wallToRemove);
            }

            allWalls.AddRange(newWallList);
            return(allWalls);
        }
Пример #2
0
        public static bool SegmentsLieOnTopOfEachOther(Segment2D firstSegment, Segment2D secondSegment)
        {
            bool onTop = false;

            Vector2D[] firstSegmentsVertices   = firstSegment.GetVertices();
            Vector2D   firstSegmentsStart_A    = firstSegmentsVertices[0];
            Vector2D   firstSegmentsEnd_B      = firstSegmentsVertices[1];
            Vector2D   firstSegmentsDirection  = firstSegmentsEnd_B.Difference(firstSegmentsStart_A);
            double     firstsegmentsLength     = firstSegmentsDirection.normalize();
            Vector2D   secondSegmentsStart_C   = secondSegment.GetVertices()[0];
            Vector2D   secondSegmentsEnd_D     = secondSegment.GetVertices()[1];
            Vector2D   secondSegmentsDirection = secondSegmentsEnd_D.Difference(secondSegmentsStart_C);
            double     secondSegmentsLength    = secondSegmentsDirection.normalize();

            Vector2D vectorAC = secondSegmentsStart_C.Difference(firstSegmentsStart_A);
            Vector2D vectorAD = secondSegmentsEnd_D.Difference(firstSegmentsStart_A);

            if (VectorsAreLinearDependent(vectorAC, vectorAD))
            {
                double cos = firstSegmentsDirection.Dot(secondSegmentsDirection) / (firstsegmentsLength * secondSegmentsLength);

                if (cos < 0)
                {
                    firstSegmentsStart_A = firstSegmentsVertices[1];
                    firstSegmentsEnd_B   = firstSegmentsVertices[0];
                }

                vectorAC = secondSegmentsStart_C.Difference(firstSegmentsStart_A);
                Vector2D vectorDB = firstSegmentsEnd_B.Difference(secondSegmentsEnd_D);

                cos = vectorAC.Dot(vectorDB) / (vectorAC.normalize() * vectorDB.normalize());

                if (cos > 0)
                {
                    onTop = true;
                }
            }

            return(onTop);
        }