Пример #1
0
        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));
        }