Python 仅使用多边形顶点列表按比例缩放多边形

Python 仅使用多边形顶点列表按比例缩放多边形,python,python-2.7,tkinter,scaling,Python,Python 2.7,Tkinter,Scaling,在我的程序中,用户可以在matplotlib绘图上绘制形状,并使用这些形状执行各种操作。我目前正在尝试实现这些形状的缩放,以保持它们相对于主绘图的位置,即使在放大时也是如此 我的对象由顶点列表表示 obj = [(1, 1), (2, 1), (1, 0), (2, 0)] # represents a 1 unit square 当然,这是多边形表示方式的简化分解,但在本例中,多边形唯一有用的属性是顶点 用户可以选择要放大的边界框,如下所示 释放鼠标后,应用程序将缩放到该位置,唯一的问

在我的程序中,用户可以在matplotlib绘图上绘制形状,并使用这些形状执行各种操作。我目前正在尝试实现这些形状的缩放,以保持它们相对于主绘图的位置,即使在放大时也是如此


我的对象由顶点列表表示

obj = [(1, 1), (2, 1), (1, 0), (2, 0)] # represents a 1 unit square
当然,这是多边形表示方式的简化分解,但在本例中,多边形唯一有用的属性是顶点


用户可以选择要放大的边界框,如下所示

释放鼠标后,应用程序将缩放到该位置,唯一的问题是我的多边形不使用此选项进行缩放。当画布被缩放时,多边形将保留在它们的确切位置,并且现在表示一个与以前完全不同的区域。这是因为缩放由matplotlib处理,matplotlib是实际应用程序的后端。如果用户要放大上面所选的位置,我想做的是按照下面图片所示的内容:

所以我知道的是

  • 对象的顶点列表
    [(1,2)、(1,0)…]
  • 包含在有界缩放中的所有对象的句柄列表
    targets=[itemHandle1,itemHandle2….]
  • 通过左上角和右下角坐标的有界缩放框的位置,例如
    zoomboundedbox=[(162,62)、(937,560)]
我相信我知道正确缩放这些对象所需的有关对象的所有数据,但我不知道允许我完成此操作的算法

def receive(self, lim):
'''
Calculate new coordinates of polygons visible to screen, this function
is called when the user releases the mouse button on the zoom function,
the parameters of the bounding box are internally stored as (x,y) tuples
in xyf (x,y first) and xyl (x,y last)
'''

    # Grab all item handles to polygons that intersect with the zoom
    # Stored in `targets`

    for shape in self.activePolygonList:         # loop through active polygons on screen
        if shape.handle() in targets:            # if the polygon is a target to be scaled
            print "scaling...."
            # ?                                   
            shape.redrawShape()

正如我在评论中所说,我认为你们可以使用类似于我在回答问题时所做的事情

唯一的区别是,将一个点(x,y)按相对于该点(cx,cy)的系数
S
进行缩放的数学公式如下:

这些决定了如何在内环中计算(x1,y1)和(x2,y2)中的点(p1x,p1y)和(p2x,p2y)


另一个区别可能是,您希望相对于用户边界框的中心而不是每个多边形的中心缩放所有多边形。这意味着您不必为每个多边形计算
cx
cy
(这将使它更快)。

看看我的答案。我所说的旋转它们通常也适用于缩放它们。“翻译比例-非翻译”的公式当然有点不同。@martineau谢谢!你的帖子帮了大忙,你知道缩放图像的公式吗?语法:我的链接答案+建议的修改将缩放图像中的所有多边形。每一个都是相同的值,所以我不确定你的意思。在你的情况下,我认为这只是你想要多大的“缩放”。如果缩放/缩放因子为
2.0
,则每个多边形将变为原来的两倍大。事情有点复杂,因为您实际上还希望在缩放图像的同时(由于zoomboundedbox的想法)实现平移(但显示的一般想法和技术仍然适用)。简而言之,您想要做的不仅仅是在给定多边形顶点列表的情况下缩放多边形。它们还需要相对于缩放边界框进行转换(缩放边界框不属于它们的顶点列表)。如果您编辑您的问题并展示如何访问给定“句柄”的多边形顶点,如果您不再关心此主题,我可能能够制定比当前发布的答案更具体的答案。我如何在此处找到S的值?@Urvashi:
S
是所需的比例因子,因此我不理解您的问题。从什么或到什么目的查找/计算?
x_new = (  S * (x - cx) ) + cx
y_new = (  S * (y - cy) ) + cy