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