Skip to content

Instantly share code, notes, and snippets.

@spdegabrielle
Created April 10, 2023 16:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spdegabrielle/2ef0bae9c4b44483a79a5d7c7be65b91 to your computer and use it in GitHub Desktop.
Save spdegabrielle/2ef0bae9c4b44483a79a5d7c7be65b91 to your computer and use it in GitHub Desktop.
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__
};
#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