1 package org.opentrafficsim.road.network.lane;
2
3 import java.util.Map;
4
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.djutils.draw.curve.OffsetCurve2d;
8 import org.djutils.draw.curve.Straight2d;
9 import org.djutils.draw.function.ContinuousPiecewiseLinearFunction;
10 import org.djutils.draw.line.PolyLine2d;
11 import org.djutils.draw.line.Polygon2d;
12 import org.djutils.draw.point.Point2d;
13 import org.djutils.exceptions.Try;
14 import org.opentrafficsim.core.gtu.GtuType;
15
16
17
18
19
20
21
22
23
24
25
26
27 public final class LaneGeometryUtil
28 {
29
30
31
32
33 private LaneGeometryUtil()
34 {
35
36 }
37
38
39
40
41
42
43
44 public static Polygon2d getContour(final PolyLine2d leftEdge, final PolyLine2d rightEdge)
45 {
46 Point2d[] points = new Point2d[leftEdge.size() + rightEdge.size() + 1];
47 System.arraycopy(leftEdge.getPointList().toArray(), 0, points, 0, leftEdge.size());
48 System.arraycopy(rightEdge.reverse().getPointList().toArray(), 0, points, leftEdge.size(), rightEdge.size());
49 points[points.length - 1] = points[0];
50 return new Polygon2d(points);
51 }
52
53
54
55
56
57
58
59
60
61
62
63 public static Lane createStraightLane(final CrossSectionLink link, final String id, final Length offset, final Length width,
64 final LaneType laneType, final Map<GtuType, Speed> speedLimits)
65 {
66 return createStraightLane(link, id, offset, offset, width, width, laneType, speedLimits);
67 }
68
69
70
71
72
73
74
75
76
77
78
79
80
81 public static Lane createStraightLane(final CrossSectionLink link, final String id, final Length startOffset,
82 final Length endOffset, final Length startWidth, final Length endWidth, final LaneType laneType,
83 final Map<GtuType, Speed> speedLimits)
84 {
85 ContinuousPiecewiseLinearFunction offset = ContinuousPiecewiseLinearFunction.of(0.0, startOffset.si, 1.0, endOffset.si);
86 ContinuousPiecewiseLinearFunction width = ContinuousPiecewiseLinearFunction.of(0.0, startWidth.si, 1.0, endWidth.si);
87 return createStraightLane(link, id, offset, width, laneType, speedLimits);
88 }
89
90
91
92
93
94
95
96
97
98
99
100 public static Lane createStraightLane(final CrossSectionLink link, final String id,
101 final ContinuousPiecewiseLinearFunction offset, final ContinuousPiecewiseLinearFunction width,
102 final LaneType laneType, final Map<GtuType, Speed> speedLimits)
103 {
104 OffsetCurve2d designLine = new Straight2d(link.getDesignLine().getLocationPointFraction(0.0), link.getLength().si);
105 return Try.assign(
106 () -> new Lane(link, id, CrossSectionGeometry.of(designLine, null, offset, width), laneType, speedLimits),
107 "Network exception.");
108 }
109
110
111
112
113
114
115
116
117
118
119 public static Stripe createStraightStripe(final StripeData type, final String id, final CrossSectionLink link,
120 final Length offset, final Length width)
121 {
122 OffsetCurve2d designLine = new Straight2d(link.getDesignLine().getLocationPointFraction(0.0), link.getLength().si);
123 ContinuousPiecewiseLinearFunction offsetFunc = ContinuousPiecewiseLinearFunction.of(0.0, offset.si, 1.0, offset.si);
124 ContinuousPiecewiseLinearFunction widthFunc = ContinuousPiecewiseLinearFunction.of(0.0, width.si, 1.0, width.si);
125 return Try.assign(() -> new Stripe(id, type, link, CrossSectionGeometry.of(designLine, null, offsetFunc, widthFunc)),
126 "Network exception.");
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140 public static Object createStraightShoulder(final CrossSectionLink link, final String id, final Length startOffset,
141 final Length endOffset, final Length startWidth, final Length endWidth, final LaneType laneType)
142 {
143 OffsetCurve2d designLine = new Straight2d(link.getDesignLine().getLocationPointFraction(0.0), link.getLength().si);
144 ContinuousPiecewiseLinearFunction offset = ContinuousPiecewiseLinearFunction.of(0.0, startOffset.si, 1.0, endOffset.si);
145 ContinuousPiecewiseLinearFunction width = ContinuousPiecewiseLinearFunction.of(0.0, startWidth.si, 1.0, endWidth.si);
146 return Try.assign(() -> new Shoulder(link, id, CrossSectionGeometry.of(designLine, null, offset, width), laneType),
147 "Network exception.");
148 }
149 }