Я хочу перемещать частицу по спирали с постоянной скоростью. Обратите внимание, что это не постоянная угловая скорость. Это довольно сложно, и я покажу свой метод ниже.
Спираль, о которой идет речь, - это классическая архимедова спираль с полярным уравнением r = ϑ
и параметрическими уравнениями x = t*cos(t), y = t*sin(t)
. Это выглядит так:
Я хочу переместить частицу по спирали, поэтому наивно я могу просто указать положение частицы как значение t, а скорость - как увеличение t. Таким образом, частица движется по спирали с постоянной угловой скоростью. Однако это означает, что чем дальше от центра он становится, тем выше его (не угловая) скорость.
Таким образом, вместо того, чтобы иметь мою скорость в увеличении t, я хочу мою скорость как увеличение длины дуги. Получение длины дуги спирали является первой проблемой, но из-за того, что архимедова спираль, которую я использую, не слишком безумна, функция длины дуги есть где a = 1
. Это позволяет мне преобразовывать значения тета в длину дуги, но это полная противоположность того, что мне нужно. Поэтому мне нужно найти обратную функцию длины дуги, и на этом препятствии Wolfram-Alpha подвел меня.
Так можно ли найти обратную функцию длины дуги? Функция является взаимно-однозначным отображением, если исключить отрицательные значения тета.
Спасибо,
Laurie
источник
Ответы:
Давайте усложним вашу спираль:
быть
в вашем случае f (t): = t, в моем f (t): = 1 (так что я заплачу за свои сложности упрощениями :)
Если вы хотите двигаться с определенной скоростью в этой вырожденной спирали (круг), вы должны знать, какова длина вашей спирали в раунде, чтобы вы могли сказать, сколько кругов в секунду нужно делать, чтобы быть уверенным, что ваша точка движется с желаемой скоростью. ,
Теперь мы знаем, что каждый полный раунд в окружности имеет длину 2 · π · r : 2 · π · 1 в нашем случае; если ω - скорость вращения (в раундах в секунду), скорость V будет V = 2 · π · 1 · ω или в более общем виде:
если r - общий радиус; это говорит нам, что:
если r является функцией от t, мы можем сказать:
в моем «сложном» случае это можно переписать следующим образом:
в вашем «упрощенном» случае ответ таков:
Вы знаете свою желаемую постоянную скорость V, вы знаете: 2, π и t - ваша переменная: вы знаете все и готовы к работе!
окружное приближение для бесконечно малой окрестности спирали по t
[ОТКАЗ]
Это не предназначено для строгой математической обработки: оно не учитывает вклад дифференциала f и не говорит о том, какие типы функций нельзя использовать.
источник
Если вы не возражаете против предположения, которое становится довольно точным довольно быстро, это простое решение работает довольно хорошо:
Это параметрическое время, что очень удобно. Однако, чтобы получить это, мне нужно было предположить, что движение примерно круговое, т.е. мгновенная линейная скорость пропорциональна радиусу, умноженному на угловую скорость:
Чтобы показать, что решение работает, подключите его к
d{theta} / d{time}
:В
{time}=1
это помещает точку на расстоянииsqrt(2)
от начала координат. После этого аппроксимация значительно улучшается: расстояние (линейное, а не вдоль пути) между последующими точками составляет 1,13, 1,08, 1,06. После 100 баллов разделение составляет менее 1,0023.источник
В поисках решения для вычисления угла, который соответствует определенной длине дуги, я наткнулся на этот вопрос и текущий ответ. К сожалению, ни этот ответ, ни какой-либо другой ресурс, который я нашел в Интернете, не могли быть непосредственно использованы для реализации.
Очевидно, что вычисление обратной функции длины дуги (которая также была представлена в вопросе) очень сложно. Но аппроксимация этого обратного с использованием итерационного метода Ньютона возможна. Ниже приведен класс, который в основном предлагает два метода:
computeArcLength(double alpha, double angleRad)
: Вычисляет длину дуги точки на архимедовой спирали, гдеalpha
расстояние между последовательными поворотами иangleRad
угол в радианахcomputeAngle(double alpha, double arcLength, double epsilon)
: Вычисляет угол, под которым точка для данной длины дуги находится на архимедовой спирали, гдеalpha
расстояние между последовательными витками иepsilon
порог аппроксимации для итерации НьютонаКод реализован здесь на Java, но эти основные методы должны быть достаточно независимыми от языка:
Пример того, как использовать это для цели, описанной в вопросе, приведен в следующем фрагменте: он генерирует определенное количество точек на спирали с желаемым (длина дуги!) Расстоянием между точками:
Фактическая длина дуги расстояние вычисленных точек печатаются, и можно увидеть , что они на самом деле эквидистант, с требуемым расстоянием длиной дуги.
источник
Я тоже борюсь с этим.
Что я делаю, так это поддерживаю постоянную скорость и меняю направление движения объекта.
Если я сделаю так, чтобы угол (в градусах) равнялся расстоянию от начала координат, умноженному на постоянную, я получаю прекрасную идеальную архимедову спираль. большие константы занимают меньше места между строками. Единственная проблема заключается в том, что если скорость слишком высока, то она скачет по дорожке и испортится. поэтому более надежные спирали требуют более медленной скорости для надежного отслеживания.
direction = ((spiral_factor*(current_distance) mod 360);
Где current_distance - это радиус, оттянутый от местоположения до точки появления в пикселях, захваченный функцией двигателя, которая дает его мне.
То, что ведет меня вверх по стене - это обратное. поместив объект снаружи и проследив за ним архимедова спираль внутрь. Перемещение частицы в обратном направлении не работает. это просто поворачивает спираль на 180 градусов. инвертирование направления дает направление по часовой стрелке.
источник