0

所以我在python中有一个程序,我有一些点,在按键上我需要让它们沿轴旋转,所以按x它将围绕x轴旋转,按y表示y,按z表示z。

我很确定我的代码布局正确,首先我定义了我的旋转值

x_rot = 1
y_rot = 1
z_rot = 1

接下来我设置我的数学值:

   #setup angles for rotation
angle = 1
rad = angle * math.pi / 180
cose = math.cos(rad)
sine = math.sin(rad)

然后,我将 xy 和 z 点设置在名为 Xs、Ys 和 Zs 的列表中,格式如下:

   Xs=(12.0, 25.0, 10.0, 22.0)
   Ys=(2.0, 15.0, 12.0, 27.0) 
   Zs=(21.0, 23.0, 1.0, 12.0) 

接下来,我设置按键以将我的坐标值乘以旋转矩阵,这样当我按下键盘上的 x 按钮时,我的点围绕 x 轴旋转。

done = False

while done == False:
    # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done = True # Flag that we are done so we exit this loop
            # User pressed down on a key

        elif event.type == pygame.KEYDOWN | event.type == pygame.KEYUP:
             if event.key == pygame.K_x:
                y_rot == Ys*cose(angle)-Zs*(angle)
                z_rot == Ys*sine(angle)-Zs*cose(angle)
                x_rot == Xs

然后我运行我的代码,它工作正常,直到我按下 x 按钮旋转它。当我按下按钮时,我收到一条错误消息

typeerror 'float' object is not callable

它引用了这一行

y_rot == Ys*cose(angle)-Zs*(angle)

我有一种感觉,这是一个简单的修复,但我就是想不出它可能是什么。

4

4 回答 4

4

您将浮点值分配给cose

cose = math.cos(rad)

然后尝试将该值用作具有以下功能的函数cose(angle)

y_rot == Ys*cose(angle)-Zs*(angle)

那条线还有更多错误,但让我们关注cose(angle)第一条。如果您打算将其用作乘法,请这样做:

Ys * cose * angle - Zs * angle

括号在这里只是用来混淆;仅当您需要对表达式进行分组时才使用它们。

请注意,这==是对相等性的测试;如果你想分配然后使用单个=等于:

y_rot = Ys * cose * angle - Zs * angle
z_rot = Ys * sine * angle - Zs * cose * angle
x_rot = Xs

如果YsZs元组,则需要将其分别应用于元组的每个元素:

y_rot = tuple(y * cose * angle - z * angle for y, z in zip(Ys, Zs))
z_rot = tuple(y * sine * angle - z * cose * angle for y, z in zip(Ys, Zs))
x_rot = Xs

对于您声明的值YsZs它给出:

>>> tuple(y * cose * angle - z * angle for y, z in zip(Ys, Zs))
(-19.000304609687216, -8.002284572654132, 10.998172341876696, 14.995887769222563)
>>> tuple(y * sine * angle - z * cose * angle for y, z in zip(Ys, Zs))
(-20.96189678540965, -22.734710892037747, -0.7904188179089892, -11.526957368070041)

我不太熟悉您如何在这里计算旋转矩阵;我已经为每个计算配对Ys和元组元素;Zs但我怀疑计算更复杂。更重要的是,您不能仅仅将浮点数与元组相乘并希望正确的计算能够实现。

于 2013-11-05T22:39:01.343 回答
1

按照您定义的方式cose,它会立即计算 的值math.cos(rad)并将浮点结果分配给cose. 然后再尝试调用cose(angle),这与调用基本相同2.7(angle),即胡说八道。

我想你想要更像这样的东西:

def cose(angle):
    angle = 0
    rad = angle * math.pi / 180
    return math.cos(rad)

def sine(angle):
    angle = 0
    rad = angle * math.pi / 180
    return math.sin(rad)

不过,如果 Python 中还没有内置这种度数/弧度转换,我会感到惊讶。

于 2013-11-05T22:42:03.593 回答
0

你编码那部分的方式是说这cose是一个带参数的函数angle

cose(angle) 


y_rot == Ys*cose*(angle)-Zs*(angle)
                ^
                |
            Maybe you are missing this.
于 2013-11-05T22:36:59.673 回答
-1

这里有很多问题:

 if event.key == pygame.K_x:
    y_rot == Ys*cose(angle)-Zs*(angle)
    z_rot == Ys*sine(angle)-Zs*cose(angle)
    x_rot == Xs

首先,您要分配吗?如果是这样的话

y_rot = Ys*cose(angle)-Zs*(angle) # single equal

第二:

Ys*2 # works fine
Ys*2.2 # wrong, you can't multiply it by a float

第三,你不能减去元组:

Ys - Zs
# output: error

第四:

cose(angle) #? This is wrong. cose is not a function

你应该选择:

math.cos(angle)
# or
cose

cose现在,如果您想sine成为功能,您可以执行以下操作:

cose = lambda x: math.cos(x * math.pi / 180)
sine = lambda x: math.sin(x * math.pi / 180)
于 2013-11-05T22:40:53.497 回答