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

378      Решения для практических проектов

def plot_light_curve(rel_brightness):

"""Рисуем график изменений относительной яркости во времени.""" plt.plot(rel_brightness, color='red', linestyle='dashed',

linewidth=2, label='Relative Brightness') plt.legend(loc='upper center') plt.title('Relative Brightness vs. Time')

## plt.ylim(0.995, 1.001) plt.show()

if __name__ == '__main__': main()

Обнаружение инопланетной армады

practice_alien_armada.py

"""Симулируем транзит армады инопланетных кораблей и отображаем кривую блеска."""

import random import numpy as np import cv2 as cv

import matplotlib.pyplot as plt

STAR_RADIUS = 165

BLACK_IMG = np.zeros((400, 500, 1), dtype="uint8") NUM_SHIPS = 5

NUM_LOOPS = 300 # Количество выполняемых шагов симуляции.

class Ship():

"""Рисуем и перемещаем объект корабля на изображении."""

def __init__(self, number): self.number = number

self.shape = random.choice(['>>>|==H[X)', '>>|==H[XX}=))-', '>>|==H[XX]=(-'])

self.size = random.choice([0.7, 0.8, 1]) self.x = random.randint(-180, -80) self.y = random.randint(80, 350)

self.dx = random.randint(2, 4)

def move_ship(self, image):

"""Рисуем и перемещаем объект корабля.""" font = cv.FONT_HERSHEY_PLAIN cv.putText(img=image,

text=self.shape, org=(self.x, self.y), fontFace=font, fontScale=self.size, color=0, thickness=5)

self.x += self.dx

Глава 8. Обнаружение далеких экзопланет      379

def record_transit(start_image):

"""Выполняем симуляцию и возвращаем список измерений интенсивности для каждого шага симуляции."""

ship_list = [] intensity_samples = []

for i in range(NUM_SHIPS): ship_list.append(Ship(i))

for _ in range(NUM_LOOPS): temp_img = start_image.copy()

cv.circle(temp_img, (250, 200), STAR_RADIUS, 255, -1) # Звезда. for ship in ship_list:

ship.move_ship(temp_img) intensity = temp_img.mean()

cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390), cv.FONT_HERSHEY_PLAIN, 1, 255)

cv.imshow('Transit', temp_img) intensity_samples.append(intensity) cv.waitKey(50)

cv.destroyAllWindows() return intensity_samples

def calc_rel_brightness(image):

"""Возвращаем список измерений относительной яркости для планетарного транзита."""

rel_brightness = record_transit(image) max_brightness = max(rel_brightness) for i, j in enumerate(rel_brightness):

rel_brightness[i] = j / max_brightness return rel_brightness

def plot_light_curve(rel_brightness):

"""Рисуем график кривой относительной яркости во времени.""" plt.plot(rel_brightness, color='red', linestyle='dashed', linewidth=2, label='Relative Brightness')

plt.legend(loc='upper center') plt.title('Relative Brightness vs. Time') plt.show()

relative_brightness = calc_rel_brightness(BLACK_IMG) plot_light_curve(relative_brightness)

Обнаружение планеты с Луной

practice_planet_moon.py

"""Анимация Луны реализована Эриком Т. Мортенсоном.""" import math

import numpy as np import cv2 as cv

import matplotlib.pyplot as plt

380      Решения для практических проектов

IMG_HT = 500 IMG_WIDTH = 500

BLACK_IMG = np.zeros((IMG_HT, IMG_WIDTH, 1), dtype='uint8') STAR_RADIUS = 200

EXO_RADIUS = 20

EXO_START_X = 20

EXO_START_Y = 250 MOON_RADIUS = 5

NUM_DAYS = 200 # Количество дней в году.

def main():

intensity_samples = record_transit(EXO_START_X, EXO_START_Y) relative_brightness = calc_rel_brightness(intensity_samples) print('\nestimated exoplanet radius = {:.2f}\n'

.format(STAR_RADIUS * math.sqrt(max(relative_brightness) -min(relative_brightness))))

plot_light_curve(relative_brightness)

def record_transit(exo_x, exo_y):

"""Рисуем проходящую на фоне звезды планету и возвращаем список значений изменения интенсивности."""

intensity_samples = [] for dt in range(NUM_DAYS):

temp_img = BLACK_IMG.copy()

# Рисуем звезду:

cv.circle(temp_img, (int(IMG_WIDTH / 2), int(IMG_HT/2)), STAR_RADIUS, 255, -1)

# Рисуем экзопланету.

cv.circle(temp_img, (int(exo_x), int(exo_y)), EXO_RADIUS, 0, -1)

# Рисуем луну. if dt != 0:

cv.circle(temp_img, (int(moon_x), int(moon_y)), MOON_RADIUS, 0, -1)

intensity = temp_img.mean()

cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 10),

cv.FONT_HERSHEY_PLAIN, 1, 255) cv.imshow('Transit', temp_img) cv.waitKey(10) intensity_samples.append(intensity)

exo_x = IMG_WIDTH / 2 - (IMG_WIDTH / 2 - 20) * \ math.cos(2 * math.pi * dt / (NUM_DAYS)*(1 / 2))

moon_x = exo_x + \

3 * EXO_RADIUS * math.sin(2 * math.pi * dt / NUM_DAYS *(5)) moon_y = IMG_HT / 2 - \

0.25 * EXO_RADIUS * \

math.sin(2 * math.pi * dt / NUM_DAYS * (5)) cv.destroyAllWindows()

return intensity_samples

Глава 8. Обнаружение далеких экзопланет      381

def calc_rel_brightness(intensity_samples):

"""Возвращаем из списка интенсивности список значений относительной яркости."""

rel_brightness = []

max_brightness = max(intensity_samples) for intensity in intensity_samples:

rel_brightness.append(intensity / max_brightness) return rel_brightness

def plot_light_curve(rel_brightness):

"""Рисуем график изменений относительной яркости во времени.""" plt.plot(rel_brightness, color='red', linestyle='dashed',

linewidth=2, label='Relative Brightness') plt.legend(loc='upper center') plt.title('Relative Brightness vs. Time') plt.show()

if __name__ == '__main__': main()

Рисунок A.1 обобщает вывод программы practice_planet_moon.py.

Рис. A.1. Кривая блеска для планеты и Луны, когда Луна проходит позади планеты