Решил изучить библиотеку sfml для c++, как первое графическое приложение захотел сделать визуализацию магнитного зеркала. То есть частица влетает в магнитное поле таким образом, что вектор её скорости перпендикулярен вектору магнитной индукции, из-за чего внутри поля она движется по окружности, вылетев из поля под таким же углом, под котором влетела.
Может быть две ситуации: когда частица движется по части окружности, центр которой находится вне поля (для этого варианта у меня всё получилось), когда частица движется по части окружности, центр которой находится внутри поля. Ситуации эти определяются знаком заряда, но не в этом суть.
По идее нужно просто перемещать частицу по окружности, при этом учитывая расположение центра. Также нужно учитывать, что позиция частицы высчитывается от верхнего левого угла окна приложения, из-за чего иногда приходится менять знаки. Вот алгоритм действий для ситуации, когда центр окружности внутри поля (другой вариант у меня вроде как получился):
1. Двигаем частицу до границы, при этом известно расположение границы, модуль скорости и угол наклона вектора скорости по отношению к границе. При этом скорость по осям:
и
.
2. На границе (на самом деле в области около границы, расстояние от верхнего края области до нижнего равно диаметру частицы) высчитываем начальные условия. При этом представим, что центр координат находится на
составляющей центра окружности и на
составляющей границы поля. Расстояние до центра окружности по
равно
(Значение положительно из-за того, что считаем от левого верхнего угла). Расстояние до частицы по
равно
.
3.Внутри поля разбиваем всё на три этапа (движение по часовой стрелке): небольшой спуск вниз по верхней части окружности, пока не дойдём до
, далее движение по всей нижней части окружности от
до
, а потом движение по небольшой части верхней части окружности от
и пока не выйдем из поля.
Распишу только первую часть, так как уже с ней проблемы, если найду ошибку в ней, всё остальное пойдёт легче.
1)Сдвигаем
на небольшой промежуток вправо, получаем, приращение
на этом промежутке (приращение по
, как я уже сказал, произвольное).
2)Возвращаем
обратно.
3)С помощью приращений находим смещение по
с учётом того, что скорость постоянная:
.
3)Смещаем
на найденное смещение.
4)Находим смещение по
:
, где
– значение
на предыдущем
. Насчёт знака при
я не уверен, ну вроде как всё верно: по идее этот знак и знак при корне должны быть разными (у корня отрицательный, у
положительный), если бы мы были в обычной декартовой системе координат, но у нас отсчёт слева сверху, следовательно они оба меняются. При этом смещение тут почему-то получается отрицательным, хотя на этом участке должно быть положительным. (просто поставить минус пробовал, не работает)
5)смещаем по
на найденное смещение.
Проблема, как мне кажется, со знаками. Но как бы я не пытался – результат далёк от верного.