Python을 사용하여 자동 미사일 추적 실현

자동 추적 알고리즘은 슈팅 게임을 만들 때 자주 사용됩니다. 매우 거창하게 들리는 이 것은 사실 군사 과학의 특허는 아니지만 수학적으로는 미분 방정식의 해입니다.

이것은 약간의 수학 없이는 알아내기 어렵습니다. 하지만 컴퓨터가 있으면 다릅니다 컴퓨터의 매우 빠른 계산 속도에 의존하여 미분의 아이디어를 사용하고 약간의 간단한 삼각법 지식을 추가하여 실현할 수 있습니다.

맞아요, 원본 코드가 필요하고 파이썬을 배우고 싶은 친구들은 ↓ ↓ ↓

여기를 클릭하세요~~
무료로 사용할 수 있는 리소스가 많고, 파이썬에 대한 소소한 지식은 수시로 업데이트 하겠습니다! !

자, 더 이상 고민하지 않고 알고리즘 원리를 살펴보고 그림을 살펴보겠습니다.
사진 설명을 추가해주세요
나중에 시연하기 위해 파이게임을 사용할 것이기 때문에 파이게임의 좌표계는 아래쪽 y축이므로 여기에서도 y-아래 좌표를 사용합니다. 체계.

알고리즘의 일반적인 아이디어는 위의 그림에 따라 시간 t를 충분히 작은 조각으로 나누는 것입니다(예: 1/1000, 시간 조각이 작을수록 더 정확함). 각 조각은 위의 삼각형으로 구성됩니다. , 그리고 미사일의 다음 타임 슬라이스가 계산됩니다.방향(ie ∠a)과 이동 거리(즉 vt=|AC|), 이때 목표물은 두 번째 타임 슬라이스에서 이동하고 포인트 C는 방금 계산했습니다. 두 번째 타임 슬라이스의 시점이 됨 초기 시점에서 이때 두 번째 타임 슬라이스에서 점 C와 새로운 목표점 사이에 삼각형을 구성하여 새로운 vt를 계산한 다음 세 번째 타임 슬라이스를 입력하면 에.

미사일과 표적의 초기 좌표를 각각 (x1, y1), (x, y)라고 가정하면 직각 삼각형 ABE가 구성되고 이 삼각형은 ∠a의 사인과 코사인을 찾는 데 사용됩니다. 스스로 설정하고 우리는 점 A~C의 x, y 좌표가 얼마나 이동했는지 계산해야 하며 이동된 값은 AD와 CD의 길이이며 vt에 cos(a)와 sin을 곱할 수 있습니다. (ㅏ).

sin(a) 및 cos(a)를 계산하면 사인은 사선과 비교되고 코사인은 사선에 인접하며 빗변은 2점 거리 공식을 사용하여 계산할 수 있습니다. 즉, AC의 길이
사진 설명을 추가해주세요

사진 설명을 추가해주세요
미사일의 속도에 시간을 곱한 값, 즉 |AC|=vt , 그러면 AD와 CD의 길이를 계산할 수 있으므로 이 시간 조각이 지나면 미사일은 새로운 지점 C에 나타나야 하며 그 좌표는 이전 점 A 더하기 AD 및 y 빼기 CD의 x입니다.

따라서 새로운 점 C의 좌표는 다음과 같습니다. 사진 설명을 추가해주세요
이 작업을 반복적으로 수행하는 한 더 생생한 그림을 위해 첫 번째 시간 조각과 두 번째 시간 조각을 함께 넣습니다.

사진 설명을 추가해주세요
첫 번째는 타임 슬라이스로 구성된 삼각형이 ABE라는 것인데, 타임 슬라이스 후 목표물은 B지점에서 D지점으로 이동하고 이때 미사일은 C지점에 있으므로 새로운 삼각형 CDF를 구성하고 위의 과정을 반복한다. 지금 계산하는 과정입니다. 사진의 각도 ∠b는 미사일이 회전해야 하는 각도입니다. 실제로는 미사일의 방향을 타임 슬라이스마다 수정하면 됩니다. 미사일의 방향을 바꾸는 방법은 우리가 공부해야 할 문제.

자, 최근에 작은 게임을 만들기 위해 파이썬의 파이게임 라이브러리를 사용하고 있기 때문에, 파이게임을 사용하여 이 효과를 시연해 보겠습니다.효과는 아래 그림과 같습니다
사진 설명을 추가해주세요
.

import pygame,sys
from math import *
pygame.init()
screen=pygame.display.set_mode((800,700),0,32)
missile=pygame.image.load('element/red_pointer.png').convert_alpha()
x1,y1=100,600           #导弹的初始发射位置
velocity=800            #导弹速度
time=1/1000             #每个时间片的长度
clock=pygame.time.Clock()
old_angle=0
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))      #两点距离公式
    section=velocity*time               #每个时间片需要移动的距离
    sina=(y1-y)/distance
    cosa=(x-x1)/distance
    angle=atan2(y-y1,x-x1)              #两点线段的弧度值
    x1,y1=(x1+section*cosa,y1-section*sina)
    d_angle = degrees(angle)        #弧度转角度
    screen.blit(missile, (x1-missile.get_width(), y1-missile.get_height()/2))
    dis_angle=d_angle-old_angle          #dis_angle就是到下一个位置需要改变的角度
    old_angle=d_angle                    #更新初始角度
    pygame.display.update()

미사일을 질량점으로만 생각한다면 위의 알고리즘이면 충분합니다. 질량점은 회전할 필요가 없기 때문에 미사일을 회전시키지 않았습니다. 작습니다. 회전이 없으면 문제가 없어 보입니다. 하지만 파이게임에서는 회전을 하기가 쉽지 않으니 먼저 그림을 사각형으로 교체한 후 회전 기능을 추가하여 어떻게 동작하는지 살펴보겠습니다.
사진 설명을 추가해주세요

missiled = pygame.transform.rotate(missile, -(d_angle))
screen.blit(missiled, (x1-missile.get_width(), y1-
missile.get_height()/2))

그림의 좌표점은 왼쪽 위 모서리에 있는 점이므로 그림의 좌표를 화살표 끝에 고정하려면 그림의 실제 인쇄 위치 x는 길이만큼 줄어듭니다. y의 너비는 절반으로 줄어듭니다. 그러나 실제 실행 효과는 좋지 않습니다. 사진 설명을 추가해주세요
일반적인 방향은 동일하지만 그림 화살표의 날카로운 점은 항상 마우스를 따르지 않습니다. 왜 그렇습니까? 조사를 해보니 이미지의 회전 메커니즘의 문제라는 것을 알았습니다. 회전된 이미지가 어떻게 보이는지 살펴보겠습니다. 회전 각도에 따라 회전된 이미지가 파란색 영역으로 변합니다. 결과 사진의 사진 설명을 추가해주세요
크기 90도 회전하는 상황을 보면
사진 설명을 추가해주세요
사진 설명을 추가해주세요
회전 후 그림의 면적이 커질 뿐만 아니라 미사일 머리의 위치도 바뀌는 것을 알 수 있습니다. 그렇다면 이 문제를 어떻게 해결해야 할까요? 아이디어는 이미지의 각 회전 후 회전 이미지의 헤드 위치(그림의 녹색 화살표 지점)를 찾은 다음 녹색 이미지의 인쇄 위치를 아래, x, y로 이동하여 두 헤드의 거리를 각각 계산하여 회전된 미사일 헤드가 미사일 헤드의 실제 위치와 정렬되도록 계산에 참여했으며 이동 후 다음과 같아야 합니다. 이렇게 두 미사일
사진 설명을 추가해주세요
헤드의 포인트는 일관성이 있습니다. 다음으로, 회전된 미사일 헤드를 찾는 알고리즘을 분석합니다. 다른 회전 각도에 따라 다른 사분면에서 회전 각도 매개 변수가 다르기 때문에 이러한 네 가지 상황으로 나눕니다.

1, 2 사분면
사진 설명을 추가해주세요
3, 4 사분면 회전은 플러스 마이너스 0-180이므로 3, 4 사분면은 음의 각도입니다 사진 설명을 추가해주세요
.

screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))

여기서 (x1-너비, y1-높이/2)는 실제로 위 그림의 (x1, y1)입니다.

결국 관련 알고리즘 코드를 추가하면 효과가 더 완벽해집니다.

사진 설명을 추가해주세요
끝났습니다. 마지막으로 모든 알고리즘 코드를 첨부하십시오.

import pygame,sys
from math import *
pygame.init()
font1=pygame.font.SysFont('microsoftyaheimicrosoftyaheiui',23)
textc=font1.render('*',True,(250,0,0))
screen=pygame.display.set_mode((800,700),0,32)
missile=pygame.image.load('element/rect1.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))      #两点距离公式
    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))
    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))
    screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))
    screen.blit(textc, (x,y)) #鼠标用一个红色*代替
    pygame.display.update()

위는 Python을 사용하여 미사일 자동 추적을 시뮬레이션하는 코드 예제입니다.

원본 코드가 필요하고 파이썬을 배우고 싶은 친구들은 ↓ ↓ ↓

여기를 클릭하세요~~

괜히 댓가 없이 팔 수 있는 자료들이 많고, 파이썬에 대한 소소한 지식도 수시로 업데이트 하겠습니다! !

추천

출처blog.csdn.net/weixin_72934044/article/details/128198092