Моделирование и визуализация движения космических тел

Создание программы для расчета и визуализации движения тел в космосе под действием силы гравитационного взаимодействия между ними. Описание методов, используемых в программе. Возможности развития программы и разработки трехмерной визуализации движения.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 11.01.2020
Размер файла 328,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное государственное автономное образовательное учреждение

высшего образования

«Санкт-Петербургский государственный политехнический университет Петра Великого»

Институт прикладкой математики и механики

Кафедра «Теоретическая механика»

Курсовой проект

по дисциплине «Информатика»

«Моделирование и визуализация движения космических тел»

Преподаватель А.Ю. Панченко

Студент группы 13604/1 А.В. Давыдова

Санкт-Петербург 2015 г.

  • Оглавление
  • Введение
  • Возможности JavaScript
  • Обзор литературы
  • Описание методов, используемых в программе
  • Результаты
  • Возможности развития программы
  • Список литературы

Введение

Данная программа была написана для расчета и визуализации движения тел в космосе, под действием силы гравитационного взаимодействия между ними. В частности, одной из целей создания программы было прогнозирование поведения системы планета - спутник при пролете инородного тела вблизи неё. Инородное тело может стать спутником планеты, может захватить спутник и улететь от нее по гиперболической орбите, может измениться траектория спутника, также могут быть и другие варианты конфигурации получившейся системы. Это полностью зависит от начальных параметров системы, таких как скорости, массы, положения тел в пространстве. Возможности программы позволяют моделировать поведение трех взаимодействующих объектов, массы которых могут быть от 0 до 1040 килограммов (верхний предел больше, чем массы звезд сверхгигантов), которые движутся с нерелятивистскими скоростями (случай такого взаимодействия в программе пока не рассмотрен).

Программа написана на HTML и JavaScript. Её запуск производится через интернет браузер (например, Mozilla Firefox или Google Chrome) и не требует установки дополнительных программ.

Возможности JavaScript

JavaScript является объектно-ориентированным языком, но используемое в языке прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих функциональным языкам -- функции как объекты первого класса, объекты как списки, карринг, анонимные функции, замыкания -- что придаёт языку дополнительную гибкость.

Несмотря на схожий с Си синтаксис, JavaScript по сравнению с языком Си имеет коренные отличия:

· объекты, с возможностью интроспекции;

· функции как объекты первого класса;

· автоматическое приведение типов;

· автоматическая сборка мусора;

· анонимные функции.

В языке отсутствуют такие полезные вещи, как:

· модульная система: JavaScript не предоставляет возможности управлять зависимостями и изоляцией областей видимости;

· стандартная библиотека: в частности, отсутствует интерфейс программирования приложений по работе с файловой системой, управлению потоками ввода-вывода, базовых типов для бинарных данных;

· стандартные интерфейсы к веб-серверам и базам данных;

· система управления пакетами, которая бы отслеживала зависимости и автоматически устанавливала их.

Обзор литературы

При написании работы использовались статьи на различных интернет ресурсах, посвященные программированию на языках HTML и JavaScript, такие как www.w3schools.com и learn.javascript.ru. Основные принципы программирования на этих языках были взяты из статьи Д.В. Цветкова «Обучение JavaScript». В программе используется объектный подход, описанный в книге «Объектно-ориентированное программирование в С++» Роберта Лафоре.

Описание методов, используемых в программе

Код программы содержится в нескольких файлах. Первый - это файл HTML кода страницы, который содержит весь интерфейс, разметку страницы, которую видит пользователь. Кнопки, с помощью которых запускается программа, также описаны в HTML файле. Ниже приведен код этой страницы.

<!DOCTYPE html>

<html>

<head>

<title>Planets</title>

<meta charset="UTF-8" />

<script src="alg_lib.js"></script>

<script src="Vector.js"></script>

<script src="PlanetsJS.js"></script>

</head>

<body onload ="main_planets();">

<canvas id="Planets" width="800" height="800" style="border:1px solid #000000;"></canvas> <br>

<input id="button_calc" type="button" value="Сосчитать">

<input id="button_pause" type="button" value="Пауза" >

масса тела 1, кг<input type ="number" id="PlanetM1" min=0 max=10 style="width: 50px">

*10^<input type ="number" id="expm1" min=1 max=100 style="width: 50px"><br>

скорость вдоль оси 0x <input type ="number" id="PlanetV1_X" min=0 max=2000 style="width: 50px"> км/с<br>

скорость вдоль оси 0y <input type ="number" id="PlanetV1_Y" min=0 max=2000 style="width: 50px"> км/с<br>

Положение по Х <input type ="number" id="PlanetR1_X" min=0 max=30 style="width: 50px"> а.е.<br>

Положение по Y <input type ="number" id="PlanetR1_Y" min=0 max=30 style="width: 50px"> а.е.<br>

<br><br>

масса тела 2, кг<input type ="number" id="PlanetM2" min=0 max=10 style="width: 50px">

*10^<input type ="number" id="expm2" min=1 max=100 style="width: 50px"><br>

скорость вдоль оси 0x <input type ="number" id="PlanetV2_X" min=0 max=2000 style="width: 50px"> км/с<br>

скорость вдоль оси 0y <input type ="number" id="PlanetV2_Y" min=0 max=2000 style="width: 50px"> км/с<br>

Положение по Х <input type ="number" id="PlanetR2_X" min=0 max=30 style="width: 50px"> а.е.<br>

Положение по Y <input type ="number" id="PlanetR2_Y" min=0 max=30 style="width: 50px"> а.е.<br>

<br><br>

масса тела 3, кг<input type ="number" id="PlanetM3" min=0 max=10 style="width: 50px">

*10^<input type ="number" id="expm3" min=1 max=100 style="width: 50px"><br>

скорость вдоль оси 0x<input type ="number" id="PlanetV3_X" min=0 max=2000 style="width: 50px"> км/с<br>

скорость вдоль оси 0y<input type ="number" id="PlanetV3_Y" min=0 max=2000 style="width: 50px"> км/с<br>

Положение по Х <input type ="number" id="PlanetR3_X" min=0 max=30 style="width: 50px"> а.е.<br>

Положение по Y <input type ="number" id="PlanetR3_Y" min=0 max=30 style="width: 50px"> а.е.<br>

<br><br>

время <input type = "number" id = "time" min=1, max=10 style ="width: 50px"> <br>

<span id="span_name">Здесь будет находиться выводимый текст</span>

</body>

</html>

Во втором файле содержится JavaScript код, выполнение которого начинается сразу после загрузки страницы. Он содержит основную последовательность команд, которая записана с помощью функций. Код страницы приведен ниже:

function main_planets()

{

var Planet1 = { //создание объекта - планеты

m:2,

expm:30,

r:new Vector(0.0, 0.0), // расстояние в a.e.= 149 597 870 000 м

v:new Vector(0.0, 0.0) // корость в км/с

};

PlanetM1.value = Planet1.m; // присвоение переменным с HTML страницы

expm1.value = Planet1.expm; // значений полей объекта

PV1x=Planet1.v.x*149597870;

PV1y=Planet1.v.y*149597870;

PlanetV1_X.value = PV1x;

PlanetV1_Y.value = PV1y;

PlanetR1_X.value = Planet1.r.x;

PlanetR1_Y.value = Planet1.r.y;

var Planet2 = {

m:5.97,

expm:24,

r:new Vector(1.0, 0.0),

v:new Vector(0.0,0.00000020) // корость в км/с

};

PlanetM2.value = Planet2.m;

expm2.value = Planet2.expm;

PlanetV2_X.value = Planet2.v.x*149597870;

PlanetV2_Y.value = Planet2.v.y*149597870;

PlanetR2_X.value = Planet2.r.x;

PlanetR2_Y.value = Planet2.r.y;

var Planet3 = {

m:7.3,

expm:22,

r:new Vector(1.00256, 0.0), // расстояние в a.e.= 149 597 870 000 m

v:new Vector(-0.0000000,0.00000020668) // корость в км/с

};

PlanetM3.value = Planet3.m;

expm3.value = Planet3.expm;

PlanetV3_X.value = Planet3.v.x*149597870;

PlanetV3_Y.value = Planet3.v.y*149597870;

PlanetR3_X.value = Planet3.r.x;

PlanetR3_Y.value = Planet3.r.y;

t=1;

ti=100000;

time.value = t

console.log(Planet1.r.lenght())

PlanetM1.oninput= function() {

Planet1.m = parseFloat(PlanetM1.value);

//span_name.innerHTML=Planet1.m;

}

expm1.oninput= function()

{

Planet1.expm=parseFloat(expm1.value); //функции, обновляющие соответствующие переменные, при вводе пользователем новых значений

}

PlanetV1_X.oninput = function()

{

Planet1.v.x=parseFloat(PlanetV1_X.value);

Planet1.v.x = Planet1.v.x/149597870;

}

PlanetV1_Y.oninput = function()

{

Planet1.v.y=parseFloat(PlanetV1_Y.value);

Planet1.v.y = Planet1.v.y/149597870;

}

PlanetR1_X.oninput = function()

{

Planet1.r.x=parseFloat(PlanetR1_X.value);

}

PlanetR1_Y.oninput = function()

{

Planet1.r.y=parseFloat(PlanetR1_Y.value);

}

PlanetM2.oninput= function()

{

Planet2.m = parseFloat(PlanetM2.value);

}

expm2.oninput= function()

{

Planet2.expm=parseFloat(expm2.value);

}

PlanetV2_X.oninput = function()

{

Planet2.v.x=parseFloat(PlanetV2_X.value)/149597870;

}

PlanetV2_Y.oninput = function()

{

Planet2.v.y=parseFloat(PlanetV2_Y.value)/149597870;

}

PlanetR2_X.oninput = function()

{

Planet2.r.x=parseFloat(PlanetR2_X.value);

}

PlanetR2_Y.oninput = function(){

Planet2.r.y=parseFloat(PlanetR2_Y.value);

}

PlanetM3.oninput= function() {

Planet3.m = parseFloat(PlanetM3.value);

}

expm3.oninput= function()

{

Planet3.expm=parseFloat(expm3.value);

}

PlanetV3_X.oninput = function()

{

Planet3.v.x=parseFloat(PlanetV3_X.value)/149597870;

}

PlanetV3_Y.oninput = function()

{

Planet3.v.y=parseFloat(PlanetV3_Y.value)/149597870;

}

PlanetR3_X.oninput = function()

{

Planet3.r.x=parseFloat(PlanetR3_X.value);

}

PlanetR3_Y.oninput = function(){

Planet3.r.y=parseFloat(PlanetR3_Y.value);

}

time.oninput = function()

{

t= parseFloat(time.value);

}

var timerId;

button_calc.onclick = function () // кнопка "сосчитать"

{Planet1.m = parseFloat(PlanetM1.value);

Planet1.expm=parseFloat(expm1.value);//обновление всех переменных в памяти компьютера в соответствии со значениями на странице браузера

Planet1.v.x=parseFloat(PlanetV1_X.value);

Planet1.v.x = Planet1.v.x/149597870;

Planet1.v.y=parseFloat(PlanetV1_Y.value);

Planet1.v.y = Planet1.v.y/149597870;

Planet1.r.x=parseFloat(PlanetR1_X.value);

Planet1.r.y=parseFloat(PlanetR1_Y.value);

Planet2.m = parseFloat(PlanetM2.value);

Planet2.expm=parseFloat(expm2.value);

Planet2.v.x=parseFloat(PlanetV2_X.value)/149597870;

Planet2.v.y=parseFloat(PlanetV2_Y.value)/149597870;

Planet2.r.x=parseFloat(PlanetR2_X.value);

Planet2.r.y=parseFloat(PlanetR2_Y.value);

Planet3.m = parseFloat(PlanetM3.value);

Planet3.expm=parseFloat(expm3.value);

Planet3.v.x=parseFloat(PlanetV3_X.value)/149597870;

Planet3.v.y=parseFloat(PlanetV3_Y.value)/149597870;

Planet3.r.x=parseFloat(PlanetR3_X.value);

Planet3.r.y=parseFloat(PlanetR3_Y.value);

t= parseFloat(time.value);

step();

//span_name.innerHTML=Planet1.m;

//setInterval(step, 1000 / 60);

timerId = setInterval(

step, 1000*t/ 60);

}

button_pause.onclick = function() //кнопка паузы

{

clearInterval(timerId);

}

function step() { // функция, выполняющаяся 60 раз в секунду после нажатия кнопки "сосчитать"

physics();

draw();

}

function physics() { // функция, считающая координаты тел в следующий момент времени

planet1a=ALG.moment_accel(Planet2.r,Planet1.r,Planet3.r,Planet2.m,Planet2.expm,Planet3.m,Planet3.expm);

planet2a=ALG.moment_accel(Planet1.r,Planet2.r,Planet3.r,Planet1.m,Planet1.expm,Planet3.m,Planet3.expm);

planet3a=ALG.moment_accel(Planet1.r,Planet3.r,Planet2.r,Planet1.m,Planet1.expm,Planet2.m,Planet2.expm);

Planet1.v= ALG.momentV(Planet1.v,planet1a,ti);

Planet1.r=ALG.momentR(Planet1.r,Planet1.v,ti);

Planet2.v= ALG.momentV(Planet2.v,planet2a,ti);

Planet2.r=ALG.momentR(Planet2.r,Planet2.v,ti);

Planet3.v= ALG.momentV(Planet3.v,planet3a,ti);

Planet3.r=ALG.momentR(Planet3.r,Planet3.v,ti);

}

var ctx = Planets.getContext("2d");

ctx.strokeStyle = "#f00";

ctx.fillStyle = "#00f";

ctx.lineWidth = 1;

var w = Planets.width;

var h = Planets.height;

function draw() { //функция, рисующая планеты

ctx.clearRect(0, 0, w, h); // отчищение холста после предыдущего кадра

ctx.beginPath();

ctx.fillStyle = "#00f";

ctx.arc(Planet1.r.x*200+w/2,h/2-Planet1.r.y*200, 15, 0, 2*Math.PI)

ctx.fill();

ctx.beginPath();

ctx.fillStyle = "#0f0";

ctx.arc(Planet2.r.x*200+w/2,h/2-Planet2.r.y*200, 5, 0, 2*Math.PI)

ctx.fill();

ctx.beginPath();

ctx.fillStyle = "#f00";

ctx.arc(Planet3.r.x*200+w/2,h/2-Planet3.r.y*200, 3, 0, 2*Math.PI)

ctx.fill();

}

}

Эти функции, в свою очередь, описаны в другом JavaScript файле - библиотеке функций, написанной специально для этой программы. Это было сделано для того, чтобы не «загромождать» основной код описанием мелких действий.

ALG = {}

ALG.sum = function(a, b) {

return a + b;

}

ALG.VectNumbIncr = function(a,n){

c = new Vector;

c.x=a.x*n;

c.y=a.y*n;

return c;

}

ALG.VectLenth = function(a){

c=a.x*a.x+a.y*a.y;

return Math.sqrt(c);

}

ALG.Vectsum = function(a,b) {

c = new Vector;

c.x=a.x+b.x;

c.y=a.y+b.y;

return c;

}

ALG.VectScalIncr = function (a,b){

return a.x*b.x+a.y*b.y;

}

ALG.VectDecreace = function(a,b){

c = new Vector;

c.x = a.x-b.x;

c.y = a.y-b.y;

return c;

}

ALG.moment_accel=function(r1,r2,r3,m1,expm1,m3,expm3){ //ускорение тела r2 m2

r21=ALG.VectDecreace(r1,r2);

eR1=ALG.VectNumbIncr(r21,1/ALG.VectLenth(r21));

r23=ALG.VectDecreace(r3,r2);

eR3=ALG.VectNumbIncr(r23,1/ALG.VectLenth(r23));

absA21 = 2.98043 *m1/ALG.VectScalIncr(r21,r21);

absA23 = 2.98043 *m3/ALG.VectScalIncr(r23,r23); //0.044614

expm1=expm1-33;

expm3=expm3-33;

a21=ALG.VectNumbIncr(eR1,absA21);

a23=ALG.VectNumbIncr(eR3,absA23);

exp1 = Math.pow(10, expm1);

exp3 = Math.pow(10, expm3);

a21=ALG.VectNumbIncr(a21,exp1);

a23=ALG.VectNumbIncr(a23,exp3);

a2=ALG.Vectsum(a21,a23);

a2=ALG.VectNumbIncr(a2,1/149597870000);

return a2;

}

ALG.momentV = function (v,a,ti){

dv=ALG.VectNumbIncr(a,ti);

v1=ALG.Vectsum(dv,v);

return v1;

}

ALG.momentR = function(r,v,ti){

dr=ALG.VectNumbIncr(v,ti);

r1=ALG.Vectsum(dr,r);

return r1;

}

Также используется отдельный файл, содержащий описание действий с векторными величинами. Простые операции как сложение векторов, нормирование вектора, скалярное произведение и многие другие очень часто используются при решении данной проблемы. Использование векторных функций, описанных в библиотеке, вместо использования в программе действий с координатами векторов сильно сократило размер программы и облегчило понимание кода, поскольку большинство величин, с которыми мы сталкиваемся в этой задаче - векторные.

В вопросе систематизации переменных был применен подход объектно-ориентированного программирования: планеты создавались как объекты, обладающие различными свойствами: массой, скоростью, положением в пространстве.

Результаты

Результатом работы является программа, наглядно демонстрирующая поведение системы, заданной пользователем конфигурации.

Рисунок 1 Результат работы программы

Рисунок 2 Вид панели управления программы

Пользователь может ввести свои данные, и после нажатия кнопки «сосчитать» запускается анимация, которую можно остановить, нажав на кнопку «Пауза». Чтобы ввести новые значения и посмотреть, каким будет поведение системы без перезагрузки страницы, нужно нажать кнопку «Пауза», ввести значения, нажать кнопку «Сосчитать» и наблюдать результат. Параметр «время» также можно менять - от этого будет меняться скорость воспроизведения анимации.

Возможности развития программы

программа визуализация движение космос

В данной модели рассматривается пока только плоское движение. В плане развития программы разработка трехмерной визуализации движения. С точки зрения физики программа при этом не усложнится, увеличится часть кода, отвечающая за визуализацию.

Вторым важным моментом, требующем доработки является автоматическая установка масштаба изображения. Это нужно для того, чтобы пользователь мог видеть всю картину происходящего, при чем достаточно крупно.

Третьим пунктом возможного развития продукта является создание функции, анализирующей систему с точки зрения связей. То есть пользователь помимо анимации будет получать еще и информацию, какие тела находятся на устойчивых орбитах, а какие по прошествии большого времени будут иметь практически прямую траекторию и не вернутся в систему.

Список литературы

1. www.w3schools.com

2. learn.javascript.ru.

3. http://tm.spbstu.ru/_JavaScript

4. http://tm.spbstu.ru/Различные_цветовые_модели_и_их_использование

5. Роберт Лафоре. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. -923 с

6. https://ru.wikipedia.org/wiki/JavaScript

7. http://habrahabr.ru/

8. Бер Бибо, Иегуда Кац. jQuery. Подробное руководство по продвинутому JavaScript, 2-е издание. Пер. с англ. СПб.: Символ-Плюс, 2011. 624 с.

9. http://ru.html.net/

10. http://professorweb.ru/my/javascript/js_theory/level1/javascript_index.php

Размещено на Allbest.ru


Подобные документы

  • Возможности библиотеки OpenGL, создание матрицы и эффекта тумана. Разработка процедуры визуализации трехмерной модели "Корабль", интерфейса пользователя и подсистемы управления событиями. Логическая структура и функциональная декомпозиция проекта.

    курсовая работа [507,2 K], добавлен 02.07.2011

  • Изучение возможностей программы "Поверхность": рассмотрение методов построения изолиний, диаграмм Вороного, профиля, интерполированного графика, трехмерной визуализации, поверхностей методом триангуляции Делоне и проведение расчета зон прямой видимости.

    краткое изложение [3,6 M], добавлен 11.02.2010

  • Лазерные средства отображения информации. Особенности сопряжения имитационной модели Matlab-Simulink и программное обеспечение визуализации. Возможности средств разработки виртуальных миров, использующих VRML, для визуализации моделирования системы.

    курсовая работа [1,6 M], добавлен 01.12.2014

  • Изучение моделирования и визуализации трехмерных динамических сцен в пакете 3Ds Max на примере создания анимированной сцены, содержащей мышь, стул, чашку, чайную ложку и море. Создание материалов, камер и анимации, постановка света и визуализация сцены.

    курсовая работа [1,2 M], добавлен 26.02.2012

  • Назначение и возможности разработанного приложения для визуализации картографической информации. Хранимые процедуры, функции и триггеры. Взаимодействие пользователя с приложением. Описание экранной формы по работе с картами. Визуализация карты в MS Visio.

    курсовая работа [2,1 M], добавлен 14.08.2014

  • Особенности разработки и реализации модулей двухмерной и трехмерной визуализации. Основные задачи трехмерного модуля управления. Анализ функций модуля управления ParamColorDrawer. Характерные особенности схемы функционирования программного средства.

    реферат [2,2 M], добавлен 07.03.2012

  • Этапы развития моделирования явлений, процессов, объектов, устройств и систем. Примеры математического, имитационного и физического построения. Воспроизведение транспортных систем городов с помощью программы для визуализации транспортной схемы VISUM.

    реферат [29,5 K], добавлен 16.12.2010

  • Разработка автоматизированной системы реализации модели движения тела переменной массы на примере движения одноступенчатой ракеты, расчет времени и скорости полета. Описание формы загрузки программы. Требование к программному и техническому обеспечению.

    курсовая работа [255,0 K], добавлен 18.03.2012

  • Разработка программного продукта "Железная дорога". Вид и классификация инструментальных средств, используемых для создания прикладного ПО. Организация взаимодействия клиентской программы с базой данных; реализация системы контроля движения поездов.

    курсовая работа [895,0 K], добавлен 11.11.2010

  • Освоение методов манипуляции параметрами SVG изображений при помощи JavaScript и возможности по анимации в современных браузерах. Интерфейс и структура модуля визуализации данных. Определение аномальных данных и их определение, реализованные типы.

    курсовая работа [1,7 M], добавлен 20.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.