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

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

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

在我的程序中,用户可以在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为每个多边形(这将使其更快)。

热门问答

如何设置物联网通信的规则引擎转发到微信小程序?

DylanRichard

腾讯 · 产品经理 (已认证)

万物互联的时代,欢迎来到IoT的世界
推荐

正如参考文章所述,通过规则引擎述是将设备上行数据转发到服务端而不是直接到小程序,需要开发者基于API SDK用于服务端开发,并于小程序进行上下行通信。

在房间内切出app/闪退后还继续收费吗?

腾讯音视频小蔡

深圳市腾讯科技 · 软件开发工程师 (已认证)

QQ:471381568
推荐
1、切出app调用pause的时候是在房间的话,会一直收费。 2、比如A在程序闪退后,如果没有重连,90秒后A会自动退出房间。 3、扣费有疑问可以先看下运营指引:https://cloud.tencent.com/document/product/607/17448 如果对扣费还...... 展开详请

腾讯IM web端sdk 1.7版本,更新到当前最新,在哪里可以查看有什么改动呢?

为什么我通过控制台vnc看到的界面和用vnc viewer看的的界面不一样???

HappyLau谈云计算专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐

控制台页面使用的是novnc,novnc是一种基于web页面使用的vnc客户端,详情可参考https://github.com/novnc/noVNC介绍,常规的vnc viewer是图形的客户端,所使用的依赖库有所不同,因此显示也不一样。

使用微信小程序也可以做腾讯云的标准视频直播吗?使用微信小程序做腾讯云的视频直播和im即时通讯可行吗?

美女视频一起走向共同富裕
推荐
支持的 IM部分,集成云通信 https://cloud.tencent.com/document/product/269/36838 标准直播部分,使用live-pusher和live-player标签,然后用云直播即可 https://cloud.tencent.com/do...... 展开详请

API获取域名列表一直AuthFailure,code:4100?

zqfan

腾讯 · 高级工程师 (已认证)

推荐
推荐使用SDK进行调用:https://github.com/QcloudApi/qcloudapi-sdk-python 如果要自己写,也请参考下签名文档中python的代码示例,或者SDK中的源码:https://github.com/QcloudApi/qcloudapi-...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励