-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib_launch_geo.ks
More file actions
107 lines (87 loc) · 2.92 KB
/
lib_launch_geo.ks
File metadata and controls
107 lines (87 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
@LAZYGLOBAL OFF. // #include init
GLOBAL HALF_LAUNCH IS 145.
FUNCTION changeHALF_LAUNCH {
PARAMETER h.
IF h > 0 { SET HALF_LAUNCH TO h. }
}
FUNCTION latIncOk {
PARAMETER lat,i.
RETURN (i > 0 AND ABS(lat) < 90 AND MIN(i,180-i) >= ABS(lat)).
}
FUNCTION etaToOrbitPlane {
PARAMETER is_AN, planet, orb_lan, i, ship_lat, ship_lng.
LOCAL eta1 IS -1.
IF latIncOk(ship_lat,i) {
LOCAL rel_lng IS ARCSIN(TAN(ship_lat)/TAN(i)).
IF NOT is_AN { SET rel_lng TO 180 - rel_lng. }
LOCAL g_lan IS mAngle(orb_lan + rel_lng - planet:ROTATIONANGLE).
LOCAL node_angle IS mAngle(g_lan - ship_lng).
SET eta1 TO (node_angle / 360) * planet:ROTATIONPERIOD.
}
RETURN eta1.
}
FUNCTION azimuth {
PARAMETER i.
IF latIncOk(LATITUDE,i) { RETURN mAngle(ARCSIN(COS(i) / COS(LATITUDE))). }
RETURN -1.
}
FUNCTION planetSurfaceSpeedAtLat {
PARAMETER planet, lat.
LOCAL v_rot IS 0.
LOCAL circum IS 2 * CONSTANT:PI * planet:RADIUS.
LOCAL period IS planet:ROTATIONPERIOD.
IF period > 0 { SET v_rot TO COS(lat) * circum / period. }
RETURN v_rot.
}
FUNCTION launchAzimuth {
PARAMETER planet, az, ap.
LOCAL v_orbit IS SQRT(planet:MU/(planet:RADIUS + ap)).
LOCAL v_rot IS planetSurfaceSpeedAtLat(planet,LATITUDE).
LOCAL v_orbit_x IS v_orbit * SIN(az).
LOCAL v_orbit_y IS v_orbit * COS(az).
LOCAL raz IS mAngle(90 - ARCTAN2(v_orbit_y, v_orbit_x - v_rot)).
pOut("Input azimuth: " + ROUND(az,2)).
pOut("Output azimuth: " + ROUND(raz,2)).
RETURN raz.
}
FUNCTION noPassLaunchDetails {
PARAMETER i,lan.
LOCAL az IS 90.
LOCAL lat IS MIN(i, 180-i).
IF i > 90 { SET az TO 270. }
IF i = 0 OR i = 180 { RETURN LIST(az,0). }
LOCAL eta1 IS 0.
IF LATITUDE > 0 { SET eta1 TO etaToOrbitPlane(TRUE,BODY,lan,i,lat,LONGITUDE). }
ELSE { SET eta1 TO etaToOrbitPlane(FALSE,BODY,lan,i,-lat,LONGITUDE). }
LOCAL launch_time IS TIME:SECONDS + eta1 - HALF_LAUNCH.
RETURN LIST(az,launch_time).
}
FUNCTION launchDetails {
PARAMETER ap,i,lan,az.
LOCAL eta1 IS 0.
SET az TO launchAzimuth(BODY,az,ap).
LOCAL eta_to_AN IS etaToOrbitPlane(TRUE,BODY,lan,i,LATITUDE,LONGITUDE).
LOCAL eta_to_DN IS etaToOrbitPlane(FALSE,BODY,lan,i,LATITUDE,LONGITUDE).
IF eta_to_DN < 0 AND eta_to_AN < 0 { RETURN noPassLaunchDetails(i,lan). }
ELSE IF (eta_to_DN < eta_to_AN OR eta_to_AN < HALF_LAUNCH) AND eta_to_DN >= HALF_LAUNCH {
SET eta1 TO eta_to_DN.
SET az TO mAngle(180 - az).
} ELSE IF eta_to_AN >= HALF_LAUNCH { SET eta1 TO eta_to_AN. }
ELSE { SET eta1 TO eta_to_AN + BODY:ROTATIONPERIOD. }
LOCAL launch_time IS TIME:SECONDS + eta1 - HALF_LAUNCH.
RETURN LIST(az,launch_time).
}
FUNCTION calcLaunchDetails {
PARAMETER ap,i,lan.
LOCAL az IS azimuth(i).
IF az < 0 { RETURN noPassLaunchDetails(i,lan). }
ELSE { RETURN launchDetails(ap,i,lan,az). }
}
FUNCTION warpToLaunch {
PARAMETER launch_time.
IF launch_time - TIME:SECONDS > 5 {
pOut("Waiting for orbit plane to pass overhead.").
WAIT 5.
doWarp(launch_time).
}
}