所以我在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)
我有一种感觉,这是一个简单的修复,但我无法想到它可能是什么。
答案 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
如果Ys
和Zs
是元组,则需要将其分别应用于元组的每个元素:
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
对于您所说的Ys
,Zs
的值,我们提供:
>>> 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
元组元素;但我怀疑计算更多涉及。关键在于你不能将浮点数与元组相乘,并希望正确的计算能够实现。
答案 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
现在,如果您希望cose
和sine
成为函数,则可以执行以下操作:
cose = lambda x: math.cos(x * math.pi / 180)
sine = lambda x: math.sin(x * math.pi / 180)