Найти в Дзене

ЮНЫМ ПРОГРАММИСТАМ: Как изобразить движение точки по эллипсу?

В математике существуют так называемые параметрические уравнения эллипса: x = a * cos(t); y = b * sin(t). Попробую объяснить эти страшные слова простым языком. Если подставлять вместо t числа от 0 до двух «пи» (от 0 до 6,28), то эти формулы будут вычислять x и y – координаты (x; y) точек на обычной школьной координатной плоскости. Эти точки расположатся так, что образуют овальную кривую – эллипс. a и b определяют размеры эллипса. Вдоль оси X он будет вытянут от –a до a, вдоль оси Y – от –b до b. У эллипса есть центр. Центр этого эллипса будет в начале координат. Например, уравнения x = 4 * cos(t); y = 3 * sin(t) нарисуют такой эллипс: Как же изобразить на экране компьютера движение точки по эллипсу? Предлагаю программу на языке Python. Текст этой программы можно скачать по ссылке: https://disk.yandex.ru/d/D-XDtQWzG5Hckg Выкладывать текст здесь, потом копировать, исправлять дурацкие питоновские отступы – думаю, проще скачать текст по ссылке. Всё-таки фотки текста приведу для пояснен

В математике существуют так называемые параметрические уравнения эллипса: x = a * cos(t); y = b * sin(t). Попробую объяснить эти страшные слова простым языком. Если подставлять вместо t числа от 0 до двух «пи» (от 0 до 6,28), то эти формулы будут вычислять x и y – координаты (x; y) точек на обычной школьной координатной плоскости. Эти точки расположатся так, что образуют овальную кривую – эллипс. a и b определяют размеры эллипса. Вдоль оси X он будет вытянут от a до a, вдоль оси Y – от –b до b. У эллипса есть центр. Центр этого эллипса будет в начале координат. Например, уравнения x = 4 * cos(t); y = 3 * sin(t) нарисуют такой эллипс:

Как же изобразить на экране компьютера движение точки по эллипсу?

Предлагаю программу на языке Python. Текст этой программы можно скачать по ссылке: https://disk.yandex.ru/d/D-XDtQWzG5Hckg

Выкладывать текст здесь, потом копировать, исправлять дурацкие питоновские отступы – думаю, проще скачать текст по ссылке. Всё-таки фотки текста приведу для пояснения работы программы:

-2
-3

Блок «Подготовка графики» – скучный, менять не советую, это сейчас не наша цель. Обратите в нём только внимание на «болтающиеся» потом коэффициенты ka и kb. Программа написана под мониторы с разрешением 1920х1080. ka и kb нужны для масштабирования на других мониторах, отличных от 1920х1080. А так ka и kb только путаются и мешают в разборке алгоритма.

Блок «Константы». Значение t = 0, оно определяет начальное положение точки на эллипсе, ну, можно поменять, но особо не стоит. Шаг h влияет на скорость движения точки по эллипсу. Количество звёзд n = 1000. Много звёзд замедлят работу программы, мало – ускорят. Тут опять нет ничего интересного.

Блок «Генерация звёзд». С помощью генератора случайных чисел random генерируются координаты (xz; yz) тысячи звёзд в пределах монитора. Крупных, ярких звёзд - поменьше, мелких - побольше и разной яркости. Этот блок больше дизайнерский. Украшать картинку вы можете много, как пожелаете. Опять это сейчас не совсем наша цель.

И вот, наконец, то, что нам нужно и важно – «Основной цикл».

Запускаем цикл while. Сначала рисуем 1000 звёзд. Затем берём уравнения эллипса x = 18 * cos(t); y = 1,8 * sin(t). Числа 18 и 1,8, как мы знаем, определяют размеры эллипса, такими взяты для красоты, их можно поменять по своему вкусу.

Первое значение t у нас задано в блоке "Константы" и равно нулю. Значит, мы уже можем вычислить координаты (x; y) первого положения нашей точки. Эти координаты – математические. Рисовать точку с математическими координатами на экране не стоит, получится ненаглядная ерунда. Математические координаты (x; y) надо перевести в экранные (a; b). Как? Увеличим их в 30 раз и отложим от центра экрана (960; 540). Тут путаются под ногами ka и kb, ну что поделаешь, они чтобы программа работала на мониторах с другим разрешением.

Нашу точку, движущуюся по эллипсу, изобразим для красоты кружочком – загадочной планетой. Двигаясь в космосе по окружности, а в проекции на луч зрения по эллипсу, планета как бы то удаляется от нас, то приближается к нам. Естественно, диаметр её должен согласованно то уменьшаться, то увеличиваться. Для этого пришлось, увы, самостоятельно придумать формулу r = 30 - 20 * sin(t). Достижение невелико. Тем не менее.

И вот, наконец, самый интересный и желанный момент программы – рисование.

Как иногда бывает в жизни, главного героя праздника – эллипса, мы рисовать-то не будем!! А для привлекательности картинки мы нарисуем в центре невидимого эллипса центральное светило – не наше солнце, вокруг которого летает планета. Здесь небольшой прибабах. Планета может затмевать своё солнце, может проходить за ним. Здесь всего 2 тела. Поэтому устраивать какую-то навороченную сортировку положений не стоит. Достаточно заметить, что если y > 0 – планета будет проходить за солнцем и поэтому её надо рисовать первой, а если y <= 0 – планета будет проходить перед солнцем, значит, первым надо рисовать солнце, а потом планету.

Вот, картинка нарисована. Это при t = 0. Чтобы заставить планету двигаться по эллипсу, надо брать следующее значение t. Для плавности движения увеличиваем t c небольшим шагом: t = t + h.

Обновляем экран, посмотрели на картинку, вычисляем новую картинку, стираем старую, обновляем экран и так далее – крутится цикл while – крутится планета по эллипсу. Вот и вся программа, изображающая движение точки по эллипсу.

Вставьте текст программы в редактор Питона. Запустите её. Вы увидите мультик:

Изучайте, улучшайте, задавайте вопросы.

Успехов Вам в программировании!