Created
April 10, 2023 16:19
-
-
Save spdegabrielle/2ef0bae9c4b44483a79a5d7c7be65b91 to your computer and use it in GitHub Desktop.
RacketScript Playground Program; view at: http://play.racketscript.org/#gist/2ef0bae9c4b44483a79a5d7c7be65b91
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import * as $rjs_core from '../runtime/core.js'; | |
import * as M0 from "../links/racketscript-extras/racketscript/htdp/universe.rkt.js"; | |
import * as M1 from "../collects/racket/private/list.rkt.js"; | |
import * as M2 from "../links/racketscript-extras/racketscript/htdp/image.rkt.js"; | |
import * as M3 from "../runtime/kernel.rkt.js"; | |
import * as M4 from "../collects/racket/private/for.rkt.js"; | |
import * as M5 from "../collects/racket/private/map.rkt.js"; | |
import * as M6 from "../collects/racket/private/reverse.rkt.js"; | |
var G = 6.67428e-11; | |
var AU = 149600000.0 * 1000; | |
var SCALE = 250 / AU; | |
var let_result1 = M3.make_struct_type($rjs_core.PrimitiveSymbol.make("body"), false, 8, 0, false, M3.rnull, false, false, $rjs_core.Pair.makeList(), false, $rjs_core.PrimitiveSymbol.make("body")); | |
var struct_1 = let_result1.getAt(0); | |
var make_2 = let_result1.getAt(1); | |
var __p3 = let_result1.getAt(2); | |
var __ref4 = let_result1.getAt(3); | |
var __set_bang_5 = let_result1.getAt(4); | |
var let_result2 = M3.values(struct_1, make_2, __p3, M3.make_struct_field_accessor(__ref4, 0, $rjs_core.PrimitiveSymbol.make("id")), M3.make_struct_field_accessor(__ref4, 1, $rjs_core.PrimitiveSymbol.make("px")), M3.make_struct_field_accessor(__ref4, 2, $rjs_core.PrimitiveSymbol.make("py")), M3.make_struct_field_accessor(__ref4, 3, $rjs_core.PrimitiveSymbol.make("vx")), M3.make_struct_field_accessor(__ref4, 4, $rjs_core.PrimitiveSymbol.make("vy")), M3.make_struct_field_accessor(__ref4, 5, $rjs_core.PrimitiveSymbol.make("mass")), M3.make_struct_field_accessor(__ref4, 6, $rjs_core.PrimitiveSymbol.make("radius")), M3.make_struct_field_accessor(__ref4, 7, $rjs_core.PrimitiveSymbol.make("color")), M3.make_struct_field_mutator(__set_bang_5, 0, $rjs_core.PrimitiveSymbol.make("id")), M3.make_struct_field_mutator(__set_bang_5, 1, $rjs_core.PrimitiveSymbol.make("px")), M3.make_struct_field_mutator(__set_bang_5, 2, $rjs_core.PrimitiveSymbol.make("py")), M3.make_struct_field_mutator(__set_bang_5, 3, $rjs_core.PrimitiveSymbol.make("vx")), M3.make_struct_field_mutator(__set_bang_5, 4, $rjs_core.PrimitiveSymbol.make("vy")), M3.make_struct_field_mutator(__set_bang_5, 5, $rjs_core.PrimitiveSymbol.make("mass")), M3.make_struct_field_mutator(__set_bang_5, 6, $rjs_core.PrimitiveSymbol.make("radius")), M3.make_struct_field_mutator(__set_bang_5, 7, $rjs_core.PrimitiveSymbol.make("color"))); | |
var struct_body = let_result2.getAt(0); | |
var body1 = let_result2.getAt(1); | |
var body_p = let_result2.getAt(2); | |
var body_id = let_result2.getAt(3); | |
var body_px = let_result2.getAt(4); | |
var body_py = let_result2.getAt(5); | |
var body_vx = let_result2.getAt(6); | |
var body_vy = let_result2.getAt(7); | |
var body_mass = let_result2.getAt(8); | |
var body_radius = let_result2.getAt(9); | |
var body_color = let_result2.getAt(10); | |
var set_body_id_bang_ = let_result2.getAt(11); | |
var set_body_px_bang_ = let_result2.getAt(12); | |
var set_body_py_bang_ = let_result2.getAt(13); | |
var set_body_vx_bang_ = let_result2.getAt(14); | |
var set_body_vy_bang_ = let_result2.getAt(15); | |
var set_body_mass_bang_ = let_result2.getAt(16); | |
var set_body_radius_bang_ = let_result2.getAt(17); | |
var set_body_color_bang_ = let_result2.getAt(18); | |
var testCollPlanets = M3.list(body1($rjs_core.UString.make("Sun"), 0, 0, 0, 0, 1.98892e+30, 32, $rjs_core.UString.make("yellow")), body1($rjs_core.UString.make("Mercury"), -0.387098 * AU, 0, 0, -47362.0, 3.3011e+23, 4, $rjs_core.UString.make("white")), body1($rjs_core.UString.make("Venus"), 0.723 * AU, 0, 0, 35020.0, 4.8685e+24, 8, $rjs_core.UString.make("blue")), body1($rjs_core.UString.make("Earth"), -1 * AU, 0, 0, -29783.0, 5.9742e+24, 8, $rjs_core.UString.make("green")), body1($rjs_core.UString.make("Mars"), 1.5236 * AU, 0, 0, 24077.0, 6.4174e+23, 4, $rjs_core.UString.make("Firebrick"))); | |
var timestep = 12 * 3600; | |
var Width = 1200; | |
var xoffset = Width / 2; | |
var Height = 960; | |
var yoffset = Height / 2; | |
var force = function(g6, mass7, otherMass8, distance9) { | |
if (arguments.length !== 4) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return (g6 * (mass7 * otherMass8)) / M3.expt(distance9, 2); | |
}; | |
var directionOfForce = function(dx10, dy11, force12) { | |
if (arguments.length !== 3) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
var theta13 = M3.atan(dy11, dx10); | |
return M3.list(M3.cos(theta13) * force12, M3.sin(theta13) * force12); | |
}; | |
var attraction = function(body14, otherBody15) { | |
if (arguments.length !== 2) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
var dx16 = body_px(otherBody15) - body_px(body14); | |
var dy17 = body_py(otherBody15) - body_py(body14); | |
var distance18 = M3.sqrt(M3.expt(dx16, 2) + M3.expt(dy17, 2)); | |
if (M3.__eq_(distance18, 0) !== false) { | |
return M3.print($rjs_core.UString.make("Hitt!")); | |
} else { | |
return directionOfForce(dx16, dy17, force(G, body_mass(body14), body_mass(otherBody15), distance18)); | |
} | |
}; | |
var totalAttraction = function(_body1993, _bodies2094, _fxy2195) { | |
if (arguments.length !== 3) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
lambda_start92: while (true) { | |
let body19 = _body1993; | |
let bodies20 = _bodies2094; | |
let fxy21 = _fxy2195; | |
if (M3.equal_p(bodies20, $rjs_core.Pair.makeList()) !== false) { | |
return fxy21; | |
} else { | |
_body1993 = body19; | |
_bodies2094 = M3.cdr(bodies20); | |
_fxy2195 = M5.map(M3.__plus_, fxy21, attraction(body19, M3.car(bodies20))); | |
continue lambda_start92; | |
} | |
} | |
}; | |
var gravity = function(bodies22, timestep23) { | |
if (arguments.length !== 2) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
var let_result5 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("b")), bodies22); | |
var pos__gt_vals25 = let_result5.getAt(0); | |
var pos_pre_inc26 = let_result5.getAt(1); | |
var pos_next27 = let_result5.getAt(2); | |
var init28 = let_result5.getAt(3); | |
var pos_cont_p29 = let_result5.getAt(4); | |
var val_cont_p30 = let_result5.getAt(5); | |
var all_cont_p31 = let_result5.getAt(6); | |
M3.rvoid(); | |
var for_loop32 = function(_fold_var3399, _pos34100) { | |
if (arguments.length !== 2) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
lambda_start97: while (true) { | |
let fold_var33 = _fold_var3399; | |
let pos34 = _pos34100; | |
if (pos_cont_p29 !== false) { | |
var if_res6 = pos_cont_p29(pos34); | |
} else { | |
var if_res6 = true; | |
} | |
if (if_res6 !== false) { | |
var b38 = pos__gt_vals25(pos34); | |
if (all_cont_p31 !== false) { | |
var if_res7 = function(pos39) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p31(pos39, b38); | |
}; | |
} else { | |
var if_res7 = false; | |
} | |
var let_result8 = M3.values(b38, if_res7); | |
var b35 = let_result8.getAt(0); | |
var all_cont_p_by_pos36 = let_result8.getAt(1); | |
if (pos_pre_inc26 !== false) { | |
var if_res9 = pos_pre_inc26(pos34); | |
} else { | |
var if_res9 = pos34; | |
} | |
var pos37 = if_res9; | |
if (val_cont_p30 !== false) { | |
var if_res10 = val_cont_p30(b35); | |
} else { | |
var if_res10 = true; | |
} | |
if (if_res10 !== false) { | |
var fold_var41 = fold_var33; | |
var fold_var42 = M3.cons(totalAttraction(b35, M1.remove(b35, bodies22), $rjs_core.Pair.makeList(0, 0)), fold_var41); | |
var fold_var40 = M3.values(fold_var42); | |
if (all_cont_p_by_pos36 !== false) { | |
var if_res11 = all_cont_p_by_pos36(pos37); | |
} else { | |
var if_res11 = true; | |
} | |
if (if_res11 !== false) { | |
var if_res12 = M3.not(false); | |
} else { | |
var if_res12 = false; | |
} | |
if (if_res12 !== false) { | |
_fold_var3399 = fold_var40; | |
_pos34100 = pos_next27(pos37); | |
continue lambda_start97; | |
} else { | |
return fold_var40; | |
} | |
} else { | |
return fold_var33; | |
} | |
} else { | |
return fold_var33; | |
} | |
} | |
}; | |
var forces24 = M6.alt_reverse(for_loop32(M3.rnull, init28)); | |
var let_result16 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("f")), forces24); | |
var pos__gt_vals44 = let_result16.getAt(0); | |
var pos_pre_inc45 = let_result16.getAt(1); | |
var pos_next46 = let_result16.getAt(2); | |
var init47 = let_result16.getAt(3); | |
var pos_cont_p48 = let_result16.getAt(4); | |
var val_cont_p49 = let_result16.getAt(5); | |
var all_cont_p50 = let_result16.getAt(6); | |
var let_result17 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("b")), bodies22); | |
var pos__gt_vals51 = let_result17.getAt(0); | |
var pos_pre_inc52 = let_result17.getAt(1); | |
var pos_next53 = let_result17.getAt(2); | |
var init54 = let_result17.getAt(3); | |
var pos_cont_p55 = let_result17.getAt(4); | |
var val_cont_p56 = let_result17.getAt(5); | |
var all_cont_p57 = let_result17.getAt(6); | |
M3.rvoid(); | |
M3.rvoid(); | |
var for_loop58 = function(_fold_var59104, _pos60105, _pos61106) { | |
if (arguments.length !== 3) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
lambda_start101: while (true) { | |
let fold_var59 = _fold_var59104; | |
let pos60 = _pos60105; | |
let pos61 = _pos61106; | |
if (pos_cont_p48 !== false) { | |
var if_res18 = pos_cont_p48(pos60); | |
} else { | |
var if_res18 = true; | |
} | |
if (if_res18 !== false) { | |
if (pos_cont_p55 !== false) { | |
var if_res19 = pos_cont_p55(pos61); | |
} else { | |
var if_res19 = true; | |
} | |
var if_res20 = if_res19; | |
} else { | |
var if_res20 = false; | |
} | |
if (if_res20 !== false) { | |
var f68 = pos__gt_vals44(pos60); | |
if (all_cont_p50 !== false) { | |
var if_res21 = function(pos69) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p50(pos69, f68); | |
}; | |
} else { | |
var if_res21 = false; | |
} | |
var let_result22 = M3.values(f68, if_res21); | |
var f62 = let_result22.getAt(0); | |
var all_cont_p_by_pos63 = let_result22.getAt(1); | |
if (pos_pre_inc45 !== false) { | |
var if_res23 = pos_pre_inc45(pos60); | |
} else { | |
var if_res23 = pos60; | |
} | |
var pos64 = if_res23; | |
var b70 = pos__gt_vals51(pos61); | |
if (all_cont_p57 !== false) { | |
var if_res24 = function(pos71) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p57(pos71, b70); | |
}; | |
} else { | |
var if_res24 = false; | |
} | |
var let_result25 = M3.values(b70, if_res24); | |
var b65 = let_result25.getAt(0); | |
var all_cont_p_by_pos66 = let_result25.getAt(1); | |
if (pos_pre_inc52 !== false) { | |
var if_res26 = pos_pre_inc52(pos61); | |
} else { | |
var if_res26 = pos61; | |
} | |
var pos67 = if_res26; | |
if (val_cont_p49 !== false) { | |
var if_res27 = val_cont_p49(f62); | |
} else { | |
var if_res27 = true; | |
} | |
if (if_res27 !== false) { | |
if (val_cont_p56 !== false) { | |
var if_res28 = val_cont_p56(b65); | |
} else { | |
var if_res28 = true; | |
} | |
var if_res29 = if_res28; | |
} else { | |
var if_res29 = false; | |
} | |
if (if_res29 !== false) { | |
var fold_var73 = fold_var59; | |
var fold_var74 = M3.cons(M3.list(body_vx(b65) + ((M3.car(f62) / body_mass(b65)) * timestep23), body_vy(b65) + ((M3.car(M3.cdr(f62)) / body_mass(b65)) * timestep23)), fold_var73); | |
var fold_var72 = M3.values(fold_var74); | |
if (all_cont_p_by_pos63 !== false) { | |
var if_res30 = all_cont_p_by_pos63(pos64); | |
} else { | |
var if_res30 = true; | |
} | |
if (if_res30 !== false) { | |
if (all_cont_p_by_pos66 !== false) { | |
var if_res31 = all_cont_p_by_pos66(pos67); | |
} else { | |
var if_res31 = true; | |
} | |
if (if_res31 !== false) { | |
var if_res32 = M3.not(false); | |
} else { | |
var if_res32 = false; | |
} | |
var if_res33 = if_res32; | |
} else { | |
var if_res33 = false; | |
} | |
if (if_res33 !== false) { | |
_fold_var59104 = fold_var72; | |
_pos60105 = pos_next46(pos64); | |
_pos61106 = pos_next53(pos67); | |
continue lambda_start101; | |
} else { | |
return fold_var72; | |
} | |
} else { | |
return fold_var59; | |
} | |
} else { | |
return fold_var59; | |
} | |
} | |
}; | |
var vectors43 = M6.alt_reverse(for_loop58(M3.rnull, init47, init54)); | |
var let_result37 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("v")), vectors43); | |
var pos__gt_vals76 = let_result37.getAt(0); | |
var pos_pre_inc77 = let_result37.getAt(1); | |
var pos_next78 = let_result37.getAt(2); | |
var init79 = let_result37.getAt(3); | |
var pos_cont_p80 = let_result37.getAt(4); | |
var val_cont_p81 = let_result37.getAt(5); | |
var all_cont_p82 = let_result37.getAt(6); | |
var let_result38 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("b")), bodies22); | |
var pos__gt_vals83 = let_result38.getAt(0); | |
var pos_pre_inc84 = let_result38.getAt(1); | |
var pos_next85 = let_result38.getAt(2); | |
var init86 = let_result38.getAt(3); | |
var pos_cont_p87 = let_result38.getAt(4); | |
var val_cont_p88 = let_result38.getAt(5); | |
var all_cont_p89 = let_result38.getAt(6); | |
M3.rvoid(); | |
M3.rvoid(); | |
var for_loop90 = function(_fold_var91110, _pos92111, _pos93112) { | |
if (arguments.length !== 3) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
lambda_start107: while (true) { | |
let fold_var91 = _fold_var91110; | |
let pos92 = _pos92111; | |
let pos93 = _pos93112; | |
if (pos_cont_p80 !== false) { | |
var if_res39 = pos_cont_p80(pos92); | |
} else { | |
var if_res39 = true; | |
} | |
if (if_res39 !== false) { | |
if (pos_cont_p87 !== false) { | |
var if_res40 = pos_cont_p87(pos93); | |
} else { | |
var if_res40 = true; | |
} | |
var if_res41 = if_res40; | |
} else { | |
var if_res41 = false; | |
} | |
if (if_res41 !== false) { | |
var v100 = pos__gt_vals76(pos92); | |
if (all_cont_p82 !== false) { | |
var if_res42 = function(pos101) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p82(pos101, v100); | |
}; | |
} else { | |
var if_res42 = false; | |
} | |
var let_result43 = M3.values(v100, if_res42); | |
var v94 = let_result43.getAt(0); | |
var all_cont_p_by_pos95 = let_result43.getAt(1); | |
if (pos_pre_inc77 !== false) { | |
var if_res44 = pos_pre_inc77(pos92); | |
} else { | |
var if_res44 = pos92; | |
} | |
var pos96 = if_res44; | |
var b102 = pos__gt_vals83(pos93); | |
if (all_cont_p89 !== false) { | |
var if_res45 = function(pos103) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p89(pos103, b102); | |
}; | |
} else { | |
var if_res45 = false; | |
} | |
var let_result46 = M3.values(b102, if_res45); | |
var b97 = let_result46.getAt(0); | |
var all_cont_p_by_pos98 = let_result46.getAt(1); | |
if (pos_pre_inc84 !== false) { | |
var if_res47 = pos_pre_inc84(pos93); | |
} else { | |
var if_res47 = pos93; | |
} | |
var pos99 = if_res47; | |
if (val_cont_p81 !== false) { | |
var if_res48 = val_cont_p81(v94); | |
} else { | |
var if_res48 = true; | |
} | |
if (if_res48 !== false) { | |
if (val_cont_p88 !== false) { | |
var if_res49 = val_cont_p88(b97); | |
} else { | |
var if_res49 = true; | |
} | |
var if_res50 = if_res49; | |
} else { | |
var if_res50 = false; | |
} | |
if (if_res50 !== false) { | |
var fold_var105 = fold_var91; | |
var fold_var106 = M3.cons(M3.list(body_px(b97) + (M3.car(v94) * timestep23), body_py(b97) + (M3.car(M3.cdr(v94)) * timestep23)), fold_var105); | |
var fold_var104 = M3.values(fold_var106); | |
if (all_cont_p_by_pos95 !== false) { | |
var if_res51 = all_cont_p_by_pos95(pos96); | |
} else { | |
var if_res51 = true; | |
} | |
if (if_res51 !== false) { | |
if (all_cont_p_by_pos98 !== false) { | |
var if_res52 = all_cont_p_by_pos98(pos99); | |
} else { | |
var if_res52 = true; | |
} | |
if (if_res52 !== false) { | |
var if_res53 = M3.not(false); | |
} else { | |
var if_res53 = false; | |
} | |
var if_res54 = if_res53; | |
} else { | |
var if_res54 = false; | |
} | |
if (if_res54 !== false) { | |
_fold_var91110 = fold_var104; | |
_pos92111 = pos_next78(pos96); | |
_pos93112 = pos_next85(pos99); | |
continue lambda_start107; | |
} else { | |
return fold_var104; | |
} | |
} else { | |
return fold_var91; | |
} | |
} else { | |
return fold_var91; | |
} | |
} | |
}; | |
var positions75 = M6.alt_reverse(for_loop90(M3.rnull, init79, init86)); | |
var let_result58 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("b")), bodies22); | |
var pos__gt_vals107 = let_result58.getAt(0); | |
var pos_pre_inc108 = let_result58.getAt(1); | |
var pos_next109 = let_result58.getAt(2); | |
var init110 = let_result58.getAt(3); | |
var pos_cont_p111 = let_result58.getAt(4); | |
var val_cont_p112 = let_result58.getAt(5); | |
var all_cont_p113 = let_result58.getAt(6); | |
var let_result59 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("v")), vectors43); | |
var pos__gt_vals114 = let_result59.getAt(0); | |
var pos_pre_inc115 = let_result59.getAt(1); | |
var pos_next116 = let_result59.getAt(2); | |
var init117 = let_result59.getAt(3); | |
var pos_cont_p118 = let_result59.getAt(4); | |
var val_cont_p119 = let_result59.getAt(5); | |
var all_cont_p120 = let_result59.getAt(6); | |
var let_result60 = M4.__rjs_quoted__.make_sequence($rjs_core.Pair.makeList($rjs_core.PrimitiveSymbol.make("p")), positions75); | |
var pos__gt_vals121 = let_result60.getAt(0); | |
var pos_pre_inc122 = let_result60.getAt(1); | |
var pos_next123 = let_result60.getAt(2); | |
var init124 = let_result60.getAt(3); | |
var pos_cont_p125 = let_result60.getAt(4); | |
var val_cont_p126 = let_result60.getAt(5); | |
var all_cont_p127 = let_result60.getAt(6); | |
M3.rvoid(); | |
M3.rvoid(); | |
M3.rvoid(); | |
var for_loop128 = function(_fold_var129117, _pos130118, _pos131119, _pos132120) { | |
if (arguments.length !== 4) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
lambda_start113: while (true) { | |
let fold_var129 = _fold_var129117; | |
let pos130 = _pos130118; | |
let pos131 = _pos131119; | |
let pos132 = _pos132120; | |
if (pos_cont_p111 !== false) { | |
var if_res61 = pos_cont_p111(pos130); | |
} else { | |
var if_res61 = true; | |
} | |
if (if_res61 !== false) { | |
if (pos_cont_p118 !== false) { | |
var if_res62 = pos_cont_p118(pos131); | |
} else { | |
var if_res62 = true; | |
} | |
if (if_res62 !== false) { | |
if (pos_cont_p125 !== false) { | |
var if_res63 = pos_cont_p125(pos132); | |
} else { | |
var if_res63 = true; | |
} | |
var if_res64 = if_res63; | |
} else { | |
var if_res64 = false; | |
} | |
var if_res65 = if_res64; | |
} else { | |
var if_res65 = false; | |
} | |
if (if_res65 !== false) { | |
var b142 = pos__gt_vals107(pos130); | |
if (all_cont_p113 !== false) { | |
var if_res66 = function(pos143) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p113(pos143, b142); | |
}; | |
} else { | |
var if_res66 = false; | |
} | |
var let_result67 = M3.values(b142, if_res66); | |
var b133 = let_result67.getAt(0); | |
var all_cont_p_by_pos134 = let_result67.getAt(1); | |
if (pos_pre_inc108 !== false) { | |
var if_res68 = pos_pre_inc108(pos130); | |
} else { | |
var if_res68 = pos130; | |
} | |
var pos135 = if_res68; | |
var v144 = pos__gt_vals114(pos131); | |
if (all_cont_p120 !== false) { | |
var if_res69 = function(pos145) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p120(pos145, v144); | |
}; | |
} else { | |
var if_res69 = false; | |
} | |
var let_result70 = M3.values(v144, if_res69); | |
var v136 = let_result70.getAt(0); | |
var all_cont_p_by_pos137 = let_result70.getAt(1); | |
if (pos_pre_inc115 !== false) { | |
var if_res71 = pos_pre_inc115(pos131); | |
} else { | |
var if_res71 = pos131; | |
} | |
var pos138 = if_res71; | |
var p146 = pos__gt_vals121(pos132); | |
if (all_cont_p127 !== false) { | |
var if_res72 = function(pos147) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return all_cont_p127(pos147, p146); | |
}; | |
} else { | |
var if_res72 = false; | |
} | |
var let_result73 = M3.values(p146, if_res72); | |
var p139 = let_result73.getAt(0); | |
var all_cont_p_by_pos140 = let_result73.getAt(1); | |
if (pos_pre_inc122 !== false) { | |
var if_res74 = pos_pre_inc122(pos132); | |
} else { | |
var if_res74 = pos132; | |
} | |
var pos141 = if_res74; | |
if (val_cont_p112 !== false) { | |
var if_res75 = val_cont_p112(b133); | |
} else { | |
var if_res75 = true; | |
} | |
if (if_res75 !== false) { | |
if (val_cont_p119 !== false) { | |
var if_res76 = val_cont_p119(v136); | |
} else { | |
var if_res76 = true; | |
} | |
if (if_res76 !== false) { | |
if (val_cont_p126 !== false) { | |
var if_res77 = val_cont_p126(p139); | |
} else { | |
var if_res77 = true; | |
} | |
var if_res78 = if_res77; | |
} else { | |
var if_res78 = false; | |
} | |
var if_res79 = if_res78; | |
} else { | |
var if_res79 = false; | |
} | |
if (if_res79 !== false) { | |
var fold_var149 = fold_var129; | |
var fold_var150 = M3.cons(body1(body_id(b133), M3.car(p139), M3.car(M3.cdr(p139)), M3.car(v136), M3.car(M3.cdr(v136)), body_mass(b133), body_radius(b133), body_color(b133)), fold_var149); | |
var fold_var148 = M3.values(fold_var150); | |
if (all_cont_p_by_pos134 !== false) { | |
var if_res80 = all_cont_p_by_pos134(pos135); | |
} else { | |
var if_res80 = true; | |
} | |
if (if_res80 !== false) { | |
if (all_cont_p_by_pos137 !== false) { | |
var if_res81 = all_cont_p_by_pos137(pos138); | |
} else { | |
var if_res81 = true; | |
} | |
if (if_res81 !== false) { | |
if (all_cont_p_by_pos140 !== false) { | |
var if_res82 = all_cont_p_by_pos140(pos141); | |
} else { | |
var if_res82 = true; | |
} | |
if (if_res82 !== false) { | |
var if_res83 = M3.not(false); | |
} else { | |
var if_res83 = false; | |
} | |
var if_res84 = if_res83; | |
} else { | |
var if_res84 = false; | |
} | |
var if_res85 = if_res84; | |
} else { | |
var if_res85 = false; | |
} | |
if (if_res85 !== false) { | |
_fold_var129117 = fold_var148; | |
_pos130118 = pos_next109(pos135); | |
_pos131119 = pos_next116(pos138); | |
_pos132120 = pos_next123(pos141); | |
continue lambda_start113; | |
} else { | |
return fold_var148; | |
} | |
} else { | |
return fold_var129; | |
} | |
} else { | |
return fold_var129; | |
} | |
} | |
}; | |
return M6.alt_reverse(for_loop128(M3.rnull, init110, init117, init124)); | |
}; | |
var render_expr = function(bodies151) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return M2.place_images(M5.map(function(b152) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return M2.circle(body_radius(b152), $rjs_core.UString.make("solid"), body_color(b152)); | |
}, bodies151), M5.map(function(b153) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return M2.make_posn((body_px(b153) * SCALE) + xoffset, (body_py(b153) * SCALE) + yoffset); | |
}, bodies151), M2.empty_scene(Width, Height, $rjs_core.UString.make("black"))); | |
}; | |
var tick_expr = function(bodies154) { | |
if (arguments.length !== 1) { | |
throw $rjs_core.racketContractError("arity mismatch"); | |
} else {} | |
return gravity(bodies154, timestep); | |
}; | |
M0.big_bang(testCollPlanets, M0.on_tick(tick_expr), M0.to_draw(render_expr, Width, Height)); | |
var __rjs_quoted__ = {}; | |
__rjs_quoted__.body1 = body1; | |
__rjs_quoted__.struct_body = struct_body; | |
__rjs_quoted__.set_body_vy_bang_ = set_body_vy_bang_; | |
__rjs_quoted__.set_body_mass_bang_ = set_body_mass_bang_; | |
__rjs_quoted__.body_p = body_p; | |
__rjs_quoted__.body_color = body_color; | |
__rjs_quoted__.body_vx = body_vx; | |
__rjs_quoted__.set_body_vx_bang_ = set_body_vx_bang_; | |
__rjs_quoted__.body_id = body_id; | |
__rjs_quoted__.set_body_radius_bang_ = set_body_radius_bang_; | |
__rjs_quoted__.body_px = body_px; | |
__rjs_quoted__.set_body_py_bang_ = set_body_py_bang_; | |
__rjs_quoted__.set_body_id_bang_ = set_body_id_bang_; | |
__rjs_quoted__.body_vy = body_vy; | |
__rjs_quoted__.body_mass = body_mass; | |
__rjs_quoted__.body_radius = body_radius; | |
__rjs_quoted__.set_body_color_bang_ = set_body_color_bang_; | |
__rjs_quoted__.set_body_px_bang_ = set_body_px_bang_; | |
__rjs_quoted__.body_py = body_py; | |
export { | |
__rjs_quoted__ | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang racketscript/base | |
(require racketscript/htdp/universe | |
racketscript/htdp/image | |
racketscript/interop | |
racketscript/browser) | |
;;--------------------------------------------------------------------------------------------------- | |
; The gravitational constant G | |
(define G 6.67428e-11) | |
; Assumed scale: 100 pixels = 1AU | |
(define AU (* 149.6e6 1000)) | |
(define SCALE (/ 250 AU)) | |
;Structure of body;position in m, vector in m/s, mass in kg, radius in m | |
(struct body (id px py vx vy mass radius color) #:mutable #:transparent) | |
;The state of the solar system is represented as list of bodies, sized to be visible. | |
; this is the starting state | |
(define testCollPlanets | |
(list | |
(body "Sun" 0 0 0 0 1.98892e30 32 "yellow") | |
(body "Mercury" (* -0.387098 AU) 0 0 -47.362e3 3.3011e23 4 "white") | |
(body "Venus" (* 0.723 AU) 0 0 35.02e3 4.8685e24 8 "blue") | |
(body "Earth" (* -1 AU) 0 0 -29.783e3 5.9742e24 8 "green") | |
(body "Mars" (* 1.5236 AU) 0 0 24.077e3 6.4174e23 4 "Firebrick") | |
; Havoc | |
;(body "Havoc" (* -1.2 AU) 0 0 (* -10 1000) (* 8 (expt 10 28)) 16 "green") | |
;(body "Havoc2" (* -0.5 AU) 0 0 -30.362e3 3.3e23 4 "red") | |
;(body "Havoc3" (* -0.6 AU) 0 0 -27.362e3 3.3e23 4 "red") | |
;(body "Havoc4" (* -1.3 AU) 0 0 -17.362e3 3.3e23 4 "red") | |
;(body "Havoc5" (* -1.7 AU) 0 0 -07.362e3 3.3e23 4 "red") | |
)) | |
(define timestep (* 12 3600)) ;Half a day | |
;; view setup | |
(define Width 1200) | |
(define xoffset (/ Width 2)) | |
(define Height 960) | |
(define yoffset (/ Height 2)) | |
;;--------------------------------------------------------------------------------------------------- | |
;Calculate the force of attraction | |
(define (force g mass otherMass distance) | |
(/ (* g (* mass otherMass)) (expt distance 2))) | |
;Calculate direction of the force | |
(define (directionOfForce dx dy force) | |
(let ([theta (atan dy dx)]) | |
(list (* (cos theta) force) (* (sin theta) force)))) | |
;; attraction : body otherBody -> | |
;Creates a vector to adjust planet heading depending on all other bodies | |
(define (attraction body otherBody) | |
(let* ([dx (- (body-px otherBody) (body-px body))] | |
[dy (- (body-py otherBody) (body-py body))] | |
[distance (sqrt (+ (expt dx 2) (expt dy 2)))]) ;Distance between bodys | |
;(displayln distance) | |
(if (= distance 0) (print "Hitt!") | |
(directionOfForce dx dy | |
(force G (body-mass body) (body-mass otherBody) distance))))) | |
;Creates a list of vectors, a vector for every body | |
(define (totalAttraction body bodies fxy) | |
(if (equal? bodies '()) | |
fxy | |
(totalAttraction body (cdr bodies) (map + fxy (attraction body (car bodies)))))) | |
;; gravity : (listof bodies) timestep ⇒ bodies | |
(define (gravity bodies timestep) | |
(let* ([forces (for/list ([b bodies]) (totalAttraction b (remove b bodies) '(0 0)))] | |
[vectors | |
(for/list ([f forces][b bodies]) | |
(list (+ (body-vx b) (* (/ (car f) (body-mass b)) timestep)) | |
(+ (body-vy b) (* (/ (car(cdr f)) (body-mass b)) timestep))))] | |
[positions | |
(for/list ([v vectors][b bodies]) | |
(list (+ (body-px b) (* (car v) timestep)) | |
(+ (body-py b) (* (car (cdr v)) timestep))))]) | |
(for/list ([b bodies][v vectors][p positions]) | |
(body (body-id b) (car p) (car(cdr p)) (car v) (car(cdr v)) | |
(body-mass b) (body-radius b) (body-color b))))) | |
;; render-expr : bodies ⇒ scene | |
(define (render-expr bodies) | |
(place-images | |
(map (λ (b) (circle (body-radius b) "solid" (body-color b))) bodies) | |
(map (λ (b) (make-posn (+ (* (body-px b) SCALE) xoffset ) | |
(+ (* (body-py b) SCALE) yoffset ))) bodies) | |
(empty-scene Width Height "black"))) | |
;; tick-expr world ⇒ world | |
;; update velocities and positions | |
(define (tick-expr bodies) | |
(gravity bodies timestep)) | |
;; | |
(big-bang testCollPlanets | |
(on-tick tick-expr) | |
(to-draw render-expr Width Height)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment