心理应用工具包 psychtoolbox 绘制小球走迷宫

news2024/11/16 20:40:30

psychtoolbox 是 MATLAB 中的一个工具包,对于科研人员设计实验范式来说是不二之选,因为它可以操作计算机的底层硬件,精度可以达到帧的级别。


文章目录

  • 一、实验目的
  • 二、psychtoolbox 的下载安装
  • 三、Psychtoolbox 的基本使用
  • 四、完整代码

一、实验目的

我们的目的是设计出一个迷宫(网格线上的一条路径),使得小球每隔3s就移动一格,当然每次小球移动的对错概率都是我们自己实现设定好的。
在这里插入图片描述

二、psychtoolbox 的下载安装

  1. 首先在BING搜索,认准第一个org结尾的官网,可以进入官网,也可以直接点击下方的“Download”,跳转到下载界面。
    在这里插入图片描述
  2. 进入到下载界面后,按照下图中的三个步骤(第一步可不做,如果是第一次安装)。
    在这里插入图片描述

(1)下面是第二步,点击这里可下载gstreamer,按照指引一步步安装即可。在这里插入图片描述
(2)下载zip,将压缩包的子文件夹里的所有文件都拖入到一个新建的“toolbox”文件夹里。
在这里插入图片描述

处理完之后像下图一样就对了。在这里插入图片描述

  1. 进入MATLAB,打开到刚才的toolbox->Psychtoolbox 路径。
    在这里插入图片描述
  2. 在命令行中输入 SetupPsychtoolbox ,回车,等待即可,中间需要一路回车进行。最后出现“Success,Enjoy”等字样即安装成功。可以继续在命令行使用 Screen来测试是否安装成功。

三、Psychtoolbox 的基本使用

  1. 基本原理
    首先它是通过一帧一帧翻转窗口来实现所谓的动态效果,所以我们的逻辑基本就是先在画布上绘制下一帧的画面,然后翻转。
    可以自行到官网找到参考文档,网络上所有文章基本都是从那里复制出来的,并且还可以看到官网提供的Demos。在这里插入图片描述

  2. 这里提供几个常使用到的函数:

/* 开头需要加的。 */
Screen('Preference', 'SkipSyncTests', 1);
Screen('Preference','SkipSyncTests',2);

/* 隐藏鼠标。 */
HideCursor;

/* 函数功能:新建一个窗口。
 * 返回值:w,窗口的句柄;
 * 返回值:wrect,主要用来获取屏幕的长宽。
 * 参数:命令,可在命令行“help Screen”获取帮助文档或者直接到官网。
 * 参数:第n个屏幕,一般无扩展屏的话直接默认0.
 * 参数:颜色,窗口的RGB数组。这里是黑色。
 */
[w, wrect] = Screen('OpenWindow', 0, [0, 0, 0]);

/* 写文本。一般进行心理实验之前需要一段引导语。
 * 参数:imread后面为图片的路径。
 */
instruction=Screen('MakeTexture',w,imread('xxx\xxx\xx.tif'));
Screen('DrawTexture',w,instruction,[]);%显示提示语

/* 函数功能:画直线。
 * 返回值:无
 * 参数:命令,画直线、画圆等等。
 * 参数:窗口的句柄,按之前来讲就是w。
 * 参数:颜色。
 * 参数:后面四个参数依次为x轴起点坐标、y轴起点坐标、x轴终点坐标、y轴终点坐标。
 * 参数:线宽。
 */
Screen(‘DrawLine’, windowPtr [,color], fromH, fromV, toH, toV [,penWidth]);

/* 函数功能:画实心圆。
 * 返回值:无
 * 参数:命令。
 * 参数:窗口的句柄。
 * 参数:颜色。
 * 参数:后面四个参数依次为圆的左、上、右、下边界坐标。
 */
Screen(‘FillOval’, windowPtr [,color] [,rect] [,perfectUpToMaxDiameter]);

/* 翻转。每次绘制完画布都要进行一次翻转,这样新绘制的场景才能显示出来。重要!!! */
Screen('Flip',w)

/* 延时函数,单位:秒。*/
WaitSecs();

/* 按键检测。以下是一个退出机制,按下Esc键退出。27对应Esc键的ASCII值。*/
while true
    [keyIsDown,~,keyCode]=KbCheck;
    if keyCode(27)
        break;
    end
end

/* 关闭窗口,搭配上面的退出机制使用。*/
Screen('CloseAll');

/* 常用的颜色RGB值。*/
color_red = [255,0,0];
color_white = [255, 255, 255];
color_black = [0, 0, 0];
color_yellow = [255, 255, 0];

四、完整代码

  1. 功能逻辑通过一个哈希表来一一映射小球每一步的正确、错误情况。
decision_hashmap = zeros(1, 100);
decision_hashmap(1, [3,7,13,18,23,27,32,37,  42,46,50,  54,58,  63,67,  72,76,  79,  83]) = 1; % 第i个元素置一表示第i步为小球错误运动方向  
step_up_right = 8 + 2 * 2; % 由up转向right的第x步
 step_right_down = step_up_right + 8 + 2 * 3;
 step_down_left = step_right_down + 8 + 2 * 3;
 step_left_up = step_down_left + 6 + 2 * 3;
 step_up_right_2 = step_left_up + 6 + 2 * 2;
 step_right_down_2 = step_up_right_2 + 4 + 2 * 2;
 step_down_left_2 = step_right_down_2 + 4 + 2 * 2;
 step_left_up_2 = step_down_left_2 + 2 + 2 * 1; 
 step_up_end = step_left_up_2 + 2 + 2 * 1;

在for循环里实现小球的转向和正误判断,下面只张贴正确情况的转向逻辑代码,完整代码可移步gitee仓库Psychtoolbox绘制小球走迷宫下载。

for step = 1 : step_up_end

    % 通过中间变量,记录上一步小球的位置
    if(step == 1)
        previous_y_index_up = xy_4_trace_start(2);
        previous_y_index_down = xy_4_trace_start(4);
        previous_x_index_left = xy_4_trace_start(1);
        previous_x_index_right = xy_4_trace_start(3);
    else
        previous_y_index_up = current_y_index_up;
        previous_y_index_down = current_y_index_down;
        previous_x_index_left = current_x_index_left;
        previous_x_index_right = current_x_index_right;
    end

    % 小球动态路径
    if ~decision_hashmap(step) % 正确
        if step <= step_up_right 
            current_y_index_up    = previous_y_index_up - length_chessboard;
            current_y_index_down  = previous_y_index_down - length_chessboard;
            current_x_index_left  = previous_x_index_left;
            current_x_index_right = previous_x_index_right;
            Screen('FillOval', w, color_ball, [current_x_index_left current_y_index_up ...
                current_x_index_right current_y_index_down]);

        elseif step <= step_right_down 
            current_y_index_up    = previous_y_index_up   ;
            current_y_index_down  = previous_y_index_down ;
            current_x_index_left  = previous_x_index_left  + length_chessboard;
            current_x_index_right = previous_x_index_right + length_chessboard;
            Screen('FillOval', w, color_ball, [current_x_index_left current_y_index_up ...
                current_x_index_right current_y_index_down]);
                ...
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

即插即用篇 | YOLOv8 引入多光谱通道注意力 | 频率领域中的通道注意力网络

本改进已集成到 YOLOv8-Magic 框架。 注意力机制,尤其是通道注意力,在计算机视觉领域取得了巨大成功。许多工作聚焦于如何设计高效的通道注意力机制,同时忽略了一个基本问题,即通道注意力机制使用标量来表示通道,这很困难,因为会造成大量信息的丢失。在这项工作中,我们从…

Zabbix监控中文乱码问题解决方法

一、问题描述 1.查看Zabbix仪表盘 在Zabbix的监控仪表盘界面&#xff0c;字体显示为“方框”&#xff0c;无法查看到具体的性能指标名称。 2.问题分析 Zabbix的web端没有中文字库&#xff0c;导致切换到中文页面&#xff0c;中文成了乱码这个问题&#xff0c;我们最需要把中文…

Stable Diffusion教程|图生图原理和实战

Stable Diffusion凭借其卓越的图生图功能&#xff0c;极大地提升了图像生成的可控性与输出品质&#xff0c;赋予用户前所未有的个性化创作风格表达能力。这一革新特性使得Stable Diffusion不仅能精准地捕捉用户的艺术愿景&#xff0c;更能以数字化手段孕育出新颖且极具创意的画…

流量过滤与转发路径控制

1.策略路由 &#xff08;1&#xff09;策略路由技术背景 &#xff08;2&#xff09;PBR介绍-基本概念 &#xff08;3&#xff09;PBR介绍-结构 &#xff08;4&#xff09;PBR介绍-命令语法 PBR的节点匹配模式&#xff1a; permit表示对满足匹配条件的报文进行策略路由 deny表示…

OpenAI下周发布更新;TikTok将自动标记AIGC;智谱AI亮相2024 ICLR

OpenAI 官宣下周举办直播发布更新 OpenAI 今日凌晨官宣&#xff0c;将在当地时间 5 月 13 日上午十点&#xff08;北京时间 5 月 14 日凌晨两点&#xff09;在官网进行直播&#xff0c;届时将演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 补充表示&#xff0c;届…

【C++】-------反向迭代器的模拟实现(补充)

目录 前言 一、反向迭代器接口&#xff08;用户层&#xff09; 二、模拟实现 三、以vector模拟实现为例 四、总结 前言 在vector和list的接口中我们实际上有说明过反向迭代器的用法&#xff0c;这里就有个问题&#xff0c;并不是只有这两个容器存在反向迭代器的。那么对于他…

【力扣】63.不同路径 II

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试…

探索生产者/消费者模式:解决并发编程中的资源竞争

序言 在并发编程中&#xff0c;资源竞争是一个常见的问题。为了有效地管理资源并确保线程安全&#xff0c;需要采用一些有效的方法。其中之一是生产者/消费者模式&#xff0c;它是一种经典的并发设计模式&#xff0c;用于解决生产者和消费者之间的协作问题。本文将深入探讨生产…

零代码平台助力中国石化江苏油田实现高效评价体系

概述&#xff1a; 中国石化集团江苏石油勘探局有限公司面临着评价体系依赖人工处理数据、计算繁琐且容易出错的挑战。为解决这一问题&#xff0c;他们决定借助零代码平台明道云开发江苏油田高质量发展经济指标评价系统。该系统旨在实现原始数据批量导入与在线管理、权重及评分…

27.哀家要长脑子了!---栈与队列

1.739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 用单调栈的方法做&#xff1a; 从左到右遍历数组&#xff1a; 栈中存放的是下标&#xff0c;每个温度在原数组中的下标&#xff0c;从大到小排列&#xff0c;因为这样才能确保的是最近一天的升高温度 如果栈为空&am…

Linux线程(二)线程互斥

目录 一、为什么需要线程互斥 二、线程互斥的必要性 三、票务问题举例&#xff08;多个线程并发的操作共享变量引发问题&#xff09; 四、互斥锁的用法 1.互斥锁的原理 2、互斥锁的使用 1、初始化互斥锁 2、加锁和解锁 3、销毁互斥锁&#xff08;动态分配时需要&#…

程序员代码面试指南题目解析(一)

题目一&#xff1a;如何仅用递归函数和栈操作逆序一个栈 题目要求&#xff1a; 一个栈依次压入 1、2、3、4、5&#xff0c;那么从栈顶到栈底分别为5、4、3、2、1。将这个栈 转置后&#xff0c;从栈顶到栈底为 1、2、3、4、5&#xff0c;也就是实现栈中元素的逆序&#xff0c;但…

JUC下的BlockingQueue详解

BlockingQueue是Java并发包(java.util.concurrent)中提供的一个接口&#xff0c;它扩展了Queue接口&#xff0c;增加了阻塞功能。这意味着当队列满时尝试入队操作&#xff0c;或者队列空时尝试出队操作&#xff0c;线程会进入等待状态&#xff0c;直到队列状态允许操作继续。这…

【Python系列】Python中列表属性提取

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

AI菜鸟向前飞 — 大模型基础知识篇

前言 主要介绍最最基础的知识&#xff0c;在这个基础上有现在比较流行的GPT、Llama、Gemini**等一系列大模型的出现&#xff0c;打好基础才能更理解上面是如何运作以及实现的过程。 PS&#xff1a;本篇科普不会介绍梯度下降算法&#xff08;偏导数&#xff09;等复杂的过程&a…

巨坑啊! before-upload返回false 会执行on-remove

通过对on-remove对应参数的打印&#xff0c;发现回调中的file参数有个status&#xff0c;若是是在before-upload中就被过滤了&#xff0c;就是ready&#xff0c;若是已经上传成功了去点击删除&#xff0c;status是success&#xff0c;就他了。 onRemove(file,fileList){if(file…

redis的双写一致性

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

Redis——缓存雪崩、缓存穿透、缓存击穿

在项目中&#xff0c;通常会使用数据库比如 MySQL 存储应用数据&#xff0c;但是当数据太多之后&#xff0c;比如多了几十万条或上百万条的商品信息&#xff0c;这个时候查询商品数据的速度会很慢&#xff0c;影响用户体验。此时一般我们会选择将部分商品信息缓存起来&#xff…

【Rollup】用rollup从0到1开发一个js插件并发布到npm

Rollup 是一个 JavaScript 模块打包器&#xff0c;专注于打包 ES6 模块将其编译回多种模块化格式&#xff0c;尤其适合打包库和框架&#xff0c;因为它可以生成更小、更高效的代码&#xff0c;并且特别适合将代码打包成可在浏览器中使用的库。 从0到1开发js插件 1.创建文件夹…

2.前端路由的配置和使用

一&#xff0c;路由的作用 路由的作用就是将页面文件跟URL地址形成对应匹配 二&#xff0c;如何安装路由 这里我们采用pnpm的方式在项目中执行 pnpm install vue-routernext --save三&#xff0c;路由如何使用 首先创建一个我们需要访问的页面文件&#xff0c;这里我先创建…