How to know the angle between two vectors?
angle, math, pygame, python
Solution
The tangent of the angle between two points is defined as delta y / delta x That is (y2 - y1)/(x2-x1). This means that `math.atan2(dy, dx)` give the angle between the two points assuming that you know the base axis that defines the co-ordinates.
Your gun is assumed to be the (0, 0) point of the axes in order to calculate the angle in radians. Once you have that angle, then you can use the angle for the remainder of your calculations.
Note that since the angle is in radians, you need to use the math.pi instead of 180 degrees within your code. Also your test for more than 360 degrees (2*math.pi) is not needed. The test for negative (< 0) is incorrect as you then force it to 0, which forces the target to be on the x axis in the positive direction.
Your code to calculate the angle between the gun and the target is thus
myradians = math.atan2(targetY-gunY, targetX-gunX)
If you want to convert radians to degrees
mydegrees = math.degrees(myradians)
To convert from degrees to radians
myradians = math.radians(mydegrees)
Python ATAN2
The Python ATAN2 function is one of the Python Math function which is used to returns the angle (in radians) from the X -Axis to the specified point (y, x).
math.atan2()
Definition Returns the tangent(y,x) in radius.
Syntax math.atan2(y,x)
Parameters y,x=numbers
Examples The return is:
>>> import math
>>> math.atan2(88,34)
1.202100424136847
>>>
Problem
I am making small game with pygame and I have made a gun that rotates around its center. My problem is that I want the gun to rotate by itself to the enemy direction, but I couldn't do that because I can't find the angle between the gun and the enemy to make the gun rotate to it I have searched and I found that I have to use the `atan2` but I didn't find any working code so I hope someone could help me. Here is my code: ``` import pygame from pygame.locals import* pygame.init() height=650 width=650 screen=pygame.display.set_mode((height,width)) clock=pygame.time.Clock() gun=pygame.image.load("m2.png").convert_alpha() gun=pygame.transform.smoothscale(gun,(200,200)).convert_alpha() angle=0 angle_change=0 RED=(255,0,0) x=525 y=155 while True : screen.fill((150,150,150)) for event in pygame.event.get(): if event.type==QUIT: pygame.quit() quit() if event.type==KEYDOWN: if event.key==K_a: angle_change=+1 if event.key==K_d: angle_change=-1 elif event.type==KEYUP: angle_change=0 angle+=angle_change if angle>360: angle=0 if angle<0: angle=360 pygame.draw.rect(screen,RED,(x,y,64,64)) position = (height/2,width/2) gun_rotate=pygame.transform.rotate(gun,angle) rotate_rect = gun_rotate.get_rect() rotate_rect.center = position screen.blit(gun_rotate, rotate_rect) pygame.display.update() clock.tick(60) ``` And here is a picture trying to make it clear: How do I solve the problem?