Beginner. 2d rotation gives unexpected results.

enmce at yandex.ru enmce at yandex.ru
Tue Jul 23 08:34:25 EDT 2013


Hello! 
This is my first post, nice to meet you all!
I`m biology student from Russia, trying to learn python to perform some 

simple simulations.

Here`s my first problem.
I`m trying to perform some simple 2d vector rotations in pygame, in order 

to learn the basics of linear algebra and 2d transformations. So far i 

understand matrix multiplication pretty well, and probably all my math is 

right. Eventually i`m planning to write Poly class, and use it to rotate 

and translate some simple shapes. But when i try and write it in the 

program, i get very weird results, like all points of rectangle with 

coordinates [0,0],[0,100],[100,0],[100,100] start to go spiral and 

eventually shrink to the center. Although even Excel calculations with 

this formulas give me right result.
I use Python 3.3 on Windows Xp. 
What is wrong with my code?

[code]import pygame
import math as m

black = ( 0, 0, 0)
white = ( 255, 255, 255)
green = ( 0, 255, 0)
red = ( 255, 0, 0)

class Poly():
    pos = [100,100] #x and y coordinates of a point
    rot = m.radians(1) #rotation in degrees
    def draw(self): #draw point
        pygame.draw.circle(screen,white,self.pos,10,0)
    def rotate(self): # rotation method
        sin = m.sin(self.rot) #calculationg sin and cos
        cos = m.cos(self.rot)
        x_rot = int(self.pos[0]*cos-self.pos[1]*sin) #mulpitplicating 

vector to rotation matrix
        y_rot = int(self.pos[0]*sin+self.pos[1]*cos)

        self.pos[0] = x_rot #set new coordinates to a point
        self.pos[1] = y_rot

a = Poly() #Some simple sample points giving rectangle
b = Poly()
c = Poly()
d = Poly()

b.pos = [0,100]
c.pos = [100,0]
d.pos = [0,0]

pygame.init()
size = [700,500]
screen = pygame.display.set_mode(size)
done = False
clock = pygame.time.Clock()
while done == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    a.rotate() #perform rotation
    b.rotate()
    c.rotate()
    d.rotate()

    screen.fill(black)
    
    a.draw() #draw point
    b.draw()
    c.draw()
    d.draw()
    pygame.display.flip()
    clock.tick(30)

pygame.quit()[/code]

P.S. Sorry for my english, bit rusty in that department.



More information about the Python-list mailing list