gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:54:29 24 4
gpt4 key购买 nike

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


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

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

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


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

enter image description here

一旦松开鼠标,应用程序将缩放到该位置,唯一的问题是我的多边形不会随之缩放。当 Canvas 缩放时,多边形将保留在它们的确切位置,现在代表一个与以前完全不同的区域。这是因为缩放是由 matplotlib 处理的,它是实际应用程序的后端。如果用户要放大上面选定的位置,我想要做的是沿着下面图片显示的内容: enter image description here

所以我知道的是

  • 对象的顶点列表[(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 的回答中所做的事情.

唯一的区别是,将点 (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(这样会更快)。

关于python - 仅使用顶点列表按比例缩放多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31125511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com