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)

次に、次の形式で Xs、Ys、および Zs と呼ばれるリストに xy および 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

4 に答える 4

4

float 値を に割り当てました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

YsZstuplesの場合、これをタプルの各要素に個別に適用する必要があります。

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とtuple 要素をペアにしました。Zsしかし、計算はもっと複雑だと思います。要点は、float にタプルを乗算して、正しい計算が実現することを期待することはできないということです。

于 2013-11-05T22:39:01.343 に答える
1

定義した方法coseで、すぐに の値を計算しmath.cos(rad)、float の結果を に割り当て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 に答える
-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

2番:

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

第三に、タプルを減算することはできません:

Ys - Zs
# output: error

第4:

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 に答える