这段代码定义了一个函数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(满足总时间)