private static void InsertEntrance(InDoorGeneratorSettings settings, List <SkeletonEdge> walls, LineParametric2d ray, double minimalSideSize) { var doorEdge = default(SkeletonEdge); var distance = double.MaxValue; var intersectPoint = Vector2d.Empty; int i = -1; foreach (var edge in walls) { i++; if (edge.IsOuter && !edge.IsSkeleton) { continue; } var currIntersect = LineParametric2d.Collide(ray, edge.Line, 0.00001); if (currIntersect == Vector2d.Empty || !Vector2dUtils.IsPointOnSegment(edge.Start, edge.End, currIntersect)) { continue; } var currDistance = currIntersect.DistanceTo(ray.A); if (distance > currDistance /* && currDistance > minimalSideSize*/) { doorEdge = edge; distance = currDistance; intersectPoint = currIntersect; } } var startDist = Math.Min(distance, settings.Skeleton.Distances[doorEdge.Start]); var endDistance = Math.Min(distance, settings.Skeleton.Distances[doorEdge.End]); walls.Add(new SkeletonEdge(doorEdge.Start, intersectPoint, false, startDist, settings.HalfTransitAreaWidth)); walls.Add(new SkeletonEdge(intersectPoint, doorEdge.End, false, endDistance, settings.HalfTransitAreaWidth)); walls.Add(new SkeletonEdge(ray.A, intersectPoint, false, distance, settings.HalfTransitAreaWidth)); }