Оптимизация движения по окружности
Нормализация вектора включает извлечение квадратного корня для получения его длины и деление компонентов на его длину. Корни - чуть(почти в 2 раза) менее затратная операция, чем тригонометрия. Да, мы делаем её дважды, точно также, как дважды мы вызываем тригонометрическую функцию (sin - 1 и cos - 2).
Поэтому наш алгоритм должен работать в 2 раза более производительно, чем использование тригонометрической функции.
Однако, возможно улучшить производительность ещё в 2 раза, отказавшись от корней в главном цикле.
Делать такое можно только при неизменной скорости вращения, но то, что мы получили - это вращение без использования корней и тригонометрии в основном цикле.
var greenBallCoords:Point = new Point(greenBall.x, greenBall.y); var r:Point = new Point(); var v:Point = new Point(); const speed:Number = 5; //The distance between 2 balls var radiusOfRotation:Number = Math.sqrt(Math.pow(blueBall.x - greenBall.x,2) + Math.pow(blueBall.y - greenBall.y,2)); //defining the radius vector r.x = blueBall.x; r.y = blueBall.y; r = r.subtract(greenBallCoords); //defining the velocity vector as a radius vector, rotated counterclockwise by 90 deg v.x = r.y; v.y = -r.x; //shrinking its length to the speed v.normalize(speed); blueBall.x += v.x; blueBall.y += v.y; //getting the r1 length var newRadius:Number = Math.sqrt(Math.pow(blueBall.x - greenBall.x,2) + Math.pow(blueBall.y - greenBall.y,2)); //this is what makes our life easier: we can normalize by dividing by the new radius vector length and multiply by the radiusOfRotation at the same time var rOverR1:Number = radiusOfRotation / newRadius; //same goes with the velocity vector, we can normalize it by dividing it by the radiusOfRotation length and multiplying by the speed itself var speedOverRadius:Number = speed / radiusOfRotation; //here goes our main loop function update(e:Event = null):void { r.x = blueBall.x; r.y = blueBall.y; r = r.subtract(greenBallCoords); v.x = r.y; v.y = -r.x; v.x *= speedOverRadius; v.y *= speedOverRadius; blueBall.x += v.x; blueBall.y += v.y; var r1:Point = new Point(blueBall.x, blueBall.y); r1 = r1.subtract(greenBallCoords); r1.x *= rOverR1; r1.y *= rOverR1; r1 = r1.add(greenBallCoords); blueBall.x = r1.x; blueBall.y = r1.y; } addEventListener(Event.ENTER_FRAME, update);
Всего комментариев 0
Комментарии
Последние записи от ZackMercury
- Вывод формулы для бесконечного цикла. (11.01.2019)
- Как заменить цикл на формулу. (10.01.2019)
- Конечные и бесконечные суммы, Ч. 1 (08.01.2019)
- Как легко запомнить тригонометрические функции (07.01.2019)
- Движение по треугольнику, квадрату, пентагону, хексагону, ... (05.01.2019)