如何为PsychoPy中双圆形光栅实现试验间位置随机化?
解决PsychoPy光栅位置随机化问题
要实现每次试验中两个光栅的位置随机变化,你可以借助Python的random模块生成随机坐标,同时可按需控制光栅不重叠或不超出窗口。以下是修改后的完整代码及说明:
修改后的代码
import psychopy.visual import psychopy.event import random win = psychopy.visual.Window( size=[1200, 600], units="pix", fullscr=False ) # 分别创建水平、垂直光栅对象,避免复用同一对象的属性冲突 grating_h = psychopy.visual.GratingStim( win=win, units="pix", size=[400,400], sf=5.0/150.0, mask="circle", ori=0.0 # 固定水平朝向 ) grating_v = psychopy.visual.GratingStim( win=win, units="pix", size=[400,400], sf=5.0/150.0, mask="circle", ori=90.0 # 固定垂直朝向 ) # 计算安全坐标范围:保证光栅不会超出窗口边缘 x_min = - (1200//2 - 400//2) x_max = 1200//2 - 400//2 y_min = - (600//2 - 400//2) y_max = 600//2 - 400//2 # 生成不重叠的随机位置(如果允许重叠可跳过此函数) def get_non_overlap_pos(): while True: pos1 = [random.uniform(x_min, x_max), random.uniform(y_min, y_max)] pos2 = [random.uniform(x_min, x_max), random.uniform(y_min, y_max)] # 检查两个光栅中心距离是否大于直径,避免重叠 distance = ((pos1[0]-pos2[0])**2 + (pos1[1]-pos2[1])**2)**0.5 if distance > 400: return pos1, pos2 # 模拟多次试验(可修改循环次数) for trial in range(5): # 若允许重叠,直接生成两个独立随机坐标即可 # pos_h = [random.uniform(x_min, x_max), random.uniform(y_min, y_max)] # pos_v = [random.uniform(x_min, x_max), random.uniform(y_min, y_max)] # 生成不重叠位置 pos_h, pos_v = get_non_overlap_pos() grating_h.pos = pos_h grating_v.pos = pos_v # 绘制并刷新窗口 grating_h.draw() grating_v.draw() win.flip() # 按空格进入下一次试验,按ESC退出 keys = psychopy.event.waitKeys(keyList=['space', 'escape']) if 'escape' in keys: break win.close()
核心修改点
- 引入
random模块:实现坐标的随机生成。 - 拆分光栅对象:避免复用同一对象时的属性覆盖问题,分别固定水平/垂直朝向,逻辑更清晰。
- 安全坐标范围:根据窗口和光栅尺寸计算可显示的坐标区间,防止光栅超出窗口。
- 可选的不重叠控制:通过函数循环生成位置,确保两个光栅不会重叠;若无需此限制,可直接生成独立随机坐标。
- 多试验循环:支持多次重复试验,每次刷新随机位置,按键控制试验流程。
内容的提问来源于stack exchange,提问作者Anastasios Gratsakis
相关产品推荐
相关产品推荐

