如何在合并排序期间“暂停”以可视化 JS p5js

2024-01-04

我正在使用 p5.js 开发排序可视化工具,我需要知道是否可以减慢合并排序,以便可以更慢地绘制它。我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能,但我得到

未捕获的类型错误:a.slice 不是函数。

我只是犯了一个愚蠢的错误,还是我错误地处理了这个问题?

let rectWidth;
let depth = 0;

function setup() {
    let numOfRects = document.getElementById('numOfRects').value;
    let width = document.getElementById('canvas').offsetWidth;
    let height = document.getElementById('canvas').offsetHeight;
    let canvas = createCanvas(width, height);

    rectWidth = floor(width / numOfRects);

    canvas.parent('canvas');
    values = new Array(floor(width / rectWidth));

    for (let i = 0; i < values.length; i++) {
        values[i] = random(height);
    }

    frameRate(1);
}

function draw() {
    background(23);
    values = mergeSort(values, depth);
    depth++;
    for (let i = 0; i < values.length; i++) {
        stroke(0);
        fill(255);
        rect(i * rectWidth, height - values[i], rectWidth, values[i]);
    }

}


function mergeSort(a, d) {
    if (a.length <= 1) {
        return a;
    }

    d--;
    if (d < 1) {
        return (a);
    }
    var mid = Math.round((a.length / 2));
    var left = a.slice(0, mid);
    var right = a.slice(mid);

    let leArr = mergeSort(left, d);
    let riArr = mergeSort(right, d);
    return merge(leArr, riArr);
}

async function merge(left, right) {
    sorted = [];
    while (left && left.length > 0 && right && right.length > 0) {
        if (left[0] <= right[0]) {
            sorted.push(left.shift());
        } else {
            sorted.push(right.shift());
        }
    }

    await sleep(50);

    return sorted.concat(left, right);
}

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

合并算法中的睡眠根本没有意义。您的绘制函数只能绘制由返回的最终数组mergeSort。因此,即使你让算法变慢,你也不会看到任何中间结果,直到mergeSort尚未完成指定深度。

一种可能性是做归并排序 https://en.wikipedia.org/wiki/Merge_sort在一个单独的线程中并可视化draw数组的当前状态。但在这种情况下,您必须对“原始”数组应用排序,而不是创建数组的副本(通过slice)并在最后将它们写回原始数组。

参见示例:

let values = [];
let startSort = true;

function mergeSort(a) {
    // create copy of the array 
    copy = a.slice()
    // asynchronous sort the copy
    mergeSortSlice(copy, 0, copy.length);
    return;
}

async function mergeSortSlice(a, start, end) {
    if (end-start <= 1)
        return;
    
    var mid = Math.round((end+start) / 2);

    // wait till divides are sort 
    await mergeSortSlice(a, start, mid);
    await mergeSortSlice(a, mid, end);

     // merge divides
    let i = start, j = mid;
    while (i < end && j < end) {
        if (a[i] > a[j]) {
            let t = a[j]; a.splice(j, 1); a.splice(i, 0, t);
            j ++;
        }
        i ++;
        if (i==j) j ++;

        // copy back the current state of the sorting
        values = a.slice();
        
        // slow down
        await sleep(100);
    }

    // restart
    if (start == 0 && end == a.length) {
        await sleep(2000);
        startSort = true;
    }
}

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

function setup() { 
    createCanvas(600, 190);
    frameRate(60);
}

let numOfRects = 15;
let rectWidth;
function draw() {
    if (startSort) {
        startSort = false;
        
        rectWidth = floor(width / numOfRects);
        values = new Array(floor(width / rectWidth));
        for (let i = 0; i < values.length; i++) {
            values[i] = random(height);
        }

        mergeSort(values);
    }

    background(23);
    stroke(0);
    fill(255);
    for (let i = 0; i < values.length; i++) {
        rect(i * rectWidth, height - values[i], rectWidth, values[i]);
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在合并排序期间“暂停”以可视化 JS p5js 的相关文章

  • JavaScript 对输入的循环创建一个对象数组

    我正在尝试循环 div 中的输入元素 以创建对象数组 div div
  • 如何在 moment.js 中将日期格式化为 ISO 8601?

    这个文档提到moment ISO 8601作为格式化选项 从 2 7 0 http momentjs com docs parsing special formats http momentjs com docs parsing speci
  • AngularJS 和 Apiary.IO - 无法读取任何响应标头?

    我使用 Apiary io 模拟我的 API 但不知怎的 我无法使用 angularJS 从响应对象中读取任何标头 我确信我至少通过检查 firebug 正确设置了 Content Type application json Angular
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • 匹配 JavaScript RegEx 中的不可见字符

    我有一些包含不可见字符的字符串 但它们位于可预测的位置 通常 围绕我想要提取的文本片段 然后在第二次出现之后我想保留文本的其余部分 我似乎不知道如何关闭隐形字符 and将它们从我的结果中排除 为了匹配隐形 我一直在使用这个正则表达式 xA0
  • JSSOR - 无法读取未定义的类型属性“currentStyle”

    我正在尝试将 Jssor 滑块实现到我的页面中 但我不断在标题中出现该错误 我的内容是通过 Javascript 动态创建的 如下所示 var slide app createHTML div id inventorySlides null
  • 如何在没有数据库的情况下创建AJAX分页?

    是否可以在没有 MySQL 帮助的情况下获取 AJAX 分页页面 难道我不能只添加一个包含我需要显示的文本和标记的 PHP 文件 然后通过单击页码将该内容提供给用户吗 那么可以用纯 jQuery 和 PHP 来实现吗 您会使用什么代码方法来
  • Express.js - 监听关闭

    我有一个使用 Express 的 Node js 应用程序 在该应用程序中 我有一个如下所示的块 const app require app const port process env PORT 8080 const server app
  • 可拖动的非模态弹出窗口 Jquery Mobile

    我希望在 Jquery mobile 中有一个弹出窗口 它不会阻止用户与页面交互 并且 data dismissible false 即当页面的另一部分与页面的另一部分交互并保持可见时 弹出窗口不会消失 我已经尝试过这个 popupNew
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • 可点击的进度条

    我正在使用 Angular 并在 JavaScript 的帮助下开发了一个可点击的进度条 这是我能做到的最好的 有没有办法将滑块放置在进度条内但不干扰进度可视化 堆栈闪电战 https stackblitz com edit angular
  • 在流星收集加载时显示加载程序

    我有一个模板 task list 看起来像这样 each tasks gt task each Template task list tasks返回一个集合 在用户界面中 加载似乎需要一些时间 当集合正在加载时 我想显示一个加载指示器 关于
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • 有没有办法显示嵌套在 Grid 组件内的 Material-UI 抽屉?

    我正在使用 Material UI 创建一个 Web 应用程序 主页分为 3 个网格 每个网格有一个height of 500px 我想在中间网格内显示一个带有一些操作选项的抽屉 那可能吗 到目前为止 我只能在整个屏幕上显示它 这是我的主要
  • 访问事件处理程序内的对象实例

    我有以下代码 var myObj inputs document getElementsByTagName input attachKeyEvent function for var i 0 i lt this inputs length
  • 使用 jquery 时出现控制台错误 - Uncaught TypeError: Object # has no method

    我尝试使用以下 js 添加类或 css 样式 但出现控制台错误 var i 0 question i addClass show 收到以下控制台日志错误 Uncaught TypeError Object has no method add
  • 您最喜欢的 JS/CSS 下拉菜单是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 希望在网站上实现一个 只是好奇其他人都使用过什么以及他们有过什么样的体验 EDIT我也不是一个超级粉丝
  • nodeJS exec 不适用于“cd”shell cmd

    var sys require sys exec require child process exec exec cd home ubuntu distro function err stdout stderr console log cd

随机推荐

  • 如何将普通锚链接与react-router一起使用

    非常类似于这个有角度的问题 https stackoverflow com questions 14712223 how to handle anchor hash linking in angularjs 使用react router时如
  • 从 Java\httpclient 3\linux 连接到 NTLMv2

    我正在使用 MAC 和 LINUX java6 和 apache http client 3 1 通过 NTLM 身份验证连接到共享点 我使用连接到ntlmhttp jcifs samba org http jcifs samba org
  • 使用 SQLAlchemy(MySQL) 和 Flask 时 MySQL 连接不可用

    我有时会收到此错误 有时正常 有时错误 sqlalchemy exc OperationalError OperationalError MySQL Connection not available 使用时session query 我正在
  • 如何有效地查找 Coq 中定义标识符的位置?

    在大多数 IDE 或文本编辑器中 您可以右键单击某个术语 它会将您带到定义该术语的文件 CoqIDE好像没有这个 所以我一直在做coqdoc myfile v html 然后转到生成的 HTML 文档 但该文件中唯一可点击的术语是针对 Co
  • 在 ANDROID 中以编程方式设置子布局宽度?

    在我的代码中 我有一个具有多个子布局的 XML 文件 我只想根据设备的屏幕宽度以编程方式设置这些子布局之一的宽度 到目前为止 我已经尝试过 Layout params setparam 和其他方法 但它在获取布局 id 时显示空指针异常 我
  • 将 DataContext 设置为 XAML 中的当前代码隐藏对象

    我试图将 UserControl 的 DataContext 设置为 UserControl 的代码隐藏类 从代码隐藏方面来说这真的很容易做到 public partial class OHMDataPage UserControl pub
  • OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP

    我遇到了一个奇怪的问题OnDragListener 我的目标视图得到ACTION DROP事件正常并处理它 但它从未收到ACTION DRAG STARTED or ACTION DRAG ENDEDevents 事实上 除了 drop 之
  • SSL 证书问题 - 根据验证程序,远程证书无效

    当尝试通过 C 桌面应用程序将文件上传到我的服务器时 我收到以下错误 根据验证过程 远程证书无效 这和SSL证书有关系 这是我的网站 由 Arvixe 托管 这是我使用的代码 public void Upload string strFil
  • Delphi TWebBrowser 内存泄漏

    我的应用程序使用加载网页的 TWebBrowser 问题是 关闭包含TWebBrowser的表单后 所使用的内存没有被释放 如果我打开并关闭表单 内存就会不断增加 看到一些关于调用 SetProcessWorkingSetSize 或 Co
  • tcp 校验和和 tcp 卸载

    我正在使用原始套接字来创建我自己的套接字 我需要设置 tcp checksum 我尝试了很多参考资料 但都不起作用 我正在使用wireshark进行测试 请问你能帮帮我吗 顺便说一句 我在某处读到如果你设置 tcp checksum 0 然
  • C++ istream 运算符>> 不良数据处理

    每次我在这里问一个问题时 结果都是一些非常愚蠢的错误 如果你不相信我 请检查我的历史 所以如果可以的话请耐心等待 感觉我的问题应该很受欢迎 但我找不到任何相关信息 而且我已经没有想法可以尝试了 无论如何 事不宜迟 我正在尝试超载输入oper
  • 当“允许不太安全的应用程序:关闭”时,如何将 java 中的邮件发送到 Gmail

    我能够在 java 中将邮件发送到 gmail 当 Allow less secure apps ON 你可以找到代码here http www javatpoint com example of sending email using j
  • 使用情节提要在 Xcode 6.1.1 中展开 Segue

    我一直在读到 unwind segue 在 Xcode 6 中存在 bug 我正在使用 Xcode 6 1 1 并且使用 swift 我使用导航控制器放置的 后退 按钮 因此我无法拖动到退出图标 此外 我也无法从 viewControlle
  • 来自加德纳的拼图

    我试图在 Prolog 中解决以下难题 编号为 0 9 的 10 个单元格刻有一个 10 位数字 每个单元格 例如 i 表示数字 i 在该数字中出现的总数 找到这个号码 答案是6210001000 这是我在 Prolog 中写的 但我被卡住
  • 在画布上挥动文字

    我怎样才能在画布元素上制作类似于上找到的文本this http www pageplugins com generators crazy text textwave php page EDIT Ben 忘记对你的问题无缘无故的反对票 并且
  • UWP - 在 NavigationViewItems 上设置 IsEnabled

    我有一个 UWP 应用程序NavigationView控制 导航项是通过设置创建的MenuItemsSource在 XAML 中转换为类型的对象集合NavigationViewElement
  • 将带有 VBA 宏的 Excel 图表复制并粘贴到 Word 中

    我知道我的问题可能听起来 微不足道 但我在任何地方都找不到解决方案 而且我已经筋疲力尽了 我正在编写一个宏来自动在 Word 中生成报告 在某个阶段 我需要插入一些图表 该图表位于 Excel 的图表工作表中 但没办法 这是我的代码 Sub
  • 如何使用 FTP 命令移动文件

    源文件的路径是 public html upload 64 SomeMusic mp3 我想将它移动到这条路径 public html archive 2011 05 64 SomeMusic mp3 我如何使用 FTP 命令执行此操作 在
  • WPF:选择时为文本框添加标签

    我想创建一个看起来像视觉工作室的简单设计器 具体来说 我希望我的项目具有与 VS 中相同的行为 当未选择它们时 会显示一个简单的标签 文本块 当它们被选择时 一个文本框可以让我编辑值 实现这一目标的最佳方法是什么 谢谢 为 TextBox
  • 如何在合并排序期间“暂停”以可视化 JS p5js

    我正在使用 p5 js 开发排序可视化工具 我需要知道是否可以减慢合并排序 以便可以更慢地绘制它 我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能 但我得到 未捕获的类型错误 a slice 不是函数 我只是犯了一个愚蠢的错误 还是我错