Ejemplo n.º 1
0
        public void ConvertFromHyperstreamlineToHalfEdgeMesh()
        {
            var           r      = new Random();
            Func <double> random = r.NextDouble;
            var           m      = new NamedBoxCollection();

            //Deserialize config
            var config = NetworkDescriptor.Deserialize(new StringReader(SCRIPT));

            //Build main roads
            var builder = new NetworkBuilder();

            builder.Build(config.Major(random, m), random, m, new Vector2(0, 0), new Vector2(100, 100));
            builder.Reduce();

            //extract regions
            var regions = builder.Regions();

            //Build minor roads
            foreach (var region in regions)
            {
                builder.Build(config.Minor(random, m), random, m, region);
            }
            builder.Reduce();

            //Build graph
            Mesh <IVertexBuilder, IHalfEdgeBuilder, IFaceBuilder> mesh = new Mesh <IVertexBuilder, IHalfEdgeBuilder, IFaceBuilder>();

            //Extract vertices
            var result = builder.Result;
            Dictionary <Vector2, Vertex> vertices = result.Vertices.ToDictionary(v => v.Position, v => v);

            //Useful data
            var road = 3; //HierarchicalParameters.RoadLaneWidth(Random);
            var path = 1; //HierarchicalParameters.RoadSidewalkWidth(Random);

            //Create blocks
            var blocks = builder.Regions();

            foreach (var block in blocks)
            {
                var face = mesh.GetOrConstructFace(block.Vertices.Select(mesh.GetOrConstructVertex).ToArray());

                //Tags edges of face with road width
                foreach (var primaryEdge in face.Edges.Select(e => e.IsPrimaryEdge ? e : e.Pair))
                {
                    if (primaryEdge.Tag != null)
                    {
                        continue;
                    }

                    var start = vertices[primaryEdge.Pair.EndVertex.Position];
                    var end   = vertices[primaryEdge.EndVertex.Position];
                    var edge  = start.Edges.FirstOrDefault(a => Equals(a.B, end));

                    primaryEdge.Tag = new HalfEdgeRoadBuilder(primaryEdge, road, path, edge == null ? 1u : edge.Streamline.Width);
                }
            }
        }
Ejemplo n.º 2
0
        public void NetworkBuilder_GeneratesMinorRoads()
        {
            var c = NetworkDescriptor.Deserialize(new StringReader(@"
!Network
Aliases:
    - &base-field !AddTensors
      Tensors:
        - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0 }, Decay: 2.5, Center: { X: 0, Y: 0 } }
        - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45 }, Decay: 2.5, Center: { X: 1, Y: 0 } }
        - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45 }, Decay: 2.5, Center: { X: 0, Y: 1 } }
        - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0 }, Decay: 2.5, Center: { X: 1, Y: 1 } }

Major:
    MergeSearchAngle: 22.5
    MergeDistance: 25
    SegmentLength: 10
    RoadWidth: !NormalValue { Min: 2, Max: 4, Vary: true }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 50 }
    TensorField: *base-field

Minor:
    MergeSearchAngle: 12.5
    MergeDistance: 2.5
    SegmentLength: 2
    RoadWidth: !NormalValue { Min: 1, Max: 2, Vary: true }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 25 }
    TensorField:
        !WeightedAverage
        Tensors:
            0.1: *base-field
            0.9: !Grid { Angle: !UniformValue { Min: 1, Max: 360, Vary: true } }
"));

            Random         r = new Random(12);
            NetworkBuilder b = new NetworkBuilder();
            var            m = new NamedBoxCollection();

            b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(100, 100));
            b.Reduce();

            var regions = b.Regions();

            foreach (var region in regions)
            {
                b.Build(c.Minor(r.NextDouble, m), r.NextDouble, m, region);
            }

            Console.WriteLine(b.Result.ToSvg());

            Assert.IsFalse(b.Result.Vertices.GroupBy(a => a.Position).Any(a => a.Count() > 1));
        }
Ejemplo n.º 3
0
        public void Demo()
        {
            var c = NetworkDescriptor.Deserialize(new StringReader(@"
!Network
Aliases:
    - &base-field !AddTensors
      Tensors:
        - !PointDistanceDecayTensors { Tensors: !Radial { Center: { X: 1, Y: 1 } }, Decay: 1.6, Center: { X: 0.45, Y: 0.45 } }
        - !Polyline
          Decay: 5
          Points: [ { X: 0.3, Y: 0 }, { X: 0.1, Y: 0.33 }, { X: 0.5, Y: 0.66 }, { X: 0.2, Y: 1 } ]

Major:
    MergeSearchAngle: 22.5
    MergeDistance: 25
    SegmentLength: 10
    RoadWidth: !NormalValue { Min: 2, Max: 3, Vary: false }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 50 }
    TensorField: *base-field

Minor:
    MergeSearchAngle: 12.5
    MergeDistance: 2.5
    SegmentLength: 2
    RoadWidth: 1
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 15 }
    TensorField:
        !WeightedAverage
        Tensors:
            0.9: *base-field
            0.1: !Grid { Angle: !UniformValue { Min: 1, Max: 360, Vary: true } }

"));

            NetworkBuilder b = new NetworkBuilder();

            Random r = new Random(24);
            var    m = new NamedBoxCollection();

            b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(350, 350));
            b.Reduce();

            var regions = b.Regions();

            foreach (var region in regions)
            {
                b.Build(c.Minor(r.NextDouble, m), r.NextDouble, m, region);
            }

            Console.WriteLine(b.Result.ToSvg(regions));
        }
        public void NetworkConfiguration_CanDeserialize()
        {
            var d = NetworkDescriptor.Deserialize(new StringReader(@"
!Network
Major:
    MergeSearchAngle: 22.5
    MergeDistance: 25
    SegmentLength: 10
    RoadWidth: !UniformValue { Min: 1, Max: 3 }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 50 }
    TensorField: !AddTensors
        Tensors:
            - !PointDistanceDecayTensors { Tensors: !Radial { Center: { X: 0.45, Y: 0.45 } }, Decay: 0.00008, Center: { X: 0.45, Y: 0.45 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 10, Length: 1 }, Decay: 0.000025, Center: { X: 0, Y: 0 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 20, Length: 1 }, Decay: 0.000025, Center: { X: 1, Y: 0 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 30, Length: 1 }, Decay: 0.000025, Center: { X: 0, Y: 1 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 40, Length: 1 }, Decay: 0.000025, Center: { X: 1, Y: 1 } }
            - !Polyline
                Decay: 0.000025
                Points:
                    - { X: 0.15, Y: 0 }
                    - { X: 0.07, Y: 0.25 }
                    - { X: 0.1, Y: 0.45 }
                    - { X: 0.3, Y: 1 }

Minor:
    TensorField: !Grid { Angle: 0, Length: 1 }
"));

            var c = d.Major(() => 1, new NamedBoxCollection());

            Assert.AreEqual(22.5f, c.SearchConeAngle.ToDegrees(), 0.001f);
            Assert.AreEqual(25f, c.MergeDistance);
            Assert.AreEqual(10f, c.SegmentLength);

            var w = c.RoadWidth.SelectFloatValue(() => 1, new NamedBoxCollection());

            Assert.IsTrue(w >= 1 && w <= 3);

            Assert.IsInstanceOfType(c.PriorityField, typeof(Constant));
            Assert.IsInstanceOfType(c.SeparationField, typeof(Constant));
        }
Ejemplo n.º 5
0
        public void NetworkBuilder_GeneratesRegions()
        {
            var c = NetworkDescriptor.Deserialize(new StringReader(@"
!Network
Major:
    MergeSearchAngle: 22.5
    MergeDistance: 25
    SegmentLength: 10
    RoadWidth: !NormalValue { Min: 1, Max: 10, Vary: true }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 50 }
    TensorField:
        !AddTensors
        Tensors:
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0, Length: 1 }, Decay: 2.5, Center: { X: 0, Y: 0 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45, Length: 1 }, Decay: 2.5, Center: { X: 1, Y: 0 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45, Length: 1 }, Decay: 2.5, Center: { X: 0, Y: 1 } }
            - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0, Length: 1 }, Decay: 2.5, Center: { X: 1, Y: 1 } }

Minor:
    MergeSearchAngle: 12.5
    MergeDistance: 2.5
    SegmentLength: 2
    RoadWidth: 1
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 15 }
    TensorField: !Grid { Angle: 0, Length: 1 }
"));

            NetworkBuilder b = new NetworkBuilder();

            Random r = new Random(10);
            var    m = new NamedBoxCollection();

            b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(500, 500));
            b.Reduce();

            var regions = b.Regions();

            Console.WriteLine(b.Result.ToSvg(regions));
        }
Ejemplo n.º 6
0
        public void NetworkBuilder_CanHaveRngEverywhere()
        {
            var c = NetworkDescriptor.Deserialize(new StringReader(@"
!Network
Aliases:
    - &base-field !AddTensors
      Tensors:
        - !PointDistanceDecayTensors {
            Tensors: !Grid { Angle: !ConstantValue { Value: 0 } },
            Decay: !ConstantValue { Value: 2.5 },
            Center: { X: !ConstantValue { Value: 0 }, Y: !ConstantValue { Value: 0 } }
        }

Major:
    MergeSearchAngle: !ConstantValue { Value: 22.5 }
    MergeDistance: !ConstantValue { Value: 25 }
    SegmentLength: !ConstantValue { Value: 10 }
    RoadWidth: !NormalValue { Min: 2, Max: 4, Vary: true }
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 50 }
    TensorField: *base-field

Minor:
    MergeSearchAngle: 12.5
    MergeDistance: 2.5
    SegmentLength: 2
    RoadWidth: 1
    PriorityField: !ConstantScalars { Value: 1 }
    SeparationField: !ConstantScalars { Value: 15 }
    TensorField: *base-field
"));

            Random         r = new Random(10);
            NetworkBuilder b = new NetworkBuilder();
            var            m = new NamedBoxCollection();

            var maj = c.Major(r.NextDouble, m);
        }