news 2026/7/3 13:32:32

工具函数,输入总时间和分段,返回一个符合余弦函数的时间段,且时间段之和是总时间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工具函数,输入总时间和分段,返回一个符合余弦函数的时间段,且时间段之和是总时间

这段代码定义了一个函数cmd_generate_cos_times(total_time, steps),它的作用是:

  • 输入:

    • total_time:总时间长度(一个数值)
    • steps:分段数(一个整数)
  • 输出:

    • 返回长度为steps的数组times,表示每个时间段的时长。
  • 特点:

    • 每个时间段的时长按余弦曲线分布,波动形状类似余弦函数在[0, π]区间内从 1 递减到 -1 的变化
    • 所有时间段之和保证加起来等于total_time
function cmd_generate_cos_times(total_time, steps) local times = {}; -- 定义空表用来存放每个时间段长度 local step_size = math.pi / steps; -- 将 [0, π] 区间均分成 steps 等份,每份长度 local sum = 0; -- 记录各时间段长度累加和 for i = 1, steps do -- 计算余弦值映射到 [0, 1] 区间:(cos(0) = 1 映射为 1,cos(π) = -1 映射为 0) -- 余弦计算点固定在 (i - 1) * step_size,即从0开始,间隔 step_size local time = (math.cos((i - 1) * step_size) + 1) / 2 * total_time / steps; -- 先归一化余弦值 (0~1),再乘以 total_time 除以 steps(平均分时间的权重系数) table.insert(times, time); sum = sum + time; end; -- 累加完成后,sum 可能不等于 total_time,因为浮点计算误差和分段处理 -- diff 是总时间与累加实际时间的误差 local diff = total_time - sum; -- 将误差平均分配到每个时间段,确保最后总和严格等于 total_time local diff_per_step = diff / steps; for i = 1, steps do times[i] = times[i] + diff_per_step; end; return times; end;
比如你有10秒时间,要分成5个阶段,且希望阶段时间符合一种平滑的递减关系时,就可以用这个函数生成: lua 复制 local times = cmd_generate_cos_times(10, 5) for i, t in ipairs(times) do print(string.format("Step %d time: %.3f", i, t)) end

先回顾代码中时间段计算公式

local time = (math.cos((i - 1) * step_size) + 1) / 2 * total_time / steps;

计算点是(i - 1)*step_size,也就是:

  • i=1 → angle=0
  • i=2 → angle=π/5
  • i=3 → angle=2π/5
  • ...
  • i=5 → angle=4π/5

取余弦值:

  • cos(0) = 1
  • cos(π/5) ≈ 0.809
  • cos(2π/5) ≈ 0.309
  • cos(3π/5) ≈ -0.309
  • cos(4π/5) ≈ -0.809

加1后除2,映射到 [0,1]:

  • i=1: (1 + 1)/2 = 1
  • i=2: (0.809 + 1)/2 ≈ 0.9045
  • i=3: (0.309 + 1)/2 ≈ 0.6545
  • i=4: (-0.309 + 1)/2 ≈ 0.3455
  • i=5: (-0.809 + 1)/2 ≈ 0.0955

乘以total_time / steps = 10/5=2,对应时间是:

  • Step 1: 1 * 2 = 2.0
  • Step 2: 0.9045 * 2 ≈ 1.809
  • Step 3: 0.6545 * 2 ≈ 1.309
  • Step 4: 0.3455 * 2 ≈ 0.691
  • Step 5: 0.0955 * 2 ≈ 0.191

这些值的和大概是 2+1.809+1.309+0.691+0.191 = 5.999(约为6),注意不是10,因此代码后面有一段调整:

local diff = total_time - sum; -- diff = 10 - ~6 = 4 local diff_per_step = diff / steps; -- 4 / 5 = 0.8 for i = 1, steps do times[i] = times[i] + diff_per_step; end

最终每段时间是原始值 + 0.8:

  • Step 1: 2.0 + 0.8 = 2.8
  • Step 2: 1.809 + 0.8 = 2.609
  • Step 3: 1.309 + 0.8 = 2.109
  • Step 4: 0.691 + 0.8 = 1.491
  • Step 5: 0.191 + 0.8 = 0.991

总和为2.8+2.609+2.109+1.491+0.991 = 10(满足总时间)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 9:55:51

制造业现状分析

2026 年电子制造业:三条产线,六个趋势 上周去供应商那边做过程审核,厂长跟我说了一句话,琢磨了一路回来。 “去年招了 20 个操作员,春节后走了 15 个。剩下的 5 个,3 个在看招聘软件。” 这大概就是眼下制造…

作者头像 李华
网站建设 2026/7/2 9:54:14

C++ STL 函数对象(Functor)详解

C STL 函数对象(Functor)详解 一、函数对象的基本概念 1.1 定义与本质 函数对象(Functor)是 C 中通过重载 operator() 运算符的类或结构体实例,使其能够像普通函数一样被调用。其本质是一个行为类似函数的对象&#xf…

作者头像 李华
网站建设 2026/7/2 9:52:18

一键解锁鸣潮120帧:WaveTools工具箱终极完整指南

一键解锁鸣潮120帧:WaveTools工具箱终极完整指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否还在为《鸣潮》的帧率限制而烦恼?高性能硬件却只能体验60帧的游戏画面&#…

作者头像 李华
网站建设 2026/7/2 9:46:58

从零到精通vmrun:7步构建可审计、可复现、可CI集成的Workstation自动化流水线(含GitHub Star 2.4k的私有脚本库限时开放)

更多请点击: https://intelliparadigm.com 第一章:vmrun命令行工具的核心定位与企业级价值 vmrun 是 VMware Workstation 和 Fusion 提供的官方命令行接口,用于自动化管理虚拟机生命周期——从启动、暂停、快照到网络配置与文件传输。它不依…

作者头像 李华
网站建设 2026/7/2 9:45:28

AutoScreenshot:跨平台自动截屏工具实战指南

AutoScreenshot:跨平台自动截屏工具实战指南 【免费下载链接】AutoScreenshot Automatic screenshot maker for Windows and Linux 项目地址: https://gitcode.com/gh_mirrors/au/AutoScreenshot 在数字化工作流中,如何高效记录屏幕操作、监控系统…

作者头像 李华