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])
現在、このコードは私のポリゴンをすぐにゼロに縮小しているようで、マウスを少し動かしてもポリゴンは元に戻りません。時にはそれは反対のことをし、急速に成長します。しかし、縮むことはありません。