Перевод многоугольника после поворота - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть две функции: одна выполняет вращение в элементе 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).Когда угол равен нулю, движение является прямым (только в 1-м и 3-м квадранте, с обратными направлениями ...).

Я знаю, что мне нужно добавить смещение x и y, чтобы выполнить перевод, носвязь с углом, центром и повернутой осью сбивает с толку и расстраивает.Поэтому мне нужна помощь, чтобы понять математику и правильный способ выполнения этой задачи.

1 Ответ

0 голосов
/ 07 декабря 2018

То есть у робота есть собственное направление self.angle, и вы хотите переместить робота в этом направлении, в обратном направлении и сместить его (как в стрелялках?) Влево и вправо?

В этом случае вам нужно изменить знаки в 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 параметры

...