Can somebody explain this behavior in pygame?

I have an image that I'm rotating and moving

And when the rotation angle is negative the image moves as expected.

But when the angle is positive it moves it's origing point to the left

Can anybody explain this behavior, and how to solve it?

Here is the code

import pygame, sys
import math

screen = pygame.display.set_mode((700, 400))
white = (255,255,255)

ox = 20
oy = 32
running = True
posX = 100 - ox
posY = 100 - oy

pygame.init()
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running=0
screen.blit(wrench, (posX, posY))
if(pygame.time.get_ticks() <= 20000):
screen.fill(white)
t = pygame.time.get_ticks() / 1000
ang = math.degrees(math.pi / 2 * math.cos(math.pi * t))
#ang = math.pi / 2 * math.cos(math.pi * t)
print(ang)
posX = 100 + (50 * math.cos(math.pi * t)) - ox
posY = 100 + (20 * math.sin(math.pi * t)) - oy
rotated_wrench = pygame.transform.rotate(wrench, ang)
screen.blit(rotated_wrench, (posX, posY))
pygame.display.flip()

• What is the expected behavior? Should it move like a real wrench? – skrx Mar 7 '18 at 3:54
• No, what I dont understand is why its origin point moves so much when the angle is positive – Mntfr Mar 7 '18 at 3:56
• And what behavior do you expect? – skrx Mar 7 '18 at 4:08
• If you want to rotate around an anchor point other than the center, I can show you an example. – skrx Mar 7 '18 at 8:10
• Did you manage to fix the issue? – Leo Mar 8 '18 at 21:49

This line is setting the X coordinate of the bliting:

posX = 100 + (50 * math.cos(math.pi * t)) - ox


The cosine is positive from 0 to 90 degrees and 270 to 0, which is the right side of a circle; and negative otherwise.

This is making the value to oscillate between 100 + 50 - ox and 100 - 50 - ox

If you want to keep the horizontal position to not oscillate in both directions, you should use the absolute value:

posX = 100 + (50 * math.fabs(math.cos(math.pi * t))) - ox