Mno, prepsal jsem to do js. Ale tez tam mam nekde chybu :) Pro x to pocita nejaky straslivy cisla nez pro y a ujizdi na stranu. (Kit - se nesmej!)
Ty tam mas nejake nepresnosti v pocitani sily, umocneni 1.5 se mi nezda, kdyz ma vzorecek bud r na druhou nebo r na druhou * r/r. A pak uz je treba pocitat aktualni polohu a ne nulovy stav (to ti psal Kit s tou vztaznou soustavou).
<html>
<style>
#graph {border:1px solid #f00; width:600px; height:500px; position:relative;}
#graph div {position:absolute;}
</style>
<div id="graph">
<div id="o0"><b>o</b></div>
<div id="o1">o</div>
<div id="o2">o</div>
</div>
<div id="label">
<div id="l0"></div>
<div id="l1"></div>
<div id="l2"></div>
<div>
<input type=button value=start onclick="if (timer!=null) {clearInterval(timer);} timer = setInterval(rotace,k.timer);">
<input type=button value=stop onclick="clearInterval(timer);">
</div>
</div>
<script>
function kresli(obj)
{
obj.label.innerHTML = obj.name + ": x = %1, y = %2".replace('%1',obj.x).replace('%2',obj.y);
obj.el.style.left = k.x0 + Math.floor(obj.x * k.zoomx) + 'px';
obj.el.style.top = k.y0 + Math.floor(obj.y * k.zoomy) + 'px';
}
function rotace()
{
var r2, F, ax, ay, vx, vy, x,y;
// zeme
r2 = Math.pow(slunce.x - zeme.x, 2) + Math.pow(slunce.y - zeme.y, 2);
F = - k.kappa * slunce.m * zeme.m / r2;
ax = F * zeme.x;
ay = F * zeme.y;
vx = zeme.vx + ax * k.dt; // v = vo + a * t
vy = zeme.vy + ay * k.dt;
x = zeme.x + vx * k.dt;
y = zeme.y + vy * k.dt;
zeme.vx = vx;
zeme.vy = vy;
zeme.x = x;
zeme.y = y;
/*
// mesic
r =
F = - k.kappa * slunce.m * zeme.m / (r * r);
ax = F * mesic.x0;
ay = F * mesic.y0;
vx = mesic.vx0 + ax * k.dt;
vy = mesic.vy0 + ay * k.dt;
x = mesic.x0 + vx * k.dt;
y = mesic.y0 + vy * k.dt;
mesic.x = x;
mesic.y = y;
*/
kresli(slunce);
kresli(zeme);
kresli(mesic);
}
var k = {
// nasa units: http://nssdc.gsfc.nasa.gov/…t_notes.html
// nasa earth: http://nssdc.gsfc.nasa.gov/…rthfact.html
// nasa sun: http://nssdc.gsfc.nasa.gov/…sunfact.html
zoomx: 1e-41, // x * zoom, y * zoom
zoomy: 1e-8, // x * zoom, y * zoom
x0: 300, //px
y0: 200, //px
timer: 300, //ms
kappa: 6.67384E-11, // Gravitational Constant [m3*kg-1*s-2] (N*m2*kg-2) - nasaU
AU: 1.49597900E+11, // AU [m] - nasaU
s_m: 1.988500E+30, // mass [kg] - nasaS
z_m: 5.9726E+24, // mass [kg] - nasaE
z_rp: 1.4709E+11, // peri [m] = 0.98329 * AU - nasaE
z_vmax: -30.29E+3, // rychlost v perihelu [m/s] - nasaE
dt: 3600 // time step [s]
}
var slunce = {
name: 'Slunce',
el: document.getElementById('o0'),
label: document.getElementById('l0'),
x: 0,
y: 0,
m: k.s_m
}
var zeme = {
name: 'Zeme',
el: document.getElementById('o1'),
label: document.getElementById('l1'),
x: k.z_rp, //x0
y: 0, //y0
vx: 0,
vy: k.z_vmax,
m: k.z_m,
x0: k.z_rp,
y0: 0,
vx0: 0,
vy0: k.z_vmax
}
var mesic = {
name: 'Mesic',
el: document.getElementById('o2'),
label: document.getElementById('l2'),
x: k.z_rp, //x0
y: 0, //y0
vx: 0,
vy: k.z_vmax,
m: k.m_m,
x0: k.z_rp,
y0: 0,
vx0: 0,
vy0: k.z_vmax
}
kresli(slunce);
kresli(zeme);
kresli(mesic);
var timer = null;
</script>
</html>