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

Вернуться   Форум Flasher.ru > Блоги > ZackMercury

Оценить эту запись

Движение по окружности: Now some fun stuff!

Запись от ZackMercury размещена 26.12.2018 в 23:12

Немножечко пошалим с разными функциями: движение по окружности с помощью тригонометрических функций описывается с помощью одной переменной t и параметрической функции двух параметров x=rcos(t), y=rsin(t).
Движение по окружности способом, который описал я описывается с помощью вектора скорости(из одной компоненты) - speed.
Почему я назвал speed вектором?
Вектором принято считать любую конструкцию, которая имеет величину и направление. Так как speed может описывать как движение в одну сторону будучи положительным, так и движение в другую сторону, будучи отрицательным, тоесть, speed имеет величину И направление, а значит, является вектором.

Это позволяет нам не просто менять положение, а менять скорость динамически, создавая иллюзию воздействия сил на синий мячик.
То же самое можно сделать, добавив скорость движению по окружности в тригонометрическом виде. Но раз у нас есть всё это в чистом виде без необходимости ничего добавлять, нам предоставилась возможность поиграть со скоростью движения по окружности.
Код AS3:
import flash.utils.getTimer;
var greenBallCoords:Point = new Point(greenBall.x, greenBall.y);
var r:Point = new Point();
 
var v:Point = new Point();
var speed:Number = 5;
 
function update(e:Event = null)
{
	speed = Math.sin(getTimer()/1000)*30;
	r.x = blueBall.x;
	r.y = blueBall.y;
	r = r.subtract(greenBallCoords);	
	v.x = r.y;
	v.y = -r.x;
	v.normalize(speed);
 
	blueBall.x += v.x;
	blueBall.y += v.y;
 
	var r1:Point = new Point(blueBall.x, blueBall.y);
	r1 = r1.subtract(greenBallCoords);
	r1.normalize(r.length);
	r1 = r1.add(greenBallCoords);
	blueBall.x = r1.x;
	blueBall.y = r1.y;
}
addEventListener(Event.ENTER_FRAME, update);
circularButNotHarmonicMotion1.swf   (1.0 Кб)

Код AS3:
import flash.utils.getTimer;
var greenBallCoords:Point = new Point(greenBall.x, greenBall.y);
var r:Point = new Point();
 
var v:Point = new Point();
var speed:Number = 5;
 
function update(e:Event = null)
{
	speed = 2 + Math.pow(Math.sin(getTimer()/1000),2)*4;
	r.x = blueBall.x;
	r.y = blueBall.y;
	r = r.subtract(greenBallCoords);	
	v.x = r.y;
	v.y = -r.x;
	v.normalize(speed);
 
	blueBall.x += v.x;
	blueBall.y += v.y;
 
	var r1:Point = new Point(blueBall.x, blueBall.y);
	r1 = r1.subtract(greenBallCoords);
	r1.normalize(r.length);
	r1 = r1.add(greenBallCoords);
	blueBall.x = r1.x;
	blueBall.y = r1.y;
}
addEventListener(Event.ENTER_FRAME, update);
circularButNotHarmonicMotion2.swf   (1.0 Кб)
Код AS3:
import flash.utils.getTimer;
var greenBallCoords:Point = new Point(greenBall.x, greenBall.y);
var r:Point = new Point();
var radiusOfRotation:Number = Math.sqrt(Math.pow(blueBall.x - greenBall.x,2) + Math.pow(blueBall.y - greenBall.y,2));
var v:Point = new Point();
var speed:Number = 5;
 
function update(e:Event = null)
{
	speed = 10*Math.pow(Math.sin(5*getTimer()/1000),2)*Math.sin(getTimer()/1000);
	r.x = blueBall.x;
	r.y = blueBall.y;
	r = r.subtract(greenBallCoords);	
	v.x = r.y;
	v.y = -r.x;
	v.normalize(speed);
 
	blueBall.x += v.x;
	blueBall.y += v.y;
 
	var r1:Point = new Point(blueBall.x, blueBall.y);
	r1 = r1.subtract(greenBallCoords);
	r1.normalize(radiusOfRotation);
	r1 = r1.add(greenBallCoords);
	blueBall.x = r1.x;
	blueBall.y = r1.y;
}
addEventListener(Event.ENTER_FRAME, update);
circularButNotHarmonicMotion.swf   (1.0 Кб)
Функции, которые я использовал:
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 146
Размер:	51.4 Кб
ID:	621

А теперь задачка:
Возможно ли идеально описать последнее движение с помощью тригонометрических функций без введения переменной скорости?

...

Решение:

Да, возможно. Если вы честно сдавали экзамен по матанализу, физике, то знаете, что, чтобы найти функцию скорости объекта, имея функцию, описывающую положение объекта, нужно найти производную функции положения объекта.

Итого, выходит, что имея функцию скорости объекта, нам нужно каким-то образом найти анти-производную, тоесть, сделать обратное действие нахождению производной, и мы получим функцию положения объекта.
Есть ли в математике анти-производная? Да.
Такая операция называется нахождение неопределённого интеграла, или анти-производной какой-либо функции.
Название: Снимок2.PNG
Просмотров: 146

Размер: 22.8 Кб
(На картинке - определённый интеграл, так как в графическом калькуляторе нельзя задать неопределённый интеграл)

Для того, чтобы это сделать, нам необязательно изучать целый курс математики, нам достаточно помнить, что так можно, и открыть любой калькулятор вроде этого.
https://www.symbolab.com/solver/inde...t)%5Csin%20xdx

На выходе получится функция, описывающая положение объекта.
В нашем случае это будет f(t), а положение объекта будет описываться так:
x = rcos(f(t));
y = rsin(f(t));
Далее несложно описать это всё кодом.
Код AS3:
import flash.utils.getTimer;
 
var radiusOfRotation:Number = Math.sqrt(Math.pow(blueBall.x - greenBall.x,2) + Math.pow(blueBall.y - greenBall.y,2));
 
function update(e:Event = null)
{
	var t:Number = getTimer() / 1000;
	var f:Number = Math.PI*(-2*Math.pow(Math.sin(5*t),2)*Math.cos(t)+
					-5/11*Math.cos(11*t) - 5/9 * Math.cos(9*t));
	blueBall.x = greenBall.x + radiusOfRotation * Math.cos(f + Math.PI);
	blueBall.y = greenBall.y + radiusOfRotation * Math.sin(f + Math.PI);
}
addEventListener(Event.ENTER_FRAME, update);
circularButNotHarmonicMotion4.swf   (0.9 Кб)

Насколько можно заметить, в этом методе отсутствуют погрешности, неточности, всё идеально чётко и ровно
Вложения
Тип файла: swf circularButNotHarmonicMotion1.swf (996 байт, 250 просмотров)
Тип файла: swf circularButNotHarmonicMotion2.swf (1,011 байт, 259 просмотров)
Тип файла: swf circularButNotHarmonicMotion.swf (1.0 Кб, 261 просмотров)
Тип файла: swf circularButNotHarmonicMotion4.swf (933 байт, 256 просмотров)
Всего комментариев 0

Комментарии

 

 


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


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