Движение по окружности: Now some fun stuff!
Запись от ZackMercury размещена 26.12.2018 в 23:12
Немножечко пошалим с разными функциями: движение по окружности с помощью тригонометрических функций описывается с помощью одной переменной t и параметрической функции двух параметров x=rcos(t), y=rsin(t).
Движение по окружности способом, который описал я описывается с помощью вектора скорости(из одной компоненты) - speed.
Почему я назвал speed вектором?
Вектором принято считать любую конструкцию, которая имеет величину и направление. Так как speed может описывать как движение в одну сторону будучи положительным, так и движение в другую сторону, будучи отрицательным, тоесть, speed имеет величину И направление, а значит, является вектором.
Это позволяет нам не просто менять положение, а менять скорость динамически, создавая иллюзию воздействия сил на синий мячик.
То же самое можно сделать, добавив скорость движению по окружности в тригонометрическом виде. Но раз у нас есть всё это в чистом виде без необходимости ничего добавлять, нам предоставилась возможность поиграть со скоростью движения по окружности.
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);
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);
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);
А теперь задачка:
Возможно ли идеально описать последнее движение с помощью тригонометрических функций без введения переменной скорости?
...
Решение:
Да, возможно. Если вы честно сдавали экзамен по матанализу, физике, то знаете, что, чтобы найти функцию скорости объекта, имея функцию, описывающую положение объекта, нужно найти производную функции положения объекта.
Итого, выходит, что имея функцию скорости объекта, нам нужно каким-то образом найти анти-производную, тоесть, сделать обратное действие нахождению производной, и мы получим функцию положения объекта.
Есть ли в математике анти-производная? Да.
Такая операция называется нахождение неопределённого интеграла, или анти-производной какой-либо функции.
(На картинке - определённый интеграл, так как в графическом калькуляторе нельзя задать неопределённый интеграл)
Для того, чтобы это сделать, нам необязательно изучать целый курс математики, нам достаточно помнить, что так можно, и открыть любой калькулятор вроде этого.
https://www.symbolab.com/solver/inde...t)%5Csin%20xdx
На выходе получится функция, описывающая положение объекта.
В нашем случае это будет f(t), а положение объекта будет описываться так:
x = rcos(f(t));
y = rsin(f(t));
Далее несложно описать это всё кодом.
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);
Насколько можно заметить, в этом методе отсутствуют погрешности, неточности, всё идеально чётко и ровно
Всего комментариев 0
Комментарии
Последние записи от ZackMercury
- Вывод формулы для бесконечного цикла. (11.01.2019)
- Как заменить цикл на формулу. (10.01.2019)
- Конечные и бесконечные суммы, Ч. 1 (08.01.2019)
- Как легко запомнить тригонометрические функции (07.01.2019)
- Движение по треугольнику, квадрату, пентагону, хексагону, ... (05.01.2019)