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