在python(矩阵)中绕点旋转

时间:2016-02-20 00:55:39

标签: python numpy matrix pygame

我的老师不太擅长将数学与代码联系起来,所以我无法从讲座中弄清楚这一点。

在pygame中(老师希望我们使用pygame + numpy进行此分配)我应该使用矩阵围绕点(太阳)旋转对象(行星的图像)。我发现有多种方法可以在没有矩阵的情况下做到这一点,但由于我们被特别要求用矩阵来做,所以这些都没用。

我无法弄清楚如何根据矩阵改变地球的中心。 任何指针/提示。我想自己编程来学习,所以我需要的是关于它如何完成的一些指示。 Under是我目前的尝试。

编辑: 为了记录,我知道要旋转一个点,你必须移动,就像你将点移动到原点,旋转然后向后移动相同的距离。我只需要知道如何在代码中执行此操作。

import sys,pygame, numpy, time
from math import *

pygame.init()

size = width, height = 1280, 720
black = 0,0,0

screen = pygame.display.set_mode(size)

sun = pygame.image.load("sun.png")
sun.convert_alpha()
sunRect = sun.get_rect()
#Placing the sun to the left in the window
sunRect = sunRect.move(20,200)

#creating another object and placing it more to the right of the sun
osuni = sun
osuni = pygame.transform.scale(osuni,(40,40))
osun = sun.get_rect()
osun = osun.move(400,300)
osua = numpy.array([400,300])

#move object to center of sun
move = numpy.array([[1,0,-20],[0,1,-200],[0,0,1]])
#move object back
back = numpy.array([[1,0,20],[0,1,200],[0,0,1]])
#rotate object by 1 degree(for smooth movement)
rotate = numpy.array([[numpy.cos(1),numpy.sin(1),0],[-numpy.sin(1),numpy.cos(1),0],[0,0,1]])
#combinex matrix for simplicity
movement = numpy.dot(back,numpy.dot(rotate,move))

#standard pygame loop
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
    time.sleep(0.1)
    #should move the object here
    screen.fill(black)
    screen.blit(sun,sunRect)
    screen.blit(osuni,osun)
    pygame.display.flip();

1 个答案:

答案 0 :(得分:1)

要理解基于矩阵的移动,您必须将对象的coordinates视为一个矩阵,将坐标垂直放置。

然后,根据您想要应用的变换类型(移动,旋转等),有变换矩阵

在你们两个之后,你做了一个矩阵乘法(按变换矩阵编码)并得到new coordinates(再次垂直)。

Here您可以看到原点上的旋转的变换矩阵以及有关使用变换矩阵的进一步说明。

请注意,Pygame使用倒置的y轴,因此,正如链接的说明所解释的那样,您应该交换矩阵以按顺时针或逆时针方向旋转。