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); }
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); }