Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding Vectors with 2 points

Im helping my friend out with a pygame but we are stuck

so were are trying to get the direction of a projectile but we cant find out how

for example:

[1,1] will go SE

[1,-1] will go NE

[-1,-1] will go NW

and [-1,1] will go SW

we need an equation of some sort that will take the player pos and the mouse pos and find which direction the projectile needs to go

here is where we are plugging in the vectors:

def update(self):

    self.rect.x += self.vector[0]
    self.rect.y += self.vector[1]

then we are blitting the projectile at the rects coords

like image 549
Serial Avatar asked Dec 27 '22 01:12

Serial


1 Answers

So, first you want to get the vector distance from the player to the cursor. Subtracting two points gives you the vector between them:

distance = [mouse.x - player.x, mouse.y - player.y]

Now, you want to normalize that to a unit vector. To do that, you just get the norm (by the Pythagorean theorem), and divide the vector by the norm:

norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
direction = [distance[0] / norm, distance[1] / norm]

Finally, you want the velocity vector. You get that by multiplying the direction (the unit vector) by the speed.

Since you want a bullet fired to the SE to have vector [1, 1], you (presumably) want all bullets to move at the speed of that velocity vector, which is sqrt(2) (by the Pythagorean theorem again). So:

bullet_vector = [direction[0] * math.sqrt(2), direction[1] * math.sqrt(2)]

And that's it.


Here you can see this code working. (That's an interactive visualizer, so you can step through it piece by piece if there's any part you don't understand.)

I create a player at [10.0, 25.0], and a mouse pointer off a generally (but not exactly) south-easterly direction at [30.0, 70.0], and bullet_vector ends up as [0.5743665268941905, 1.2923246855119288], a vector pointing in that same general south-easterly direction with speed sqrt(2).

This shows that it can go southeast (if you want to go exactly southeast, change line 8 to mouse = Point(30.0, 45.0)), it can go in directions other than the 8 compass points, and it always goes at the same speed.

like image 197
abarnert Avatar answered Jan 03 '23 06:01

abarnert