Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.06.2011, 23:22
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 1  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
По умолчанию Орбитальные исчисления

Здравствуйте.
Подскажите пожалуйста правильное описание законов которые заставляют держаться Луне на орбите Земли.
Использую Box2D и радиальную гравитацию но этого оказалось не достаточно или же я задаю не правильно координаты (1тыс.км=1пиксель, остальные данные беру из гугла (радиус земли/луны и расстояния между ними)), после чего наделяю импульсом Луну, но как задать правильно его силу и направление остаётся лишь загадкой.

Если кто использовал уже или видел мануал по описи законов орбит земли и луны буду очень признателен.

p.s. Заточка под Box2D не обязательно.

p.p.s. Заранее благодарю

Добавлено через 4 минуты
Отличный донор http://armorgames.com/play/2016/orbitrunner
__________________
return this...

Старый 10.06.2011, 00:03
MAPUTO вне форума Посмотреть профиль Отправить личное сообщение для MAPUTO Найти все сообщения от MAPUTO
  № 2  
Ответить с цитированием
MAPUTO
 
Аватар для MAPUTO

Регистрация: Mar 2011
Сообщений: 38
Для каждого тела создаешь параметры масса, скоростьХ и скоростьУ.

каждый кадр высчитываешь новые значения скорости для каждого обекта:
угол между вектором скорости и осью Х:

Код:
угол = Math.atan(РасстояниеУ / РасстояниеХ);
РасстояниеХ и РасстояниеУ - разности координат по Х и по У между объектами.

Код:
скоростьХ += коэффициент*(объект_N.масса / (масса*расстояние)) * Math.cos(угол);
скоростьУ += коэффициент*(объект_N.масса / (масса*расстояние)) * Math.sin(угол);
коэффициент необходим для подгонки движения.
Ну а скорости каждый кадр можно просто складывать с координатами объектов.

Если в процессе участвует несколько объектов - через цикл перебираются все объекты с этими формулами.


Последний раз редактировалось MAPUTO; 10.06.2011 в 01:43.
Старый 10.06.2011, 01:21
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 3  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
MAPUTO, откуда блин эта формула? %)
Закон всемирного тяготения, параметры орбит и масс из тырнета, считать методом Эйлера. Никаких подгонок, всё честно и так получается.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 10.06.2011, 01:44
MAPUTO вне форума Посмотреть профиль Отправить личное сообщение для MAPUTO Найти все сообщения от MAPUTO
  № 4  
Ответить с цитированием
MAPUTO
 
Аватар для MAPUTO

Регистрация: Mar 2011
Сообщений: 38
А зачем усложнять задачу?
ПРИМЕР

Старый 10.06.2011, 01:49
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 5  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Закон всемирного тяготения, параметры орбит и масс из тырнета, считать методом Эйлера. Никаких подгонок, всё честно и так получается.
В том то и дело что орбиту я немогу правильно определить. Так как если не трогать объекты они будут просто сближаться, а правильно угадать вектор-импульса мне кажется не реально.

Боюсь раздел могут перенести в API
Код AS3:
var eS:b2CircleShape = CreateCircleShape(6.378); // 6378км радиус земли
				var eF:b2FixtureDef = CreateFix(eS,1);
				var eB:b2Body = CreateBody(eF,400,200);
 
 
				var lS:b2CircleShape = CreateCircleShape(1.737); // 1737 радиус луны
				var lF:b2FixtureDef = CreateFix(lS,1);
				var lB:b2Body = CreateBody(lF,384.467+400,200); // 384467 расстояние между ихними центрами
 
				m_world.SetGravity(new b2Vec2(0,0));
 
				m_world.AddController( cosmicgravity);
масса пропорциональна радиусу объекта но вопрос в том куда запускать "Луну" и с какой силой
Вложения
Тип файла: rar v.rar (688.4 Кб, 33 просмотров)
__________________
return this...


Последний раз редактировалось AlexCooper; 10.06.2011 в 02:04.
Старый 10.06.2011, 02:07
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 6  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Добавил исходник.
Если не сложно помогите правильно задать вектор направления
Тела задаются в VirtualLabs.as начиная с строки 286

Гравитация просчитывается \Box2D\Dynamics\Controllers\b2GravityController.as
__________________
return this...

Старый 10.06.2011, 02:09
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 7  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
MAPUTO, какое отношение имеет эта хрень к движению планет?
У меня можно запустив их изначально найти период обращения и перигей и они таки совпадут с тем, что реально есть)
Код AS3:
public var moon:Sprite = new Sprite();
		public var moonA:Point = new Point();//в км/сек^2
		public var moonV:Point = new Point();////в км/сек
		public var moonPos:Point = new Point();//в км
		public const G:Number = 6.6725e-11 /*это в м^3/(кг*сек^2), а нам нужны километры, потому множим на*/ * 1e-9;
		public const M:Number = 5.9736e24;//в кг
 
		public var timeStep:Number = 3600;//шаг по времени, в секундах, чем меньше, тем точнее. Луна меедленно крутится)
 
		public const orbitScreenCenter:Point = new Point(200, 200);
		public const orbitScale:Point = new Point(1/2000, 1/2000);//масштаб, в 1 пикселе 2000 км
 
		public var apo:Number = 0;//используем для подсчета апогея
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addEventListener(Event.ENTER_FRAME, update);
 
			graphics.lineStyle(0);
			moon.graphics.lineStyle(0);
			moon.graphics.drawCircle(0, 0, 10);
			addChild(moon);
			var Earth:Sprite = new Sprite();
			Earth.graphics.lineStyle(0);
			Earth.graphics.drawCircle(0, 0, 20);
			addChild(Earth);
			Earth.x = orbitScreenCenter.x;
			Earth.y = orbitScreenCenter.y;
			//начальное положение (апогей), данные НАСА http://nssdc.gsfc.nasa.gov/planetary.../moonfact.html
			moonPos.x = 0.4055e6;
			moonPos.y = 0;
			moonV.x = 0;//супермозг нужен, чтоб понять, что тут нули, лол
			moonV.y = 0.964;
 
			moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x;
			moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y;
		}
		public function update(event:Event):void {
			var moonDist:Number = moonPos.length;
			moonA.x = - G * M * moonPos.x / (moonDist * moonDist * moonDist);//з-н всемирного тяготения в проекции на ось х, обе части разделены на массу Луны (ибо нам нужна не сила, а ускорение)
			moonA.y = - G * M * moonPos.y / (moonDist * moonDist * moonDist);
//в box2d можно лепить это ускорение каждый кадр, положение и скорости оно посчитает само, ну мне и самому не сложно, внимание, Метод Эйлера)
			moonV.x += timeStep * moonA.x;
			moonV.y += timeStep * moonA.y;
			moonPos.x += timeStep * moonV.x;
			moonPos.y += timeStep * moonV.y;
 
			graphics.moveTo(moon.x, moon.y);
			moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x;
			moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y;
			graphics.lineTo(moon.x, moon.y);
			if (moonPos.x < apo) {
				apo = moonPos.x;
				trace(-apo);
			}
		}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 10.06.2011, 02:27
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 8  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
-De-
Можете повторить только с добавление исходника. Дело в том что только недавно перешёл на АС3, еще есть с этим сложности.
__________________
return this...

Старый 10.06.2011, 09:55
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 9  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Ну вот как Document Class. Не думаю, что исходники без .fla чем-то помогут) Если проблемы и с этим, то читать как использовать примеры от адоба, читать про классы в AS3.
Код AS3:
package 
{
	import flash.display.*;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.utils.*;
 
	/**
	 * ...
	 * @author de
	 */
	public class Main extends Sprite 
	{
		public var shape2:Shape = new Shape();
		public var moon:Sprite = new Sprite();
		public var moonA:Point = new Point();//в км/сек^2
		public var moonV:Point = new Point();////в км/сек
		public var moonPos:Point = new Point();//в км
		public const G:Number = 6.6725e-11 /*это в м^3/(кг*сек^2), а нам нужны километры, потому множим на*/ * 1e-9;
		public const M:Number = 5.9736e24;//в кг
 
		public var timeStep:Number = 3600;//шаг по времени, в секундах, чем меньше, тем точнее. Луна меедленно крутится)
 
		public const orbitScreenCenter:Point = new Point(200, 200);
		public const orbitScale:Point = new Point(1 / 2000, 1 / 2000);//масштаб, в 1 пикселе 2000 км
		public var apo:Number = 0;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addEventListener(Event.ENTER_FRAME, update);
			graphics.lineStyle(0);
			moon.graphics.lineStyle(0);
			moon.graphics.drawCircle(0, 0, 10);
			addChild(moon);
			var Earth:Sprite = new Sprite();
			Earth.graphics.lineStyle(0);
			Earth.graphics.drawCircle(0, 0, 20);
			addChild(Earth);
			Earth.x = orbitScreenCenter.x;
			Earth.y = orbitScreenCenter.y;
			//начальное положение (апогей), данные НАСА http://nssdc.gsfc.nasa.gov/planetary.../moonfact.html
			moonPos.x = 0.4055e6;
			moonPos.y = 0;
			moonV.x = 0;
			moonV.y = 0.964;
 
			moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x;
			moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y;
		}
 
		public function update(event:Event):void {
			var moonDist:Number = moonPos.length;
			moonA.x = - G * M * moonPos.x / (moonDist * moonDist * moonDist);//з-н всемирного тяготения в проекции на ось х, обе части разделены на массу Луны (ибо нам нужна не сила, а ускорение)
			moonA.y = - G * M * moonPos.y / (moonDist * moonDist * moonDist);
			//в box2d можно лепить это ускорение каждый кадр, положение и скорости оно посчитает само, ну мне и самому не сложно, внимание, Метод Эйлера)
			moonV.x += timeStep * moonA.x;
			moonV.y += timeStep * moonA.y;
			moonPos.x += timeStep * moonV.x;
			moonPos.y += timeStep * moonV.y;
 
			graphics.moveTo(moon.x, moon.y);
			moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x;
			moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y;
			graphics.lineTo(moon.x, moon.y);
			if (moonPos.x < apo) {
				apo = moonPos.x;
				trace(-apo);
			}
		}
 
	}
 
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 10.06.2011, 13:32
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 10  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Спасибо) Помоему лучший на сегодня подарок ко дню рождения))

Добавлено через 3 часа 0 минут
-De-
Пример действительно хорош, но при статическом положения Земли, дополнив функцию Update этими строчками
Код AS3:
orbitScreenCenter.x = (Math.abs(Earth.x-mouseX)<5) ? orbitScreenCenter.x : (Earth.x += (mouseX<Earth.x) ? -1 : 1);
orbitScreenCenter.y = (Math.abs(Earth.y-mouseY)<5) ? orbitScreenCenter.y : (Earth.y += (mouseY<Earth.y) ? -1 : 1);
меня ожидало разочарование, так как Луна остаётся стабильна относительно своей орбиты около Земли и при изменении положения Земли выход из орбиты невозможен, а это не то к чему я стремился.
__________________
return this...


Последний раз редактировалось AlexCooper; 10.06.2011 в 16:36.
Создать новую тему Ответ Часовой пояс GMT +4, время: 02:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.