Я разрабатываю программу для рисования на основе Python, Whyteboard (https://launchpad.net/whyteboard)
Я разрабатываю функции, позволяющие пользователю поворачивать и масштабировать нарисованный им многоугольник. Вот моя проблема:
У меня есть класс Polygon, содержащий список всех точек, который в конце «закрыт». Пользователи могут выбрать нарисованные фигуры в моей программе, которая «подсвечивает» их, рисуя маркеры выбора в каждой точке. Эти точки можно «схватить», чтобы изменить их положение и изменить форму многоугольника.
У меня проблема: мне нужно выяснить, как рассчитать «масштаб» изменения размера, чтобы применить его к многоугольнику. Например, (удерживая мышь нажатой), пользователь, перемещающий мышь от фигуры, должен выполнять действие «расти», а приведение мыши к фигуре должно уменьшить его.
У меня есть код для выполнения масштабирования (который я считаю правильным), но я просто не могу создать «хороший» коэффициент масштабирования. Код ниже - это то, что я придумал, основываясь на ответах
/ edit - вот решенный код.
def rescale(self, x, y):
"""
x and y are the current mouse positions. the center and "original" mouse
coords are calculated below
"""
if not self.center:
a = sum([x for x, y in self.points]) / len(self.points)
b = sum([y for x, y in self.points]) / len(self.points)
self.center = (a, b)
if not self.orig_click: # where the user first clicked on
self.orig_click = (x, y)
if not self.original_points: # the points before applying any scaling
self.original_points = list(self.points)
orig_click = self.orig_click
original_distance = math.sqrt((orig_click[0] - self.center[0]) ** 2 + (orig_click[1] - self.center[1]) ** 2)
current_distance = (math.sqrt((x - self.center[0]) ** 2 +
(y - self.center[1]) ** 2))
self.scale_factor = current_distance / original_distance
for count, point in enumerate(self.original_points):
dist = (point[0] - self.center[0], point[1] - self.center[1])
self.points[count] = (self.scale_factor * dist[0] + self.center[0], self.scale_factor * dist[1] + self.center[1])
В настоящее время этот код, кажется, быстро сокращает мой полигон до нуля, и никакое движение мышью не вырастет обратно. Иногда это будет наоборот и быстро расти; но не отступать.