Поворот 2D-полигона без изменения его положения

У меня есть этот код:

class Vector2D(object):
    def __init__(self, x=0.0, y=0.0):
        self.x, self.y = x, y

    def rotate(self, angle):
        angle = math.radians(angle)
        sin = math.sin(angle)
        cos = math.cos(angle)
        x = self.x
        y = self.y
        self.x = x * cos - y * sin
        self.y = x * sin + y * cos

    def __repr__(self):
        return '<Vector2D x={0}, y={1}>'.format(self.x, self.y)

class Polygon(object):
    def __init__(self, points):
        self.points = [Vector2D(*point) for point in points]

    def rotate(self, angle):
        for point in self.points:
            point.rotate(angle)

    def center(self):
        totalX = totalY = 0.0
        for i in self.points:
            totalX += i.x
            totalY += i.y

        len_points = len(self.points)

        return Vector2D(totalX / len_points, totalY / len_points)

Проблема в том, что когда я вращаю многоугольник, он тоже движется, а не только вращается.

Так как же повернуть многоугольник вокруг своего центра, не меняя его положение?


person ivknv    schedule 11.02.2015    source источник


Ответы (1)


Вы вращаетесь вокруг 0/0, а не вокруг его центра. Попробуйте переместить многоугольник перед вращением так, чтобы его центр был 0/0. Затем поверните его и, наконец, верните обратно.

Например, если вам нужно только перемещение вершин/полигонов для этого конкретного случая, вы, вероятно, могли бы просто настроить rotate так:

def rotate(self, angle):
    center = self.center()
    for point in self.points:
        point.x -= center.x
        point.y -= center.y
        point.rotate(angle)
        point.x += center.x
        point.y += center.y
person Frerich Raabe    schedule 11.02.2015
comment
Но теперь у меня другая проблема: полигон «растягивается». Что-то странное происходит - person ivknv; 11.02.2015
comment
Еще одно предложение. Как правило, в графических приложениях вы действительно хотите, чтобы центр каждого объекта находился в 0,0. Таким образом, каждый объект можно вращать, масштабировать и т. д. в его собственной локальной системе координат. После завершения всех этих преобразований объект затем преобразуется в его текущее положение в системе координат вида. Таким образом, вам нужно только поддерживать сами объекты (немодифицированные) и набор преобразований, которые применяются с приоритетом в зависимости от того, являются ли они локальными или ориентированными на представление. - person David Hoelzer; 11.02.2015
comment
Упс... Это был мой недостаток. Предложенный код действительно отлично работает! - person ivknv; 11.02.2015