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

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

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

Регистрация: Jan 2009
Сообщений: 1,651
По умолчанию Баллистическая задача

Не знаю, правильно ли я выбрал раздел, сделаю пост сюда.

Классика, из пункта А со скоростью V под углом тета вылетает снаряд.

Для этой задачи можно использовать школьную параметрическую формулу от времени:
Код:
Vx = V * cos(teta);
Vy = V * sin(teta);
x(t) = x0 + Vx*t;
y(t) = y0 + Vy*t - g*t*t/2; //g - гравитация
Но, если, мне все равно изобразить на экране летящий снаряд, то логично просто каждый кадр летящего снаряда:
Код:
x = x+Vx;
y = y+Vy;
Vy -= g;
Математика пятого класса, как-никак. Да и, собственно Vy = y'(t) = v - gt, т.е. одно и то же.

Проблема в том, что траектории варианта 1 и варианта 2 не совпадают. А так как алгоритмы, типа: "знаем скорость и конечную точку, посчитаем угол"(нужны для расчета выстрела компьютерного оппонента) опираются на t, то снаряд промахивается. Наглядно рисуем траектории:
Код AS3:
var x0:Number = 100;
var y0:Number = 200;
var angle:Number = -45;
var gravity:Number = 3;
var t:Number = 100;
var v:Number = 25;
 
var vx0:Number = v*Math.cos(angle * Math.PI/180);
var vy0:Number = v*Math.sin(angle * Math.PI/180);
 
graphics.lineStyle(1,0xff0000);
graphics.moveTo(x0,y0);
for (var i:Number =0; i<t; i++){
	graphics.lineTo(x0+vx0*i,y0+vy0*i + gravity*i*i*0.5);
}
 
graphics.lineStyle(1,0x00ff00);
graphics.moveTo(x0,y0);
var curx:Number = x0, cury:Number = y0, vy:Number = vy0;
for (i = 0; i<t; i++){
	curx+=vx0; 
	cury+=vy;
	vy+=gravity;
	graphics.lineTo(curx,cury);
}
Вот я и думаю, откуда вылазит такая ошибка. Это накопление погрешности, или ошибка в расчетах.
__________________
мой пустой блог

Старый 31.08.2012, 20:35
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
y = y+Vy;
Вот это вот неправильно. У вас же скорость за "единицу" времени непостоянно. Поэтому при умножении "мгновенной" скорости на промежуток времени получается ошибка.

Старый 31.08.2012, 20:48
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 3  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Слушай, а точно. Если уменьшить шаг:
Код AS3:
graphics.lineStyle(1,0x00ff00);
graphics.moveTo(x0,y0);
var curx:Number = x0, cury:Number = y0, vy:Number = vy0;
for (i = 0; i<t; i+=0.1){
	curx+=vx0*0.1; 
	cury+=vy*0.1;
	vy+=gravity*0.1;
	graphics.lineTo(curx,cury);
}
То погрешность значительно уменьшается.
__________________
мой пустой блог

Старый 31.08.2012, 21:06
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Ну так то, что точность растет, вполне естественно. Вы на самом деле численно интеграл скорости по времени считаете . И при уменьшении интервала (и увеличения их количества) точность возрастает. В пределе как раз и будет точное значение. Это все из определения интеграла следует.

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Для данной конкретной формулы можно ошибку при числовом решении загнать считай в 0.
Код AS3:
vy+=gravity*0.5;
	curx+=vx0; 
	cury+=vy;
	vy+=gravity*0.5;
Но если есть формула, то почему бы по ней не посчитать?
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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