Solar System model

Материал из Department of Theoretical and Applied Mechanics
Версия от 22:51, 24 мая 2016; 213.110.201.38 (обсуждение) (Новая страница: «Virtual laboratory > Solar System model <HR> {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Solar_System/Solar_System_v2_release.html |width=…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Virtual laboratory > Solar System model

This model demonstrates the real attitude of the orbital periods of the planets.

The radiuses of the planet orbits, as well as the sizes of the planets and the Sun are shown in a logarithmic scale.

Download: Solar_System_v2_release.zip (программа + изображения планет).

The text of the program is written in JavaScript (the developer is Цветков Денис):

Файл "Solar_System_v2_release.js"

  1 function Main_Solar(canvas) {
  2 
  3     canvas.onselectstart = function () {return false;};     // запрет выделения canvas
  4 
  5     // Предварительные установки
  6 
  7     var context = canvas.getContext("2d");                  // на context происходит рисование
  8 
  9     var m0 = 1;                         // масштаб массы (масса Земли)
 10     var t0 = 1;                         // масштаб времени (1 оборот Земли вокруг своей оси (1 день))
 11     var a0 = 1;                         // масштаб расстояния (астрономическая единица - расстояние от Солнца до Земли)
 12 
 13     var r0 = 4.2588e-5 * a0;            // радиус Земли
 14     var t1 = 365.2564 * t0;             // 1 оборот Земли вокруг Солнца (1 год)
 15 
 16     // *** Задание вычислительных параметров ***
 17 
 18     var fps = 60;                       // frames per second - число кадров в секунду (качечтво отображения)
 19     var dt  = 0.5 * t0;                 // шаг интегрирования
 20 
 21     // *** Выполнение программы ***
 22 
 23     var space_objects = [];
 24     // значения distance и time_around_Sun у солнца сделаны для того, чтобы оно мерцало из-за движения
 25     space_objects.push({name:"Солнце",    mass:333000*m0, distance:0.001*a0,  radius:109.21*r0, time_around_Sun:60*t0,    phase:0,    color:"#f6e209",    file:"VL_SS_Sun.png"});
 26     space_objects.push({name:"Меркурий",  mass:0.05527*m0, distance:0.387*a0, radius:0.3829*r0, time_around_Sun:87.97*t0, phase:0,    color:"#de442c",    file:"VL_SS_Mercury.png"});
 27     space_objects.push({name:"Венера",    mass:0.815*m0,  distance:0.723*a0,  radius:0.949*r0, time_around_Sun:224.7*t0,  phase:0,    color:"#e8b633",    file:"VL_SS_Venus.png"});
 28     space_objects.push({name:"Земля",     mass:1*m0,      distance:1*a0,      radius:1*r0,    time_around_Sun:1*t1,       phase:0,    color:"#3e6286",    file:"VL_SS_Earth.png"});
 29     space_objects.push({name:"Марс",      mass:0.107*m0,  distance:1.523*a0,  radius:0.532*r0, time_around_Sun:1.88*t1,   phase:0,    color:"#752814",    file:"VL_SS_Mars.png"});
 30     space_objects.push({name:"Юпитер",    mass:317.8*m0,  distance:5.2*a0,    radius:10.97*r0, time_around_Sun:11.86*t1,  phase:0,    color:"#8c694d",    file:"VL_SS_Jupiter.png"});
 31     space_objects.push({name:"Сатурн",    mass:95.2*m0,   distance:9.54*a0,   radius:9.45*r0, time_around_Sun:29.46*t1,   phase:0,    color:"#c69e47",    file:"VL_SS_Saturn.png"});
 32     space_objects.push({name:"Уран",      mass:14.53*m0,  distance:19.19*a0,  radius:4*r0,    time_around_Sun:84.02*t1,   phase:0,    color:"#4e659b",    file:"VL_SS_Uranus.png"});
 33     space_objects.push({name:"Нептун",    mass:17.14*m0,  distance:30.06*a0,  radius:3.88*r0, time_around_Sun:164.78*t1,  phase:0,    color:"#4e6fbc",    file:"VL_SS_Neptunes.png"});
 34 //    space_objects.push({name:"Плутон",    mass:0.0022*m0, distance:39.53*a0,  radius:0.18*r0, time_around_Sun:248.09*t1,  phase:0});
 35 //    space_objects.push({name:"Хаумеа",    mass:777*m0,    distance:777*a0,    radius:777*r0,  time_around_Sun:285*t1,     phase:0});
 36 //    space_objects.push({name:"Макемаке",  mass:777*m0,    distance:777*a0,    radius:777*r0,  time_around_Sun:309.88*t1,  phase:0});
 37 //    space_objects.push({name:"Эрида",     mass:777*m0,    distance:777*a0,    radius:777*r0,  time_around_Sun:557*t1,     phase:0});
 38 //    space_objects.push({name:"Седна",     mass:777*m0,    distance:777*a0,    radius:777*r0,  time_around_Sun:12059*t1,   phase:0});
 39 
 40     for (var i = 0; i < space_objects.length; i++) {
 41         space_objects[i].phase = Math.random() * 360;
 42     }
 43 
 44     var scale = canvas.height / a0 / space_objects.length / 2.1;  // масштабный коэффициент для перехода от расчетных к экранным координатам
 45     var w = canvas.width / scale;                           // ширина окна в расчетных координатах
 46     var h = canvas.height / scale;                          // высота окна в расчетных координатах
 47 
 48     // Генерация звезд
 49     var stars = [];
 50     function generate_stars() {
 51         for (var i = 0; i < 1000; i++) {
 52             // цвет задается как #xxyyzz, где xx - доля красного, yy - зеленого, zz - синего.
 53             var r = (0x1a0 + (Math.random()) * 0x5f).toString(16).substr(1,2);  // красный от a0 до a0 + 5f
 54             var g = (0x1a0 + (Math.random()) * 0x5f).toString(16).substr(1,2);
 55             var b = (0x1a0 + (Math.random()) * 0x5f).toString(16).substr(1,2);
 56             stars[i] = {x:Math.random() * w * scale, y:Math.random() * h * scale, color:'#' + r + g + b};
 57         }
 58     }
 59 
 60     // Основной цикл программы
 61     function control() {
 62         physics();
 63         draw();
 64     }
 65 
 66     // Расчетная часть программы
 67     function physics() {                                    // то, что происходит каждый шаг времени
 68         for (var i = 0; i < space_objects.length; i++) {
 69             space_objects[i].phase += 360 * dt / space_objects[i].time_around_Sun;
 70         }
 71     }
 72 
 73     // загрузка изображений планет
 74     function load_pics() {
 75         for (var i = 0; i < space_objects.length; i++) {
 76             if (!space_objects[i].file) continue;
 77             var pic = new Image();
 78             pic.src = "Pics/" + space_objects[i].file;
 79             space_objects[i].pic = pic;
 80         }
 81     }
 82 
 83     // Рисование
 84     function draw() {
 85         // темное небо
 86         context.fillStyle = "#000000";
 87         context.fillRect(0, 0, w * scale, h * scale);
 88 
 89         // звезды
 90         for (var i0 = 0; i0 < stars.length; i0++) {
 91             context.fillStyle = stars[i0].color;
 92             context.fillRect(stars[i0].x, stars[i0].y, 1, 1);
 93         }
 94 
 95         for (var i = 0; i < space_objects.length; i++){
 96             var p = space_objects[i];
 97             var ro = 1.9 * Math.log(1 + 2.5 * p.distance / a0) * a0;
 98             var fi = p.phase / 180 * Math.PI;
 99             var xS = (w / 2 + ro * Math.cos(fi)) * scale;
100             var yS = (h / 2 + ro * Math.sin(fi)) * scale;
101 
102             // траектории
103             context.beginPath();
104             context.arc(w / 2 * scale, h / 2 * scale, ro * scale, 0, 2 * Math.PI, false);
105             context.strokeStyle = "#516185";
106             context.stroke();
107 
108             // космические объекты
109             if (p.pic) {
110                 var r = 0.1 * Math.log(1 + 8 * p.radius / r0) * a0 * scale;
111                 var wh = p.pic.width / p.pic.height;
112                 context.drawImage(p.pic, xS - r * wh, yS - r, r * 2 * wh, r * 2);
113             }
114         }
115     }
116 
117     // Запуск системы
118     load_pics();
119     generate_stars();
120     setInterval(control, 1000 / fps);
121 }

Файл "Solar_System_v2_release.html"

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8" />
 5     <title>Solar System</title>
 6     <script src="Solar_System_v2_release.js"></script>
 7 </head>
 8 <body>
 9     <canvas id="Solar_System" width="800" height="800" style="border:1px solid #000000;"></canvas>
10     <script type="text/javascript">var app = new Main_Solar(document.getElementById('Solar_System'));</script>
11 </body>
12 </html>

The proposed directions of the stand development

  • Add satellites of planets, dwarf planets and other space objects.
  • Show information about space object when aiming cursor on it.
  • Add the rotation of the planets around their axis.
  • "Incline camera" a little, for the better view
  • Set real phases for the planets.
  • Add the ability to view the status of the planets at a certain point (eg, time management slider)