【问题标题】:How to pick the nearest marker from clicked point in vispy?如何从vispy中的点击点选择最近的标记?
【发布时间】:2020-04-15 23:05:06
【问题描述】:

vispy 库中,我有一个显示为标记的点列表,我想更改最接近单击点的点的颜色(或仅获取其索引)。

我可以通过 event.pos 获得点击点的像素,但我需要它的实际坐标来与其他人进行比较(或获取其他标记的像素点以将其与事件位置进行比较)。

我有这段代码来获取最近的点索引。它需要输入一个数组和一个点(点击一个)

def get_nearest_index(pos,p0):
    count=0
    col =[(1,1,1,0.5) for i in pos]
    dist= math.inf
    ind=0
    for i in range(len(pos)):
        d = (pos[i][0]-p0[0])**2+(pos[i][1]-p0[1])**2
        if d<dist:
            ind=i
            dist=d
    return ind

但问题是我必须在同一个坐标系中传递它们。 打印出event.pos 会返回如下像素:[319 313] 而我在pos 数组中的位置是:

[[-0.23801816  0.55117583 -0.56644607]
 [-0.91117247 -2.28957391 -1.3636486 ]
 [-1.81229627  0.50565064 -0.06175591]
 [-1.79744952  0.48388072 -0.00389405]
 [ 0.33729051 -0.4087148   0.57522977]]

所以我需要将其中一个转换为另一个。像

这样的转换
tf = view.scene.transform
p0 = tf.map(pixel_pt)
print(str(pixel_pt) + "--->"+str(p0))

打印出[285 140 0 1]---&gt;[ 4.44178173e+04 -1.60156369e+04 0.00000000e+00 1.00000000e+00],它离点还很远。

【问题讨论】:

    标签: python simulation vispy


    【解决方案1】:

    将像素转换为本地坐标时,您使用的是 transform.map,根据vispy tutorial,它会为您提供地图坐标。您需要使用的是逆映射。

    您可以尝试这样做:

    tf = view.scene.transform
    point = tf.imap(event.pos)
    print(str(event.pos) + "--->"+str(point))
    

    同样,如果您需要转换特定的标记集,这将是一种更好的方法。

    ct = markers.node_transform(markers.root_node)
    point = ct.imap(event.pos)
    

    【讨论】:

    • markers.node_transform(markers.root_node)view.scene.transform 现在都一样,我可以得到最近的点。附带说明 `print([int(x) for x in tf.map(p)])` 为 pos 中的每个 p 打印负点,如 [-1746, -342, 0, 1] 所以 map 和 imap 不完全相反?
    • 超出可见画布范围的像素被表示为负像素点或极大像素点,具体取决于它们的位置。所以,这可能就是你得到的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多