如何实现两点间半正弦曲线的每分钟自适应数值计算
半正弦曲线数值计算实现
首先明确核心变量与曲线逻辑:
- 起始值(maxCt):6500,结束值(minCt):2700,差值范围
CtRange = maxCt - minCt = 3800 - 时间进度比例
t:当前已过日照分钟数 / 总日照分钟数(范围0~1) - 半正弦曲线采用余弦函数的半周期实现,确保数值变化先缓、中快、后缓,符合需求的曲线形态
修改后的代码实现
// 定义固定参数 const maxCt = 6500; const minCt = 2700; const CtRange = maxCt - minCt; // 保留原有的总日照时长计算 const sunMinutesDay = (sunset - sunrise) / 1000 / 60; if (await compareTime(adapter, sunrise, sunset, "between", ActualTime)) { // 计算当前已过的日照分钟数 const elapsedMinutes = (ActualTime - sunrise) / 1000 / 60; // 转换为0-1的时间进度比例 const timeRatio = elapsedMinutes / sunMinutesDay; // 生成半正弦变化因子:从1平滑降到0 const sineFactor = (1 + Math.cos(timeRatio * Math.PI)) / 2; // 计算最终数值并取整 adaptiveCtTimed = Math.round(minCt + CtRange * sineFactor); }
代码说明
- 时间比例计算:将当前时间在日照周期内的位置转换为0到1的比例,确保曲线能适配任意时长的日照周期
- 半正弦因子:
(1 + Math.cos(timeRatio * Math.PI)) / 2会生成符合要求的半正弦曲线:- 日出时刻(
timeRatio=0):因子为1,对应起始值6500 - 日照中点(
timeRatio=0.5):因子为0.5,对应中间值4600 - 日落时刻(
timeRatio=1):因子为0,对应结束值2700
- 日出时刻(
- 数值映射:通过因子与差值范围相乘,再加上结束值,得到最终的半正弦曲线数值,最后取整满足每分钟计算的精度需求
内容的提问来源于stack exchange,提问作者Markus Hartmann
相关产品推荐
相关产品推荐

