我有两个功能,一个是在2D画布项目(多边形)中执行旋转,另一个是翻译“机器人”。此举是这样的:
。
如果执行旋转,则移动应如下所示:
。
这里的功能:
def rotation(self, i):
if i == '+':
if self.angle == 360:
self.angle = 0.0
self.angle += 1
delta = radians(1)
elif i == '-':
if self.angle == 0:
self.angle = 360.0
self.angle -= 1
delta = -radians(1)
x0, y0 = self.center[0], self.center[1]
tmp = list()
pts = self.polygon
for i in range(0, len(pts), 2):
xa, ya = pts[i], pts[i + 1]
xl, yl = xa - x0, ya - y0
xll, yll = cos(delta) * xl + sin(delta) * yl, -sin(delta) * xl + cos(delta) * yl
xr, yr = xll + x0, yll + y0
tmp.append(xr)
tmp.append(yr)
self.polygon = tmp.copy()
self.arena.coords(self.item_canvas, self.polygon)
def move_polygon(self, x, y, switch=False):
tmp = self.polygon
for i in range(0, len(tmp), 2):
if not switch:
tmp[i] += cos(radians(self.angle)) * x * 5
tmp[i + 1] += -sin(radians(self.angle)) * y * 5
else:
tmp[i] += -sin(radians(self.angle)) * x * 5
tmp[i + 1] += cos(radians(self.angle)) * y * 5
print('x:{} y:{}'.format(cos(radians(self.angle)), -sin(radians(self.angle))))
self.polygon = tmp.copy()
self.update_polygon()
def move(self, dir):
if dir == 'f':
x, y = cos(radians(self.angle)), sin(radians(self.angle))
self._move_polygon(x, y)
if dir == 'b':
x, y = -cos(radians(self.angle)), -sin(radians(self.angle))
self._move_polygon(x, y)
if dir == 'l':
x, y = -sin(radians(self.angle)), -cos(radians(self.angle))
self._move_polygon(x, y, True)
if dir == 'r':
x, y = sin(radians(self.angle)), cos(radians(self.angle))
self._move_polygon(x, y, True)
这个想法是将x和y在角度函数中的变化传递给平移函数(move_polygon)。当角度为零时,移动是正确的(仅在第一象限和第三象限,方向相反...)。
我知道我需要添加x和y偏移量来执行平移,但是与角度,中心和旋转轴的关系令人困惑和沮丧。因此,我需要帮助来理解数学以及执行此任务的正确方法。
答案 0 :(得分:0)
因此,机器人具有自己的方向self.angle
,并且您想沿该方向向后移动机器人,并向左和向右移动它(例如射击游戏中的strafe吗?)?
在这种情况下,您需要更改move
中的符号:
if dir == 'l':
x, y = sin(radians(self.angle)), -cos(radians(self.angle))
self._move_polygon(x, y, True)
if dir == 'r':
x, y = -sin(radians(self.angle)), cos(radians(self.angle))
但是为什么要在cos
内再次应用sin
和move_polygon
因素呢?看来您只需要使用提供的位移(使用速度系数)来更新坐标,如下所示:
tmp[i] += x * 5
tmp[i+1] += y * 5
还删除True
作为switch
参数