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

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

practice_montage_difference_finder.py

practice_montage_difference_finder.py import cv2 as cv

filename1 = 'montage_left.JPG' filename2 = 'montage_right_gray.JPG'

img1 = cv.imread(filename1, cv.IMREAD_GRAYSCALE) img2 = cv.imread(filename2, cv.IMREAD_GRAYSCALE)

# Абсолютная разница между изображениями 2 и 3: diff_imgs1_2 = cv.absdiff(img1, img2)

cv.namedWindow('Difference', cv.WINDOW_NORMAL) diff_imgs1_2_resize = cv.resize(diff_imgs1_2, (699, 700)) cv.imshow('Difference', diff_imgs1_2_resize)

crop_diff = diff_imgs1_2[10:2795, 10:2445] # x, y, w, h = 10, 10, 2790, 2440

# Применяем размытие для удаления лишнего шума. blurred = cv.GaussianBlur(crop_diff, (5, 5), 0)

(minVal, maxVal, minLoc, maxLoc2) = cv.minMaxLoc(blurred) cv.circle(img2, maxLoc2, 100, 0, 3)

x, y = int(img2.shape[1]/4), int(img2.shape[0]/4) img2_resize = cv.resize(img2, (x, y)) cv.imshow('Change', img2_resize)

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

Симуляция шаблона поисков

practice_search_pattern.py

import time import random import turtle

SA_X = 600 # Ширина области поиска.

SA_Y = 480 # Длина области поиска.

TRACK_SPACING = 40 # Расстояние между треками поиска.

#Настройка экрана. screen = turtle.Screen()

screen.setup(width=SA_X, height=SA_Y) turtle.resizemode('user') screen.title("Search Pattern")

rand_x = random.randint(0, int(SA_X / 2)) * random.choice([-1, 1]) rand_y = random.randint(0, int(SA_Y / 2)) * random.choice([-1, 1])

#Настройка изображений черепах .

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

seaman_image = 'seaman.gif' screen.addshape(seaman_image) copter_image_left = 'helicopter_left.gif' copter_image_right = 'helicopter_right.gif' screen.addshape(copter_image_left) screen.addshape(copter_image_right)

#Инстанцирование указателя моряка. seaman = turtle.Turtle(seaman_image) seaman.hideturtle()

seaman.penup() seaman.setpos(rand_x, rand_y) seaman.showturtle()

#Инстанцирование указателя вертолета. turtle.shape(copter_image_right) turtle.hideturtle() turtle.pencolor('black') turtle.penup()

turtle.setpos(-(int(SA_X / 2) - TRACK_SPACING), int(SA_Y / 2) - TRACK_ SPACING)

turtle.showturtle()

turtle.pendown()

#Выполняем шаблон поиска и объявляем о нахождении моряка.

for i in range(int(SA_Y / TRACK_SPACING)): turtle.fd(SA_X - TRACK_SPACING * 2) turtle.rt(90)

turtle.fd(TRACK_SPACING / 2) turtle.rt(90) turtle.shape(copter_image_left) turtle.fd(SA_X - TRACK_SPACING * 2) turtle.lt(90) turtle.fd(TRACK_SPACING / 2) turtle.lt(90) turtle.shape(copter_image_right)

if turtle.ycor() - seaman.ycor() <= 10: turtle.write(" Seaman found!",

align='left',

font=("Arial", 15, 'normal', 'bold', 'italic'))

time.sleep(3)

break

Заведи меня!

practice_grav_assist_stationary.py

"""gravity_assist_stationary.py

Луна приближается к неподвижному кораблю, закручивая его вокруг себя и запуская вдаль.

Реализация: Эрик Т. Мортенсон

"""

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

from turtle import Shape, Screen, Turtle, Vec2D as Vec import turtle

import math

# Пользовательский ввод:

G = 8 # Гравитационная константа, используемая в симуляции. NUM_LOOPS = 4100 # Число временных шагов в симуляции.

Ro_X = 0 # Координата x стартовой позиции корабля. Ro_Y = -50 # Координата y стартовой позиции корабля. Vo_X = 0 # Компонент x скорости корабля.

Vo_Y = 0 # Компонент y скорости корабля.

MOON_MASS = 1_250_000

class GravSys():

"""Выполняем гравитационную симуляцию для n тел."""

def __init__(self): self.bodies = [] self.t = 0 self.dt = 0.001

def sim_loop(self):

"""Прогоняем тела из списка через временные шаги.""" for _ in range(NUM_LOOPS):

self.t += self.dt

for body in self.bodies: body.step()

class Body(Turtle):

"""Небесный объект, вращающийся по орбите и проецирующий гравитационное поле."""

def __init__(self, mass, start_loc, vel, gravsys, shape): super().__init__(shape=shape)

self.gravsys = gravsys self.penup() self.mass=mass self.setpos(start_loc) self.vel = vel gravsys.bodies.append(self)

self.pendown() # Раскомментируйте, чтобы рисовать путь позади объектов

def acc(self):

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

a = Vec(0,0)

for body in self.gravsys.bodies: if body != self:

r = body.pos() - self.pos()

a += (G * body.mass / abs(r)**3) * r # единицы расстояние/время^2

return a

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

def step(self):

"""Вычисляем позицию, ориентацию и скорость тела.""" dt = self.gravsys.dt

a = self.acc()

self.vel = self.vel + dt * a

xOld, yOld = self.pos() # для ориентации корабля. self.setpos(self.pos() + dt * self.vel)

xNew, yNew = self.pos() # для ориентации корабля. if self.gravsys.bodies.index(self) == 1: # the CSM

dir_radians = math.atan2(yNew-yOld,xNew-xOld) # для ориентации корабля.

dir_degrees = dir_radians * 180 / math.pi # для ориентации корабля.

self.setheading(dir_degrees+90) # для ориентации корабля.

def main():

#Настраиваем экран. screen = Screen()

screen.setup(width=1.0, height=1.0) # для полноэкранного режима screen.bgcolor('black')

screen.title("Gravity Assist Example")

#Инстанцируем гравитационную систему.

gravsys = GravSys()

# Инстанцируем планету. image_moon = 'moon_27x27.gif' screen.register_shape(image_moon)

moon = Body(MOON_MASS, (500, 0), Vec(-500, 0), gravsys, image_moon) moon.pencolor('gray')

#Создаем командно-сервисный модуль (csm). csm = Shape('compound')

cm = ((0, 30), (0, -30), (30, 0)) csm.addcomponent(cm, 'red', 'red')

sm = ((-60,30), (0, 30), (0, -30), (-60, -30)) csm.addcomponent(sm, 'red', 'black')

nozzle = ((-55, 0), (-90, 20), (-90, -20)) csm.addcomponent(nozzle, 'red', 'red') screen.register_shape('csm', csm)

#Инстанцируем указатель CSM "Аполлона-8"

ship = Body(1, (Ro_X, Ro_Y), Vec(Vo_X, Vo_Y), gravsys, "csm") ship.shapesize(0.2)

ship.color('red') # цвет траектории ship.getscreen().tracer(1, 0) ship.setheading(90)

gravsys.sim_loop()

if __name__=='__main__': main()