1 """Generate simple JSON scenario.
3 The scenario contains at least:
5 - `init` -- the init car position,
7 - `slot` -- the parking slot,
9 - `obst` -- the list of (convex polygon) obstacles.
11 from json import dumps
12 from math import cos, pi, sin
13 from random import random, uniform
19 MTR = ((CTC / 2)**2 - WB**2)**0.5 - W / 2
28 """Generate car init position."""
29 # TODO if changed, change ``gen_slot`` accordingly
33 def gen_slot_at(x, y, h, parallel=True):
34 """Generate slot at specified coordinates."""
44 x + length/2 * cos(h - pi/2 * right),
45 y + length/2 * sin(h - pi/2 * right),
48 x + width * cos(h) + length/2 * cos(h - pi/2 * right),
49 y + width * sin(h) + length/2 * sin(h - pi/2 * right),
52 x + width * cos(h) + length/2 * cos(h + pi/2 * right),
53 y + width * sin(h) + length/2 * sin(h + pi/2 * right),
56 x + length/2 * cos(h + pi/2 * right),
57 y + length/2 * sin(h + pi/2 * right),
63 x + width/2 * cos(h - pi/2 * right),
64 y + width/2 * sin(h - pi/2 * right),
67 x + length * cos(h) + width/2 * cos(h - pi/2 * right),
68 y + length * sin(h) + width/2 * sin(h - pi/2 * right),
71 x + length * cos(h) + width/2 * cos(h + pi/2 * right),
72 y + length * sin(h) + width/2 * sin(h + pi/2 * right),
75 x + width/2 * cos(h + pi/2 * right),
76 y + width/2 * sin(h + pi/2 * right),
81 def gen_slot(l=5.3, w=2.4):
82 """Generate parking slot."""
83 parallel = True if random() < 0.5 else False
84 if parallel and l == 5.3 and w == 2.4:
91 right = 1.0 if random() < 0.5 else -1.0
93 angl = uniform(0, 2 * pi)
96 h = uniform(0, 2 * pi)
100 x + l/2 * cos(h - pi/2 * right),
101 y + l/2 * sin(h - pi/2 * right),
104 x + w * cos(h) + l/2 * cos(h - pi/2 * right),
105 y + w * sin(h) + l/2 * sin(h - pi/2 * right),
108 x + w * cos(h) + l/2 * cos(h + pi/2 * right),
109 y + w * sin(h) + l/2 * sin(h + pi/2 * right),
112 x + l/2 * cos(h + pi/2 * right),
113 y + l/2 * sin(h + pi/2 * right),
119 x + w/2 * cos(h - pi/2 * right),
120 y + w/2 * sin(h - pi/2 * right),
123 x + l * cos(h) + w/2 * cos(h - pi/2 * right),
124 y + l * sin(h) + w/2 * sin(h - pi/2 * right),
127 x + l * cos(h) + w/2 * cos(h + pi/2 * right),
128 y + l * sin(h) + w/2 * sin(h + pi/2 * right),
131 x + w/2 * cos(h + pi/2 * right),
132 y + w/2 * sin(h + pi/2 * right),
137 def gen_obst_at(x, y, h):
138 """Generate obstacle at specific coordinates."""
143 x + width/2 * cos(h - pi/2) + length/2 * cos(h),
144 y + width/2 * sin(h - pi/2) + length/2 * sin(h),
147 x + width/2 * cos(h - pi/2) - length/2 * cos(h),
148 y + width/2 * sin(h - pi/2) - length/2 * sin(h),
151 x + width/2 * cos(h + pi/2) - length/2 * cos(h),
152 y + width/2 * sin(h + pi/2) - length/2 * sin(h),
155 x + width/2 * cos(h + pi/2) + length/2 * cos(h),
156 y + width/2 * sin(h + pi/2) + length/2 * sin(h),
159 x + width/2 * cos(h - pi/2) + length/2 * cos(h),
160 y + width/2 * sin(h - pi/2) + length/2 * sin(h),
165 """Generate obstacles array."""
167 min_r = ((W/2)**2 + ((WB+L)/2)**2)**0.5 + (OBST_W**2 + OBST_L**2)**0.5 / 2
168 for i in range(OBST_COUNT):
171 angl = uniform(0, 2 * pi)
172 r = uniform(min_r**2, (SLOT_RADI - 5)**2)**0.5
175 h = uniform(0, 2 * pi)
178 x + w/2 * cos(h - pi/2) + l/2 * cos(h),
179 y + w/2 * sin(h - pi/2) + l/2 * sin(h),
182 x + w/2 * cos(h - pi/2) - l/2 * cos(h),
183 y + w/2 * sin(h - pi/2) - l/2 * sin(h),
186 x + w/2 * cos(h + pi/2) - l/2 * cos(h),
187 y + w/2 * sin(h + pi/2) - l/2 * sin(h),
190 x + w/2 * cos(h + pi/2) + l/2 * cos(h),
191 y + w/2 * sin(h + pi/2) + l/2 * sin(h),
194 x + w/2 * cos(h - pi/2) + l/2 * cos(h),
195 y + w/2 * sin(h - pi/2) + l/2 * sin(h),
201 if __name__ == "__main__":