【问题标题】:Psychopy: Creating multiple line objects simultaneouslyPsychopy:同时创建多个线对象
【发布时间】:2017-06-24 16:28:48
【问题描述】:

我的代码在这里有效,但我当前的方法效率很低且耗时。我正在生成 4 个笛卡尔坐标并将它们附加到列表中。然后我创建 4 个 Psychopy 线对象 (visual.Line) 并从我的坐标列表 (zdot_list) 中为每个对象分配一个 x,y 坐标。目前,我一个接一个地创建 4 个线对象,并为每个“开始”参数分配一个 xy 位置。

from psychopy import visual, core, event, sound
import random
import math

win = visual.Window([800,600],color=(0,0,0), colorSpace='rgb', rgb=None, allowGUI=True, monitor='testMonitor', units='deg', fullscr=True, screen=2)

# input polar, output cartesian coords
def pol_to_cart(distance, angle, x_origin=0, y_origin=0):

    x=distance*math.cos(math.radians(angle))
    y=distance*math.sin(math.radians(angle))

    return x +x_origin, y + y_origin


zdots = 4
zdot_list = []
j=(-8)

# generate 4 xy coordinates and append to list
for i in range(zdots):

    angle=0

    line_cart = pol_to_cart(j, angle)
    dotx = line_cart[0]
    doty = line_cart[1]
    zdot_list.append([dotx, doty])

    j += .2

# generate 4 lines, add xy coordinate (from list^) to 'start' argument of each
linea = visual.Line(win, start=(zdot_list[0]), end=(4,0), lineColor="white")
lineb = visual.Line(win, start=(zdot_list[1]), end=(4,0), lineColor="white")
linec = visual.Line(win, start=(zdot_list[2]), end=(4,0), lineColor="white")
lined = visual.Line(win, start=(zdot_list[3]), end=(4,0), lineColor="white")

lines = [linea, lineb, linec, lined]

# display lines
for line in lines:
    line.draw()
    win.flip()
    core.wait(3)
    win.close()

有没有更有效的方法来使用循环创建线(或任何形状)对象?我想自动生成我需要的对象,分别将我的 xy 坐标添加到每个对象的“开始”参数。图像中只有 4 个线对象,但实际上我需要 80 多个,每个对象都有不同的 xy 起始坐标。

干杯, 乔恩

【问题讨论】:

    标签: python psychopy


    【解决方案1】:

    您可以尝试从可视化模块探索多边形。下面的多边形使用示例

    from psychopy import visual, core, event, sound
    win = visual.Window([680,480],color=(0,0,0), colorSpace='rgb', rgb=None, allowGUI=True, monitor='testMonitor', units='deg', fullscr=False, screen=2)
    pgon = visual.Polygon(win, edges=4)
    pgon.draw()
    win.flip()
    

    您可以通过查看psychophy 文档来探索顶点和其他选项。

    对您的代码的优化是:

    zdots=40
    zdot_list = []
    
    for i in range(zdots):
        angle=0
        line_cart = pol_to_cart(j, angle)
        zdot_list.append(visual.Line(win, start=([line_cart[0], line_cart[1]]), end=(4,0), lineColor="white"))
        j += .2
    
    for i in zdot_list:
        i.draw()
    
    win.flip()
    core.wait(3)
    win.close()
    

    【讨论】:

    • 您的优化一次显示一行,我需要全部显示在一起。
    • @Jon 优化改为一次性显示。
    • 有没有办法让我不需要在循环过程中绘制它们?如果我现在将这些画在循环之外,我只会看到一条线(可能是循环的最后一次迭代)。我需要更多地控制何时绘制这些线条。
    • 啊,我明白了,我正在使用您的解决方案,但是在循环的每次迭代中将 visual.Line 对象附加到列表中,效果很好。谢谢你。我编辑了你的答案,如果你接受编辑,我会用绿色打勾。
    【解决方案2】:

    建议的解决方案只有 4 行。如果数组中有更多行,您应该使用 ElementArrayStim 来更有效地绘制大量对象。这最初是为绘制位图纹理而设计的,但是如果您将 size 参数设置为又长又细,并将纹理设置为空,那么您实际上会得到一条线。 请参阅此处的代码以获取示例:

    https://github.com/psychopy/psychopy/issues/1350

    因此,要扩展到 80 多条线,您应该走这条路。

    【讨论】:

    • 使用 ElementArrayStim,我将如何为线创建起点和终点?这些选项在类参数中不可用。
    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多