旋转后多边形的平移

时间:2018-12-06 23:13:01

标签: python-3.x geometry tkinter-canvas

我有两个功能,一个是在2D画布项目(多边形)中执行旋转,另一个是翻译“机器人”。此举是这样的:

robot movement

如果执行旋转,则移动应如下所示:

robot movement after rotation

这里的功能:

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偏移量来执行平移,但是与角度,中心和旋转轴的关系令人困惑和沮丧。因此,我需要帮助来理解数学以及执行此任务的正确方法。

1 个答案:

答案 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再次应用sinmove_polygon因素呢?看来您只需要使用提供的位移(使用速度系数)来更新坐标,如下所示:

 tmp[i] += x * 5   
 tmp[i+1] += y * 5   

还删除True作为switch参数