blob: b52eee80755e090ab6c39c7cb19687e59148ac25 [file] [log] [blame]
Alex Perry554cec02019-03-23 20:15:12 -07001import {IN_TO_M, FT_TO_M} from './constants';
2
3const CENTER_FIELD_X = 27 * FT_TO_M + 1.125 * IN_TO_M;
4
5const FAR_CARGO_X = CENTER_FIELD_X - 20.875 * IN_TO_M;
6const MID_CARGO_X = FAR_CARGO_X - 21.75 * IN_TO_M;
7const NEAR_CARGO_X = MID_CARGO_X - 21.75 * IN_TO_M;
8const SIDE_CARGO_Y = (24 + 3 + 0.875) * IN_TO_M;
9const SIDE_CARGO_THETA = -Math.PI / 2;
10
11const FACE_CARGO_X = CENTER_FIELD_X - (7 * 12 + 11.75 + 9) * IN_TO_M;
12const FACE_CARGO_Y = (10.875) * IN_TO_M;
13const FACE_CARGO_THETA = 0;
14
15const ROCKET_X = CENTER_FIELD_X - 8 * FT_TO_M;
16const ROCKET_Y = (26 * 12 + 10.5) / 2.0 * IN_TO_M;
17
18const ROCKET_PORT_X = ROCKET_X;
19const ROCKET_PORT_Y = ROCKET_Y - 0.7;
20const ROCKET_PORT_THETA = Math.PI / 2;
21
22const ROCKET_HATCH_X_OFFSET = 14.634 * IN_TO_M;
23const ROCKET_HATCH_Y = ROCKET_PORT_Y + 9.326 * IN_TO_M;
24const ROCKET_NEAR_X = ROCKET_X - ROCKET_HATCH_X_OFFSET;
25const ROCKET_FAR_X = ROCKET_X + ROCKET_HATCH_X_OFFSET;
26const ROCKET_NEAR_THETA = -28.5 * 180 / Math.PI;
27const ROCKET_FAR_THETA = Math.PI - ROCKET_NEAR_THETA;
28
29const HP_Y = ((26 * 12 + 10.5) / 2 - 25.9) * IN_TO_M;
30const HP_THETA = Math.PI;
31
Alex Perryb2433462019-03-26 21:45:26 -070032const HAB_LENGTH = 4 * FT_TO_M;
33const HALF_HAB_3_WIDTH = 2 * FT_TO_M;
34const HAB_2_WIDTH = (3 * 12 + 4) * IN_TO_M;
35const HALF_HAB_1_WIDTH = (6 * 12 + 3.25) * IN_TO_M;
36const HAB_1_LENGTH = (3 * 12 + 11.25) * IN_TO_M;
37
38const DEPOT_WIDTH = (12 + 10.625) * IN_TO_M;
39
Alex Perry554cec02019-03-23 20:15:12 -070040export function drawField(ctx : CanvasRenderingContext2D) : void {
41 drawTargets(ctx);
Alex Perryb2433462019-03-26 21:45:26 -070042 drawHab(ctx);
Alex Perry554cec02019-03-23 20:15:12 -070043}
44
45function drawHab(ctx : CanvasRenderingContext2D) : void {
Alex Perryb2433462019-03-26 21:45:26 -070046 drawHalfHab(ctx);
47 ctx.save();
48
49 ctx.scale(1, -1);
50 drawHalfHab(ctx);
51
52 ctx.restore();
53}
54
55function drawHalfHab(ctx : CanvasRenderingContext2D) : void {
56 ctx.fillStyle = 'rgb(50, 50, 50)';
57 ctx.fillRect(0, 0, HAB_LENGTH, HALF_HAB_3_WIDTH);
58 ctx.fillStyle = 'rgb(100, 100, 100)';
59 ctx.fillRect(0, HALF_HAB_3_WIDTH, HAB_LENGTH, HAB_2_WIDTH);
60 ctx.fillStyle = 'rgb(200, 200, 200)';
61 ctx.fillRect(HAB_LENGTH, 0, HAB_1_LENGTH, HALF_HAB_1_WIDTH);
62 ctx.strokeRect(0, HALF_HAB_3_WIDTH + HAB_2_WIDTH, HAB_LENGTH, DEPOT_WIDTH);
Alex Perry554cec02019-03-23 20:15:12 -070063}
64
65function drawTargets(ctx : CanvasRenderingContext2D) : void {
66 drawHalfCargo(ctx);
67 drawRocket(ctx);
68 drawHP(ctx);
69 ctx.save();
70
71 ctx.scale(1, -1);
72 drawHalfCargo(ctx);
73 drawRocket(ctx);
74 drawHP(ctx);
75
76 ctx.restore();
77}
78
79function drawHP(ctx : CanvasRenderingContext2D) : void {
Alex Perryd2df9652019-03-23 22:53:04 -070080 drawTarget(ctx, 0, HP_Y, HP_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070081}
82
83function drawRocket(ctx : CanvasRenderingContext2D) : void {
Alex Perryd2df9652019-03-23 22:53:04 -070084 drawTarget(ctx, ROCKET_PORT_X, ROCKET_PORT_Y, ROCKET_PORT_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070085
Alex Perryd2df9652019-03-23 22:53:04 -070086 drawTarget(ctx, ROCKET_NEAR_X, ROCKET_HATCH_Y, ROCKET_NEAR_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070087
Alex Perryd2df9652019-03-23 22:53:04 -070088 drawTarget(ctx, ROCKET_FAR_X, ROCKET_HATCH_Y, ROCKET_FAR_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070089}
90
91function drawHalfCargo(ctx : CanvasRenderingContext2D) : void {
Alex Perryd2df9652019-03-23 22:53:04 -070092 drawTarget(ctx, FAR_CARGO_X, SIDE_CARGO_Y, SIDE_CARGO_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070093
Alex Perryd2df9652019-03-23 22:53:04 -070094 drawTarget(ctx, MID_CARGO_X, SIDE_CARGO_Y, SIDE_CARGO_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070095
Alex Perryd2df9652019-03-23 22:53:04 -070096 drawTarget(ctx, NEAR_CARGO_X, SIDE_CARGO_Y, SIDE_CARGO_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070097
Alex Perryd2df9652019-03-23 22:53:04 -070098 drawTarget(ctx, FACE_CARGO_X, FACE_CARGO_Y, FACE_CARGO_THETA);
Alex Perry554cec02019-03-23 20:15:12 -070099}
100
Alex Perryd2df9652019-03-23 22:53:04 -0700101export function drawTarget(ctx : CanvasRenderingContext2D, x: number, y: number, theta: number) : void {
102 ctx.save();
103 ctx.translate(x, y);
104 ctx.rotate(theta);
105
106 ctx.beginPath();
Alex Perry554cec02019-03-23 20:15:12 -0700107 ctx.moveTo(0, -0.15);
108 ctx.lineTo(0, 0.15);
109 ctx.moveTo(0, 0);
110 ctx.lineTo(-0.15, 0);
Alex Perry554cec02019-03-23 20:15:12 -0700111 ctx.stroke();
Alex Perryd2df9652019-03-23 22:53:04 -0700112
113 ctx.restore();
Alex Perry554cec02019-03-23 20:15:12 -0700114}