您的位置:首页 > 编程语言 > Python开发

python导弹自动追踪以及实时图片旋转算法(吕万友)

2017-12-21 11:19 465 查看
以下是 Python-pygame代码实现:  

import sys, pygame
from math import *

pygame.init()
font1 = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 23)
textc = font1.render('*', True, (250, 0, 0))  # this is the target that missile wants to attack
screen = pygame.display.set_mode((800, 700), 0, 32)  # set the attribution of screen
missile = pygame.image.load('C:/Users/win10/Desktop/rect1.png').convert_alpha()
bomb = pygame.image.load('C:/Users/win10/Desktop/bomb.png').convert_alpha()
height = missile.get_height()
width = missile.get_width()
pygame.mouse.set_visible(0)
x1, y1 = 100, 600  # 导弹的初始发射位置
velocity = 800  # 导弹速度
time = 1 / 1000  # 每个时间片的长度
clock = pygame.time.Clock()
A = ()
B = ()
C = ()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
clock.tick(300)
x, y = pygame.mouse.get_pos()  # 获取鼠标位置,鼠标就是需要打击的目标
distance = sqrt(pow(x1 - x, 2) + pow(y1 - y, 2))  # 两点距离公式
print('distance  :   ', distance)
section = velocity * time  # 每个时间片需要移动的距离
sina = (y1 - y) / distance
cosa = (x - x1) / distance
angle = atan2(y - y1, x - x1)  # 两点间线段的弧度值
fangle = degrees(angle)  # 弧度转角度
x1, y1 = (x1 + section * cosa, y1 - section * sina)
missiled = pygame.transform.rotate(missile, -(fangle))  # 得到旋转角度后的missile图片

if 0 <= -fangle <= 90:
A = (width * cosa + x1 - width, y1 - height / 2)
B = (A[0] + height * sina, A[1] + height * cosa)

if 90 < -fangle <= 180:
A = (x1 - width, y1 - height / 2 + height * (-cosa))
B = (x1 - width + height * sina, y1 - height / 2)

if -90 <= -fangle < 0:
A = (x1 - width + missiled.get_width(), y1 - height / 2 + missiled.get_height() - height * cosa)
B = (A[0] + height * sina, y1 - height / 2 + missiled.get_height())

if -180 < -fangle < -90:
A = (x1 - width - height * sina, y1 - height / 2 + missiled.get_height())
B = (x1 - width, A[1] + height * cosa)

C = ((A[0] + B[0]) / 2, (A[1] + B[1]) / 2)
screen.fill((0, 0, 0))
if distance > 1:
screen.blit(missiled, (x1 - width + (x1 - C[0]), y1 - height / 2 + (y1 - C[1])))  # 旋转后的missile 位块显示在 C点位置。
screen.blit(textc, (x, y))  # 鼠标用一个红色*代替
else:
screen.blit(bomb, (x, y))  # 旋转后的missile 位块显示在 C点位置。
pygame.display.update()


代码中需要的照片:  




  分别命名为: rect1.png  、bomb.png
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: