顺时针方向旋转2d形状

时间:2010-08-16 13:04:26

标签: python graphics 2d pygame

我是python和图形的新手,但之前已编程过。根据{{​​3}},

  

以角度θ旋转   关于起源的逆时针方向   函数形式是x'=xcosθ-ysinθ   和y'=xsinθ+ycosθ

但是下面的python代码会顺时针旋转它。有人能解释一下吗?将矩形转换为原点并返回中心似乎也是一种开销。有什么方法可以避免这种情况吗?提前谢谢。

PS:我已经看过pygame.transform.rotate这样做但我想从头开始更好地了解图形。有没有办法从python解释器中查看此方法的来源?

import pygame, sys, time
from math import *
from pygame.locals import *
co_ordinates =((200,200),(400,200),(400,300),(200,300))

window_surface = pygame.display.set_mode((500,500),0,32)
BLACK=(0,0,0)
GREEN=(0,255,0)
RED=(255,0,0)
window_surface.fill(BLACK)
ang=radians(30)
"""orig=pygame.draw.polygon(window_surface,GREEN,co_ordinates)
n_co_ordinates = tuple([(((x[0])*cos(ang)-(x[1])*sin(ang)),((x[0])*sin(ang)+(x[1])*cos(ang))) for x in n_co_ordinates])
n_co_ordinates = tuple([((x[0]+300),(x[1]+250)) for x in n_co_ordinates])
print(n_co_ordinates)
pygame.draw.polygon(window_surface,RED,n_co_ordinates)"""


pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    for i in range(360):
        ang=radians(i)
        if i>=360:
            i=0
        n_co_ordinates = tuple([((x[0]-300),(x[1]-250)) for x in co_ordinates])
        n_co_ordinates = tuple([((x[0]*cos(ang)-x[1]*sin(ang)),(x[0]*sin(ang)+x[1]*cos(ang))) for x in n_co_ordinates])
        n_co_ordinates = tuple([((x[0]+300),(x[1]+250)) for x in n_co_ordinates])
        window_surface.fill(BLACK)
        pygame.draw.polygon(window_surface,RED,n_co_ordinates)
        pygame.display.update()
        time.sleep(0.02)

4 个答案:

答案 0 :(得分:2)

Pygame使用坐标系,其中[0,0]是左上角。您的旋转在坐标系中可以正常工作,其中点越高,y坐标越高,但是pygame则相反:点越低,y坐标越高。这使得所有内容都“翻转”,因此您的对象看起来旋转的角度将与旋转它的角度相反。解决这个问题的最简单方法可能就是输入您想要旋转的角度的相反方向。

答案 1 :(得分:1)

要以相反方向旋转,请将ang更改为-ang。我怀疑你在旋转矩阵中有一个符号错误,但我永远不会记得。 (编辑:这相当于更改sin字词的符号,因为sin(-x)==-sin(x)cos(-x)==cos(x)。)

你无法避免向中心的翻译。原因是您的转换修复了原点(0,0)(从0*cos(...)==0开始),因此您始终围绕原点进行旋转。因此,要在其他任何地方旋转,您必须先将该点转换为原点。

以下是来自pygame源rotate的{​​{1}}的来源。它是用C语言编写的。

transform.c

答案 2 :(得分:1)

关于翻译,旋转和翻译,你实际上必须这样做。但是,如果您计算每个步骤的变换矩阵一次并将它们相乘以获得一个包含旋转的两个变换的变换矩阵,那么您只需要将每个顶点乘以一个矩阵。要在矩阵变换中包含平移,您需要使用“同质坐标” - 请参阅维基文章的更多内容。基本上你使用坐标(x,y,1)而不是(x,y),然后使用3x3矩阵。额外的数字允许转换。

答案 3 :(得分:0)

更改正弦条件上的标志,如下所示:

n_co_ordinates = tuple([(((x[0])*cos(ang)+(x[1])*sin(ang)),((-x[0])*sin(ang)+(x[1])*cos(ang))) for x in n_co_ordinates]) 

看看是否有帮助。