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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (97)

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

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

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

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

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

一旦释放鼠标,应用程序将缩放到该位置,唯一的问题是我的多边形不会随此缩放。当画布被缩放时,多边形将保留在它们的确切位置,现在代表与之前完全不同的区域。这是因为缩放由matplotlib处理,matplotlib是实际应用程序的后端。我会喜欢做的是沿着什么,如果用户要放大高于所选的位置下面的图片溢于言表:

所以我所知道的是

  • 对象的顶点列表 [(1,2),(1,0)....]
  • 有界缩放中包含的所有对象的句柄列表 targets = [itemHandle1, itemHandle2....]
  • 有界缩放框的位置通过topleft和right right坐标,例如 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)S相对于点(cx,cy)的因子进行缩放的数学公式为:

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

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

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

扫码关注云+社区

领取腾讯云代金券