OTCloud
@OTCloud
Программирование и Архитектура ПО

Как реализовать алгоритм движения по спирали?

Реализовываю алгоритм движения точки по спирали (Архимедова спираль).

Из-за не точности алгоритма происходит так, что на 3 и больше круге точки расходятся на большое расстояние, то есть теряется прорисовка. Как устранить этот недочет?

Код пока сырой, но вот ссылка на JSFiddle: https://jsfiddle.net/u6t1nawz/3/
5d821fb8d142d003965933.png
  • Вопрос задан
  • 1021 просмотр
Решения вопроса 2
Автор, вот ваш исправленный пример, подчистил JS, но HTML трогать не стал.

В целом идея следующая: чтобы кривая смотрелась цельной, надо сохранять расстояние между её соседними точками. В коде это расстояние обозначено как ds. В случае вашей спирали радиус увеличивается на одинаковую величину при каждом обороте. В моём коде это dr.

Мы знаем, текущий радиус r и расстояние, которое должно быть между точками, поэтому можем легко вычислить увеличение текущего угла phi = arctg(ds / dr).

Теперь осталось вычислить увеличение радиуса. Мы знаем, на какую величину изменяется радиус при полном обороте, также нам известен угол, на который повернулся радиус. Увеличение радиуса будет пропорционально увеличению угла: r += dr * phi / (2 * pi).

Вот и всё =)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Я бы сделал примерно такую систему уравнений.

r = sqrt(t)
phi = a·r

t — параметр, условное «время»; phi — полярный угол, r — длина радиус-вектора.
Ну и, соотвественно, x = r cos phi, y = r sin phi.

В общем, радиус (ну или угол) должен увеличиваться со скоростью квадратного корня.

В этом деле есть физический смысл — это решение дифура r′(t)=1/r. Только двоечку и константу интегрирования упустил, ибо они нам как бы не нужны. Метод не точный, но если посмотреть на длину дуги спирали, там самый большой член квадратичный.

Если нужен СОВСЕМ стабильный зазор (например, расположить по спирали какие-то кружочки), у меня есть рекуррентный алгоритм.
Как написать алгоритм спирали?
Ответ написан
Комментировать
@Karpion
А что нужно-то? Постоянный шаг, равное расстояние между точками? Тогда угол надо брать обратно пропорционально радиусу - работает, если радиус больше шага.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы