【问题标题】:Scale polygons by a ratio using only a list of their vertices仅使用顶点列表按比例缩放多边形
【发布时间】:2015-09-16 11:55:14
【问题描述】:

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


我的对象由顶点列表表示,

obj = [(1, 1), (2, 1), (1, 0), (2, 0)] # represents a 1 unit square

当然,这是我的多边形表示方式的简化分解,但在这种情况下,它们唯一有用的属性是顶点。


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

释放鼠标后,应用程序将缩放到该位置,唯一的问题是我的多边形不会随之缩放。当画布缩放时,多边形将保持在它们的确切位置,现在代表一个与以前完全不同的区域。这是因为缩放是由 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()

【问题讨论】:

  • 看看我对Rotate line around center point given two vertices的回答。我所说的旋转它们通常也适用于缩放它们。 translate-scale-untranslate 的公式当然有点不同。
  • @martineau 谢谢!您的帖子帮助很大,您对缩放图像的公式有任何了解吗?
  • 句法:我的链接答案+建议的修改将缩放图像中的所有多边形。他们每个人的价值都是一样的——所以我不确定你的意思。就您而言,我认为这只是您想要的“缩放”程度。如果比例/缩放因子为2.0,则每个多边形将变为原来的两倍。事情有点复杂,因为您实际上还希望在缩放图像的同时(由于 zoomboundedbox 的想法)实现平移(但显示的一般想法和技术仍然适用)。
  • 简而言之,您要做的不仅仅是在给定顶点列表的情况下对多边形进行缩放。它们还需要被转换为相对于缩放边界框(不是顶点列表的一部分)。如果您编辑您的问题并展示如何在给定“句柄”的情况下访问多边形顶点,我可能会制定一个比当前发布的更具体的答案——如果您甚至不再关心这个主题。

标签: python python-2.7 tkinter scaling


【解决方案1】:

正如我在评论中所说,我认为您可以使用类似于我在回答 Rotate line around center point given two vertices 时所做的事情。

唯一的区别是将点 (x,y) 相对于点 (cx, cy) 缩放 S 的数学公式是:

x_new = (  S * (x - cx) ) + cx
y_new = (  S * (y - cy) ) + cy

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

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

【讨论】:

  • 这里如何找到S的值?
  • @Urvashi:S 是所需的比例因子,所以我不明白你的问题。从什么或到什么目的查找/计算它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2011-01-02
相关资源
最近更新 更多