我用一个围绕另一个点旋转的方法定义一个Point类:
def Rotate(self, origin, degrees):
d = math.radians(degrees)
O = origin
sin = math.sin(d)
cos = math.cos(d)
print ("original "+self.ToString())
self.x += -O.x
self.y += -O.y
print ("-origin "+self.ToString())
WX = self.x * cos -self.y * sin
WY = self.x * sin +self.y * cos
self = Point(WX,WY)
print ("-origin, after transform "+self.ToString())
self.x += O.x
self.y += O.y
print ("End of method "+self.ToString())
然后我测试方法如下:
test = [Point(100,100),Point(110,110)]
test[0].Rotate(test[1],10)
print ("outside of method" + test[0].ToString())
打印命令的输出显示在方法结束时分配了所需的值,但随后更改了。
为什么会这样?
打印输出:
original 100 100
-origin -10 -10
-origin, after transform -8.111595753452777 -11.584559306791382
End of method 101.88840424654722 98.41544069320862
outside of method-10 -10
答案 0 :(得分:0)
在你的功能中你写道:
self = Point(WX,WY)
然而,此方法之外无影响:现在您修改了本地变量self
。您无法以这种方式重新分配self
。更改本地变量self
后,您的self.x
当然会指向新x
的新Point(..)
属性,但是您不会更改您调用该方法的对象。
但您可以做的是分配到字段:
self.x, self.y = WX, WY
话虽如此,你可以把事情做得更紧凑:
def rotate(self, origin, degrees):
d = math.radians(degrees)
sin = math.sin(d)
cos = math.cos(d)
dx = self.x - origin.x
dy = self.y - origin.y
wx = dx * cos - dy * sin + origin.x
wy = dx * sin + dy * cos + origin.y
self.x = wx
self.y = wy