Python typeerror'flora'对象不可调用

时间:2013-11-05 22:35:48

标签: python matrix rotation

所以我在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)

然后我按照以下格式在名为Xs,Ys和Zs的列表中设置我的点x y和z点:

   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 个答案:

答案 0 :(得分: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)

我不太熟悉你在这里如何计算旋转矩阵;我为每个计算配对了YsZs元组元素;但我怀疑计算更多涉及。关键在于你不能将浮点数与元组相乘,并希望正确的计算能够实现。

答案 1 :(得分: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中,我会感到惊讶。

答案 2 :(得分:0)

您编写该部分的方式是cose是带参数的函数angle

cose(angle) 


y_rot == Ys*cose*(angle)-Zs*(angle)
                ^
                |
            Maybe you are missing this.

答案 3 :(得分:-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

现在,如果您希望cosesine成为函数,则可以执行以下操作:

cose = lambda x: math.cos(x * math.pi / 180)
sine = lambda x: math.sin(x * math.pi / 180)