blob: 89979f08c5f6380cd97da0e6cd83d9efdbc8a575 [file] [log] [blame]
John Park91e69732019-03-03 13:12:43 -08001import cairo
2from color import Color, palette
3from constants import *
4import numpy as np
5
6
7def set_color(cr, color, a=1):
8 if color.a == 1.0:
9 cr.set_source_rgba(color.r, color.g, color.b, a)
10 else:
11 cr.set_source_rgba(color.r, color.g, color.b, color.a)
12
13
14def draw_px_cross(cr, x, y, length_px, color=palette["RED"]):
15 """Draws a cross with fixed dimensions in pixel space."""
16 set_color(cr, color)
17 cr.move_to(x, y - length_px)
18 cr.line_to(x, y + length_px)
19 cr.stroke()
20
21 cr.move_to(x - length_px, y)
22 cr.line_to(x + length_px, y)
23 cr.stroke()
24 set_color(cr, palette["WHITE"])
25
26
27def draw_px_x(cr, x, y, length_px1, color=palette["BLACK"]):
28 """Draws a x with fixed dimensions in pixel space."""
29 length_px = length_px1 / np.sqrt(2)
30 set_color(cr, color)
31 cr.move_to(x - length_px, y - length_px)
32 cr.line_to(x + length_px, y + length_px)
33 cr.stroke()
34
35 cr.move_to(x - length_px, y + length_px)
36 cr.line_to(x + length_px, y - length_px)
37 cr.stroke()
38 set_color(cr, palette["WHITE"])
39
40
41def draw_control_points(cr, points, width=10, radius=4, color=palette["BLUE"]):
42 for i in range(0, len(points)):
43 draw_px_x(cr, points[i][0], points[i][1], width, color)
44 set_color(cr, color)
45 cr.arc(points[i][0], points[i][1], radius, 0, 2.0 * np.pi)
46 cr.fill()
47 set_color(cr, palette["WHITE"])
48
49
50def display_text(cr, text, widtha, heighta, widthb, heightb):
51 cr.scale(widtha, -heighta)
52 cr.show_text(text)
53 cr.scale(widthb, -heightb)
54
55
56def draw_HAB(cr):
57 # BASE Constants
58 X_BASE = 0
59 Y_BASE = 0
60 R = 0.381 - .1
61 BACKWALL_X = X_BASE
62 LOADING_Y = mToPx(4.129151) - mToPx(0.696976)
63 # HAB Levels 2 and 3 called in variables backhab
64 # draw loading stations
65 cr.move_to(0, LOADING_Y)
66 cr.line_to(mToPx(0.6), LOADING_Y)
67 cr.move_to(mToPx(R), LOADING_Y)
68 cr.arc(mToPx(R), LOADING_Y, 5, 0, np.pi * 2.0)
69 cr.move_to(0, -1.0 * LOADING_Y)
70 cr.line_to(mToPx(0.6), -1.0 * LOADING_Y)
71 cr.move_to(mToPx(R), -1.0 * LOADING_Y)
72 cr.arc(mToPx(R), -1.0 * LOADING_Y, 5, 0, np.pi * 2.0)
73
74 # HAB Levels 2 and 3 called in variables backhab
75 WIDTH_BACKHAB = mToPx(1.2192)
76
77 Y_TOP_BACKHAB_BOX = Y_BASE + mToPx(0.6096)
78 BACKHAB_LV2_LENGTH = mToPx(1.016)
79
80 BACKHAB_LV3_LENGTH = mToPx(1.2192)
81 Y_LV3_BOX = Y_TOP_BACKHAB_BOX - BACKHAB_LV3_LENGTH
82
83 Y_BOTTOM_BACKHAB_BOX = Y_LV3_BOX - BACKHAB_LV2_LENGTH
84
85 # HAB LEVEL 1
86 X_LV1_BOX = BACKWALL_X + WIDTH_BACKHAB
87
88 WIDTH_LV1_BOX = mToPx(0.90805)
89 LENGTH_LV1_BOX = mToPx(1.6256)
90
91 Y_BOTTOM_LV1_BOX = Y_BASE - LENGTH_LV1_BOX
92
93 # Ramp off Level 1
94 X_RAMP = X_LV1_BOX
95
96 Y_TOP_RAMP = Y_BASE + LENGTH_LV1_BOX
97 WIDTH_TOP_RAMP = mToPx(1.20015)
98 LENGTH_TOP_RAMP = Y_BASE + mToPx(0.28306)
99
100 X_MIDDLE_RAMP = X_RAMP + WIDTH_LV1_BOX
101 Y_MIDDLE_RAMP = Y_BOTTOM_LV1_BOX
102 LENGTH_MIDDLE_RAMP = 2 * LENGTH_LV1_BOX
103 WIDTH_MIDDLE_RAMP = WIDTH_TOP_RAMP - WIDTH_LV1_BOX
104
105 Y_BOTTOM_RAMP = Y_BASE - LENGTH_LV1_BOX - LENGTH_TOP_RAMP
106
107 # Side Bars to Hold in balls
108 X_BARS = BACKWALL_X
109 WIDTH_BARS = WIDTH_BACKHAB
110 LENGTH_BARS = mToPx(0.574675)
111
112 Y_TOP_BAR = Y_TOP_BACKHAB_BOX + BACKHAB_LV2_LENGTH
113
114 Y_BOTTOM_BAR = Y_BOTTOM_BACKHAB_BOX - LENGTH_BARS
115
116 set_color(cr, palette["BLACK"])
117 cr.rectangle(BACKWALL_X, Y_TOP_BACKHAB_BOX, WIDTH_BACKHAB,
118 BACKHAB_LV2_LENGTH)
119 cr.rectangle(BACKWALL_X, Y_LV3_BOX, WIDTH_BACKHAB, BACKHAB_LV3_LENGTH)
120 cr.rectangle(BACKWALL_X, Y_BOTTOM_BACKHAB_BOX, WIDTH_BACKHAB,
121 BACKHAB_LV2_LENGTH)
122 cr.rectangle(X_LV1_BOX, Y_BASE, WIDTH_LV1_BOX, LENGTH_LV1_BOX)
123 cr.rectangle(X_LV1_BOX, Y_BOTTOM_LV1_BOX, WIDTH_LV1_BOX, LENGTH_LV1_BOX)
124 cr.rectangle(X_RAMP, Y_TOP_RAMP, WIDTH_TOP_RAMP, LENGTH_TOP_RAMP)
125 cr.rectangle(X_MIDDLE_RAMP, Y_MIDDLE_RAMP, WIDTH_MIDDLE_RAMP,
126 LENGTH_MIDDLE_RAMP)
127 cr.rectangle(X_RAMP, Y_BOTTOM_RAMP, WIDTH_TOP_RAMP, LENGTH_TOP_RAMP)
128 cr.rectangle(X_BARS, Y_TOP_BAR, WIDTH_BARS, LENGTH_BARS)
129 cr.rectangle(X_BARS, Y_BOTTOM_BAR, WIDTH_BARS, LENGTH_BARS)
130 cr.stroke()
131
132 cr.set_line_join(cairo.LINE_JOIN_ROUND)
133
134 cr.stroke()
135
136 #draw 0, 0
137 set_color(cr, palette["BLACK"])
138 cr.move_to(0, 0)
139 cr.line_to(0, 0 + mToPx(8.2296 / 2.0))
140 cr.move_to(0, 0)
141 cr.line_to(0, 0 + mToPx(-8.2296 / 2.0))
142 cr.move_to(0, 0)
143 cr.line_to(0 + mToPx(8.2296), 0)
144
145 cr.stroke()
146
147
148def draw_rockets(cr):
149 # BASE Constants
150 X_BASE = mToPx(2.41568)
151 Y_BASE = 0
152 # Robot longitudinal radius
153 R = 0.381
154 near_side_rocket_center = [
155 X_BASE + mToPx((2.89973 + 3.15642) / 2.0), Y_BASE + mToPx(
156 (3.86305 + 3.39548) / 2.0)
157 ]
158 middle_rocket_center = [
159 X_BASE + mToPx((3.15642 + 3.6347) / 2.0), Y_BASE + mToPx(
160 (3.39548 + 3.392380) / 2.0)
161 ]
162 far_side_rocket_center = [
163 X_BASE + mToPx((3.63473 + 3.89984) / 2.0), Y_BASE + mToPx(
164 (3.39238 + 3.86305) / 2.0)
165 ]
166
167 cr.move_to(near_side_rocket_center[0], near_side_rocket_center[1])
168 cr.line_to(near_side_rocket_center[0] - 0.8 * mToPx(0.866),
169 near_side_rocket_center[1] - 0.8 * mToPx(0.5))
170 cr.move_to(near_side_rocket_center[0] - R * mToPx(0.866),
171 near_side_rocket_center[1] - R * mToPx(0.5))
172 cr.arc(near_side_rocket_center[0] - R * mToPx(0.866),
173 near_side_rocket_center[1] - R * mToPx(0.5), 5, 0, np.pi * 2.0)
174
175 cr.move_to(middle_rocket_center[0], middle_rocket_center[1])
176 cr.line_to(middle_rocket_center[0], middle_rocket_center[1] - mToPx(0.8))
177 cr.move_to(middle_rocket_center[0], middle_rocket_center[1] - mToPx(R))
178 cr.arc(middle_rocket_center[0], middle_rocket_center[1] - mToPx(R), 5, 0,
179 np.pi * 2.0)
180
181 cr.move_to(far_side_rocket_center[0], far_side_rocket_center[1])
182 cr.line_to(far_side_rocket_center[0] + 0.8 * mToPx(0.866),
183 far_side_rocket_center[1] - 0.8 * mToPx(0.5))
184 cr.move_to(far_side_rocket_center[0] + R * mToPx(0.866),
185 far_side_rocket_center[1] - R * mToPx(0.5))
186 cr.arc(far_side_rocket_center[0] + R * mToPx(0.866),
187 far_side_rocket_center[1] - R * mToPx(0.5), 5, 0, np.pi * 2.0)
188
189 #print(far_side_rocket_center)
190 near_side_rocket_center = [
191 X_BASE + mToPx((2.89973 + 3.15642) / 2.0), Y_BASE - mToPx(
192 (3.86305 + 3.39548) / 2.0)
193 ]
194 middle_rocket_center = [
195 X_BASE + mToPx((3.15642 + 3.6347) / 2.0), Y_BASE - mToPx(
196 (3.39548 + 3.392380) / 2.0)
197 ]
198 far_side_rocket_center = [
199 X_BASE + mToPx((3.63473 + 3.89984) / 2.0), Y_BASE - mToPx(
200 (3.39238 + 3.86305) / 2.0)
201 ]
202
203 cr.move_to(near_side_rocket_center[0], near_side_rocket_center[1])
204 cr.line_to(near_side_rocket_center[0] - 0.8 * mToPx(0.866),
205 near_side_rocket_center[1] + 0.8 * mToPx(0.5))
206
207 cr.move_to(middle_rocket_center[0], middle_rocket_center[1])
208 cr.line_to(middle_rocket_center[0], middle_rocket_center[1] + mToPx(0.8))
209
210 cr.move_to(far_side_rocket_center[0], far_side_rocket_center[1])
211 cr.line_to(far_side_rocket_center[0] + 0.8 * mToPx(0.866),
212 far_side_rocket_center[1] + 0.8 * mToPx(0.5))
213
214 # Leftmost Line
215 cr.move_to(X_BASE + mToPx(2.89973), Y_BASE + mToPx(3.86305))
216 cr.line_to(X_BASE + mToPx(3.15642), Y_BASE + mToPx(3.39548))
217
218 # Top Line
219 cr.move_to(X_BASE + mToPx(3.15642), Y_BASE + mToPx(3.39548))
220 cr.line_to(X_BASE + mToPx(3.63473), Y_BASE + mToPx(3.39238))
221
222 #Rightmost Line
223 cr.move_to(X_BASE + mToPx(3.63473), Y_BASE + mToPx(3.39238))
224 cr.line_to(X_BASE + mToPx(3.89984), Y_BASE + mToPx(3.86305))
225
226 #Back Line
227 cr.move_to(X_BASE + mToPx(2.89973), Y_BASE + mToPx(3.86305))
228 cr.line_to(X_BASE + mToPx(3.89984), Y_BASE + mToPx(3.86305))
229
230 # Bottom Rocket
231 # Leftmost Line
232 cr.move_to(X_BASE + mToPx(2.89973), Y_BASE - mToPx(3.86305))
233 cr.line_to(X_BASE + mToPx(3.15642), Y_BASE - mToPx(3.39548))
234
235 # Top Line
236 cr.move_to(X_BASE + mToPx(3.15642), Y_BASE - mToPx(3.39548))
237 cr.line_to(X_BASE + mToPx(3.63473), Y_BASE - mToPx(3.39238))
238
239 #Rightmost Line
240 cr.move_to(X_BASE + mToPx(3.63473), Y_BASE - mToPx(3.39238))
241 cr.line_to(X_BASE + mToPx(3.89984), Y_BASE - mToPx(3.86305))
242
243 #Back Line
244 cr.move_to(X_BASE + mToPx(2.89973), Y_BASE - mToPx(3.86305))
245 cr.line_to(X_BASE + mToPx(3.89984), Y_BASE - mToPx(3.86305))
246
247 cr.stroke()
248
249
250def draw_cargo_ship(cr):
251 # BASE Constants
252 X_BASE = 0 + mToPx(5.59435)
253 Y_BASE = 0 + 0 #mToPx(4.129151)
254 R = 0.381 - 0.1
255
256 FRONT_PEG_DELTA_Y = mToPx(0.276352)
257 cr.move_to(X_BASE, Y_BASE + FRONT_PEG_DELTA_Y)
258 cr.line_to(X_BASE - mToPx(0.8), Y_BASE + FRONT_PEG_DELTA_Y)
259
260 cr.move_to(X_BASE, Y_BASE + FRONT_PEG_DELTA_Y)
261 cr.arc(X_BASE - mToPx(R), Y_BASE + FRONT_PEG_DELTA_Y, 5, 0, np.pi * 2.0)
262
263 cr.move_to(X_BASE, Y_BASE - FRONT_PEG_DELTA_Y)
264 cr.line_to(X_BASE - mToPx(0.8), Y_BASE - FRONT_PEG_DELTA_Y)
265
266 cr.move_to(X_BASE, Y_BASE - FRONT_PEG_DELTA_Y)
267 cr.arc(X_BASE - mToPx(R), Y_BASE - FRONT_PEG_DELTA_Y, 5, 0, np.pi * 2.0)
268
269 SIDE_PEG_Y = mToPx(1.41605 / 2.0)
270 SIDE_PEG_X = X_BASE + mToPx(1.148842)
271 SIDE_PEG_DX = mToPx(0.55245)
272
273 cr.move_to(SIDE_PEG_X, SIDE_PEG_Y)
274 cr.line_to(SIDE_PEG_X, SIDE_PEG_Y + mToPx(0.8))
275 cr.move_to(SIDE_PEG_X, SIDE_PEG_Y + mToPx(R))
276 cr.arc(SIDE_PEG_X, SIDE_PEG_Y + mToPx(R), 5, 0, np.pi * 2.0)
277
278 cr.move_to(SIDE_PEG_X + SIDE_PEG_DX, SIDE_PEG_Y)
279 cr.line_to(SIDE_PEG_X + SIDE_PEG_DX, SIDE_PEG_Y + mToPx(0.8))
280 cr.move_to(SIDE_PEG_X + SIDE_PEG_DX, SIDE_PEG_Y + mToPx(R))
281 cr.arc(SIDE_PEG_X + SIDE_PEG_DX, SIDE_PEG_Y + mToPx(R), 5, 0, np.pi * 2.0)
282
283 cr.move_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, SIDE_PEG_Y)
284 cr.line_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, SIDE_PEG_Y + mToPx(0.8))
285 cr.move_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, SIDE_PEG_Y + mToPx(R))
286 cr.arc(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, SIDE_PEG_Y + mToPx(R), 5, 0,
287 np.pi * 2.0)
288
289 cr.move_to(SIDE_PEG_X, -1.0 * SIDE_PEG_Y)
290 cr.line_to(SIDE_PEG_X, -1.0 * SIDE_PEG_Y - mToPx(0.8))
291 cr.move_to(SIDE_PEG_X, -1.0 * SIDE_PEG_Y - mToPx(R))
292 cr.arc(SIDE_PEG_X, -1.0 * SIDE_PEG_Y - mToPx(R), 5, 0, np.pi * 2.0)
293
294 cr.move_to(SIDE_PEG_X + SIDE_PEG_DX, -1.0 * SIDE_PEG_Y)
295 cr.line_to(SIDE_PEG_X + SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(0.8))
296 cr.move_to(SIDE_PEG_X + SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(R))
297 cr.arc(SIDE_PEG_X + SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(R), 5, 0,
298 np.pi * 2.0)
299
300 cr.move_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, -1.0 * SIDE_PEG_Y)
301 cr.line_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(0.8))
302 cr.move_to(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(R))
303 cr.arc(SIDE_PEG_X + 2.0 * SIDE_PEG_DX, -1.0 * SIDE_PEG_Y - mToPx(R), 5, 0,
304 np.pi * 2.0)
305
306 cr.rectangle(X_BASE, Y_BASE - mToPx(1.41605 / 2.0), mToPx(2.43205),
307 mToPx(1.41605))
308 cr.stroke()
309
310
311def draw_points(cr, p, size):
312 for i in range(0, len(p)):
313 draw_px_cross(cr, p[i][0], p[i][1], size,
314 Color(0, np.sqrt(0.2 * i), 0))