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),但是当clamp 不需要了解特定实例时,这似乎是一个糟糕的解决方案。解决此问题的正确方法是什么,我缺少什么概念?

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是因为它认为“clamp”应该是全局范围内的变量、函数或类,例如:

class clamp(object):
    pass

或者:

clamp="I am a variable!"

或者最后:

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