1

Pygameでポリゴンの回転を実行しようとしているので、いくつかの内積を実行してラジアンを取得し、それらのラジアンにacosを適用しています。このリンクによると、内積を-1から1の間に保つためにクランプ関数を使用する必要があります。ただし、次のエラーが発生します。

d_p = (clamp(self.dot_product(other), -1.0, 1.0))
NameError: global name 'clamp' is not defined

それらは同じ名前空間にあるように見えます-これはコードに表示されるのとまったく同じです。@staticmethod私はclamp()を使ってみましたが、同じままです。動作する唯一のことは、それをインスタンスメソッドにすることです(署名clamp(self, x, a, b)ですが、クランプが特定のインスタンスについて知る必要がない場合、これは悪い解決策のようです。これを修正する正しい方法は何ですか、そして私はどの概念が欠けていますか?

class v2:
#...
    def clamp(x, a, b):
        return min(max(x, a), b)

    def radians_between(self, other):
        d_p = (clamp(self.dot_product(other), -1.0, 1.0))
        cos_of_angle = d_p/(self.get_magnitude()*other.get_magnitude())
        return math.acos(cos_of_angle)
4

1 に答える 1

4

これを修正するself.clamp()には、定義されているクラス内で使用するときに使用する必要があります。それ以外の場合v2.clamp()は、クラスの外部から呼び出す場合に使用する必要があります。

それが言ってglobal name 'clamp' is not definedいる理由は、「クランプ」が次のようなグローバルスコープの変数、関数、またはクラスであると考えているためです。

class clamp(object):
    pass

また:

clamp="I am a variable!"

または最後に:

def clamp():
    print "I am clamp in a function!"
于 2012-10-21T01:50:54.020 に答える