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