Движение по треугольнику, квадрату, пентагону, хексагону, ...
Запись от ZackMercury размещена 05.01.2019 в 23:32
Ясно с движением по окружности, но как же быть, например, с движением по квадрату?
Как двигать объект по треугольнику, пентагону?
Когда-то давно с похожей целью бродя по интернетам, я набрёл на вот эту удивительную формулу, которая поначалу кажется какой-то магией.
https://www.desmos.com/calculator/hghrnwbcdh
То, что нас интересует - это формула вписанного н-угольника в круг с радиусом 1.
Конечно, в полярных координатах.
,
где n - количество сторон равностороннего многоугольникаКак это работает? Потратив один день на изучение примера, посоветовавшись с людьми, которые хорошо разбираются в теме, я таки разобрал этот пример на части.
Окей, числитель этой дроби нужен для того, чтобы из описанного многоугольника сделать вписанный.
Он есть константа для многоугольника, у которого не меняется число сторон.
Далее, если идти по логическим шагам изобретения этой формулы, нам нужно для начала научиться строить простую линию в полярных координатах.
Простейший случай линии в декартовых координатах - это
X = Radius
Так как мы знаем, чему равен X в полярных координатах, давайте заменим его на rcos(theta)
rcos(theta)=Radius
далее нам нужно получить уравнение в полярных координатах, а значит, с одной из сторон должен быть r.
Разделим обе части уравнения на cos(theta), cos(theta) слева сократится, в итоге останется
r = Radius / cos(theta).
Таким образом, мы получили уравнение прямой X = Radius в полярных координатах.
Далее, немного математики, чтобы научиться вертеть эту прямую
https://www.desmos.com/calculator/tu07tefm4j
Таким образом, можно написать уравнение для одной из сторон многоугольника, используя n.
https://www.desmos.com/calculator/owctc8edtn
Как можно заметить, второй аргумент косинуса здесь - угол в радианах.
Далее, последняя часть, самая загадочная для меня на данный момент - чтобы сделать функцию периодичной, мы заворачиваем её в арксинус синуса.
В итоге получается
import flash.utils.getTimer; var radiusOfRotation:Number = Math.sqrt(Math.pow(blueBall.x - greenBall.x,2) + Math.pow(blueBall.y - greenBall.y,2)); var sides:int = 4; function update(e:Event = null):void { var t:Number = getTimer() / 200; var r:Number = radiusOfRotation*Math.cos(Math.PI/sides)/Math.cos(2/sides*Math.asin(Math.cos(sides/2*t))); blueBall.x = greenBall.x + r * Math.cos(t); blueBall.y = greenBall.y + r * Math.sin(t); } function onSliderChange(e:Event = null):void { sides = slider.value; } addEventListener(Event.ENTER_FRAME, update); slider.addEventListener(Event.CHANGE, onSliderChange);
Всего комментариев 2
Комментарии
07.01.2019 17:58 | |
Мне кажется или он на углах ускоряется?
|
Последние записи от ZackMercury
- Вывод формулы для бесконечного цикла. (11.01.2019)
- Как заменить цикл на формулу. (10.01.2019)
- Конечные и бесконечные суммы, Ч. 1 (08.01.2019)
- Как легко запомнить тригонометрические функции (07.01.2019)
- Движение по треугольнику, квадрату, пентагону, хексагону, ... (05.01.2019)