Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воган Ли - Python для хакеров (Библиотека программиста) - 2023.pdf
Скачиваний:
3
Добавлен:
07.04.2024
Размер:
14.76 Mб
Скачать

Проект #9. На Луну с «Аполлоном-8»!      171

для двух тел — когда этот аппарат находится в гравитационном поле Луны. Это грубое, упрощенное вычисление обеспечивает разумную оценку условий отправки и прибытия, снижая количество вариантов для начальных векторов скорости и позиции. Остается только уточнить траекторию полета с помощью повторяющихся компьютерных симуляций.

Поскольку исследователи уже нашли и задокументировали решение с сопряжением конических сечений, примененное в миссии «Аполлон-8», вычислять нам его не придется. Я адаптировал его к 2D-сценарию, который мы сейчас реализуем. Тем не менее вы вполне можете позже поэкспериментировать с альтернативными решениями, изменяя параметры R0 и V0, и повторно выполнить симуляцию.

Проект #9. На Луну с «Аполлоном-8»!

Представьте себя интерном в NASA, которого попросили создать простую симуляцию траектории свободного возврата «Аполлона-8», чтобы показать прессе и общественности. Поскольку NASA всегда ограничено в средствах, вам нужно использовать открытое ПО и завершить проект максимально быстро и дешево.

ЗАДАЧА

Написать программу на Python, которая графически симулирует траекторию свободного возврата, предложенную для миссии «Аполлон-8».

Использование модуля turtle

Для симуляции полета «Аполлона-8» нам нужно разработать способ рисовать и перемещать изображения на экране. Существует множество сторонних модулей, которые для этого сгодятся, но мы пойдем самым простым путем и используем предустановленный модуль turtle. Несмотря на то что изначально он создавался для помощи подросткам, осваивающим программирование, turtle удается легко адаптировать и для более серьезного применения.

Этот модуль позволяет использовать команды Python для перемещения небольшого указателя, называемого turtle (черепаха), по экрану. Вы можете выбрать невидимый указатель, фактическое изображение, один из предустановленных вариантов, показанных на рис. 6.4, или настроить указатель самостоятельно.

Можно задать, чтобы при движении черепаха оставляла за собой след, позволяющий контролировать ее перемещение (рис. 6.5).

172      Глава 6. Победа в лунной гонке с помощью «Аполлона-8»

С а К а а

Ч а а Т

К

К а а

 

а

Рис. 6.4. Стандартные указатели, предлагаемые модулем turtle

Рис. 6.5. Перемещение черепахи в окне Turtle Graphics

Это простое рисование было реализовано с помощью следующего скрипта:

>>>import turtle

>>>steve = turtle.Turtle('turtle') # Создает объект turtle в форме черепахи

>>>steve.fd(50) # Перемещает черепаху на 50 пикселей вперед

>>>steve.left(90) # Поворачивает черепаху влево на 90 градусов

>>>steve.fd(50)

>>>steve.left(90)

>>>steve.fd(50)

Спомощью turtle можно использовать функциональность Python, что позволит писать более сжатый код. К примеру, для создания такого же шаблона можно задействовать цикл for.

>>>for i in range(3):

steve.fd(50)

steve.left(90)

Проект #9. На Луну с «Аполлоном-8»!      173

Здесь steve перемещается на 50 пикселей вперед, а затем поворачивает влево под нужным углом. Эти шаги повторяются трижды циклом for.

Другие опции позволяют изменять фигуру черепахи, ее цвет, отключать рисование пути, «отпечатывать» ее текущее положение на экране, устанавливать направление движения черепахи и получать координаты ее положения. На рис. 6.6 иллюстрируется эта функциональность, прописанная в следующем за рисунком скрипте.

Рис. 6.6. Опции настройки указателя-черепахи. Числа указывают аннотации скрипта

>>> import turtle

>>> steve = turtle.Turtle('turtle')>>> a_stamp = steve.stamp()

>>> steve.position()(0.00,0.00)

>>>steve.fd(150)

>>> steve.color('gray')

>>>a_stamp = steve.stamp()

>>>steve.left(45)

174      Глава 6. Победа в лунной гонке с помощью «Аполлона-8»

>>> steve.bk(75)

>>> a_stamp = steve.stamp()>>> steve.penup()

>>> steve.bk(75)

>>> steve.color('black')>>> steve.setheading(180)

>>> a_stamp = steve.stamp()>>> steve.pendown()

>>> steve.fd(50)

>>> steve.shape('triangle')

После импорта модуля turtle и инстанцирования объекта steve оставляем отпечаток изображения steve при помощи метода stamp() .

Далее используем метод position() для получения текущих координат черепахи (x, y) в качестве кортежа . Они пригодятся нам при вычислении расстояния между объектами для гравитационного уравнения.

Перемещаем черепаху вперед на 150 пробелов и изменяем ее цвет на серый . Затем оставляем отпечаток, поворачиваем черепаху на 45 градусов и задним ходом перемещаем на 75 пробелов, используя метод bk() .

Оставляем еще один отпечаток, после чего с помощью метода penup() отключаем рисование пройденного черепахой пути. Перемещаем steve задним ходом еще на 75 пробелов и закрашиваем его в черный. Теперь используем альтернативу rotate(), которая подразумевает движение черепахи прямо . Обратите внимание, что предустановленные в «стандартном режиме» направления движения отсчитываются от востока, а не от севера (табл. 6.1).

Таблица 6.1. Направления движения модуля turtle в стандартном режиме

Градусы

Направление

 

 

0

Восток

 

 

90

Север

 

 

180

Запад

 

 

270

Юг

 

 

Оставляем еще один отпечаток и вновь активируем отображение следа . Перемещаем steve на 50 пробелов вперед и изменяем фигуру указателя с черепахи на треугольник . На этом рисование завершается.

Выглядит довольно просто, но это лишь пример. Используя правильные команды, можно рисовать весьма замысловатые узоры, такие как мозаика Пенроуза, показанная на рис. 6.7.