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