javascript - Lerp 背景颜色基于一天中的时间

标签 javascript time colors p5.js

我一直在开发一个小型 Web 项目,它显示时间并使用 p5.js 制作太阳和月亮在后台旋转的动画。我遇到的问题是实现从一种背景(天空)颜色到另一种背景颜色的逐渐过渡。

function setColours(){
 var pallete = [color(0),color(232, 131, 72),color(88,52,133),color(45, 221, 227)]
 var cMin = slider.value();
 hr = cMin / 60;
 //lerpAmt = map(mn,0,1440,0,1);
 console.log(hr);

 if(hr <= 4 || hr >= 20) { 
   background(pallete[0])//black
 } 

 else if(hr >5 && hr <= 6){
   background(232, 131, 72)//orange
 } 

 else if(hr >18 && hr <=19){
   background(232, 131, 72)
 }

 else if(hr >4 && hr <= 5){
   background(88,52,133) //purple    
 } 

 else if(hr > 19 && hr <= 20){
   background(88,52,133)       
 }

 else if(hr >= 7|| hr <18){
   background(45, 221, 227) //blue
 }
}

上面是设置页面天空颜色的函数。循环的起始位置(0)位于顶部,并从顶部开始逆时针旋转。

黑色->紫色->橙色->蓝色->橙色->紫色->黑色

最初,我首先通过标准化一小时后的分钟来调整颜色,这导致天空颜色每小时在黑色和紫色之间转换,一旦过了晚上 8 点(20:00),背景将继续调整为紫色即使午夜是黑色的。这让我怀疑获取时间的逻辑是否合理。

  1. 是否有更好的方法来检查当前时间是否在两小时之间?
  2. 如何获取距离下一个片段(天空颜色)的分钟数?

最佳答案

您也可以使用 lerpColor()功能,这将帮助您在颜色之间实现平滑过渡。由于 lerpColor 将从一种定义的颜色更改为另一种定义的颜色,因此我将更改时间间隔的边界来表示一天中相应颜色“最纯”的时间(午夜是“最黑”的) ,中午是“最蓝的”,等等)

我冒昧地重写了您的一些代码以制作一个您可以检查的片段。在其中,您可以使用 slider 控制一天中的时间并查看颜色变化。

const slider = document.getElementById('slider')
const label = document.getElementById('sliderValue')
slider.oninput = handleChange

function handleChange(event){
  cMin = event.target.value
  sliderValue.innerText = parseInt(cMin/60)+"h / "+cMin + "m"
  
  setColours()
}

const black = [0, 0, 0]
const purple = [88, 52, 133]
const orange = [232, 131, 72]
const blue = [45, 221, 227]

let cMin
let hr
let currentColor

function setup(){
  createCanvas(300, 50)
  background(black)
}

function setColours(){
 
 hr = cMin / 60;
 
 if(hr >= 0 && hr <= 4.5){
   currentColor = lerpSkyColor(black, purple, 0, 4.5)
 }
 
 if(hr > 4.5 && hr <= 5.5){
   currentColor = lerpSkyColor(purple, orange, 4.5, 5.5)
 }
 
 if(hr > 5.5 && hr <= 12){
   currentColor = lerpSkyColor(orange, blue, 5.5, 12)
 }
 
 if(hr > 12 && hr <= 18.5){
   currentColor = lerpSkyColor(blue, orange, 12, 18.5)
 }
 
 if(hr > 18.5 && hr <= 19.5){
   currentColor = lerpSkyColor(orange, purple, 18.5, 19.5)
 }
 
 if(hr > 19.5 && hr <= 24){
   currentColor = lerpSkyColor(purple, black, 19.5, 24)
 }
 
 background(currentColor)
}

function lerpSkyColor(from, to, startTime, endTime){
  const lerpAmt = map(hr, startTime, endTime, 0, 1)
  return lerpColor(color(from), color(to), lerpAmt)
}
#slider{
  width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/p5.min.js"></script>

<h2 id="sliderValue">0h / 0m</h2>
<input id="slider" type="range" min="0" max="1440" value="1"/>

您还可以调整 setColours 方法的 if/else 部分中的时间间隔,以更好地反射(reflect)真实的颜色变化并在一段时间内保持颜色相同(也许开始在 17 点而不是 12 点从蓝色变为橙色)

if(hr > 12 && hr <=17){
  currentColor = blue
}
if(hr > 17 && hr <= 18.5){
  currentColor = lerpSkyColor(blue, orange, 17, 18.5)
}

关于javascript - Lerp 背景颜色基于一天中的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60196138/

相关文章:

javascript - 将自定义属性分配给动态生成的 JS 函数

javascript - 如何改变JsColor的值并运行jscolor的功能?

css - 如果颜色可以访问,这些颜色之间的渐变是否可以访问?

javascript - 如何在钛合金中隐藏选项对话框点击事件的android软键盘?

javascript - 使用模板通过 Vue 清晰地分离 View 和代码

java - 计算两次之间的毫秒数

PHP 获取页面加载统计信息 - 如何测量 php 脚本执行/加载时间

php - 检查 mysql 表中的 future 时间

c++ - 用渐变颜色动态填充数组c++

javascript - 了解 javascript 中的回调和返回函数