我开发了一个基于 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])
目前,这段代码似乎可以迅速将我的多边形缩小到零,并且没有多少鼠标移动会使它重新长出来。有时它会适得其反,迅速成长;但不退缩。