【问题标题】:Set background color based on outdoor temperature根据室外温度设置背景颜色
【发布时间】:2013-04-30 06:19:21
【问题描述】:

嘿嘿,

我有一个温度小部件要在我正在进行的项目中实现。 没什么特别困难的,我有一个免费的 API 来检索我需要的数据等。

但是,和我一起工作的可爱设计师会有一个颜色功能,我不知道如何开始......

他会根据当前的天气温度定义背景颜色。

我的意思是如果温度很冷,比如-20,背景颜色应该是蓝色/紫色/任何冷色;当它是温暖的时候,比如 25,它应该有一个像橙色/红色这样的热背景色。

我认为我可以轻松使用一系列“温度步骤”,但我更喜欢使用可以根据温度定义颜色的函数。我知道这很奇怪,我不知道是否有一种算法可以通过它的温度颜色来定义颜色...... 这篇文章对http://en.wikipedia.org/wiki/Color_temperature很有帮助,但是比较复杂,如果有人有任何想法,即使是一个开始,我也很感兴趣!

我看到了这个帖子: Display temperature as a color with C#?

但我没有使用 C#,也不想使用,所以如果 JavaScript 中有解决方案,那就完美了。如果有服务器端需要,我最终可以使用 PHP 或 NodeJS。

编辑 - 回答

最后,由于图形的需要,我没有选择使用真正的颜色渐变数组。 但我仍然必须根据温度混合最近台阶的颜色! 我为此编写了一个小型 JS 库,您很快就能在 GitHub 上找到它,我将在此处发布链接。

你可以在这里找到它:

The presentation website of the project

Or the github project

【问题讨论】:

  • 如果没有基于步骤的课程,您将如何做到这一点?我想我不完全明白你的建议
  • @George -- 这怎么会“过于本地化”?这不是一个可以帮助他人的合理问题吗?
  • @GeorgeStocker 很抱歉,我不是出生在任何英国国家,我可能会因此而死吗?如果有语法问题,只是编辑问题不是更好吗?但是更多,你怎么能说“没有研究工作”或“我需要有人为我写一个算法”??????我说我读了另一个线程,以及一篇关于颜色的相当复杂的维基百科文章,我是否必须就我要问的问题写一篇论文?而且 - 正如问题中所写 - 我只是在寻求一些想法,而不是完整的算法!!!!!
  • @Flo-Schield-Bobby 仅仅征求意见是无效的。请阅读常见问题解答:stackoverflow.com/faq#dontask
  • 我发现这个问题易于理解且有效。如果我有足够的时间,我会创建一个解决方案。但是看看这个:tannerhelland.com/4435/convert-temperature-rgb-algorithm-code

标签: javascript colors temperature


【解决方案1】:

您的颜色范围看起来与“HSL 颜色空间”中的“仅色调”扫描相同,从 -30ºC 的 270º(紫色)到 +30ºC 的 30º(橙色)

var hue = 30 + 240 * (30 - t) / 60;

如果t 超出范围,请在调用上述表达式之前对其进行钳制,或在之后将h 钳制到所需的色调范围。

在支持的浏览器上,您可以使用hsl(h, s, l) 颜色字符串,或使用常用的"HSL to RGB" 函数将 HSL 颜色转换为 RGB。

http://jsfiddle.net/V5HyL/

【讨论】:

  • 该项目是基于 webkit 的,但我想开发一个可以在许多浏览器上使用的库,所以我想我更愿意转换为 RGB。无论如何,非常感谢,我会尝试将其集成到我当前的解决方案中,并让您知道我的反馈!
  • 我喜欢你用这个去哪里,但是你如何从你的色调计算中得到 h、s 和 l 值?另外,t 是摄氏度吗?
  • 我不知道 OP 的 t 是什么,但看起来很可能是摄氏度。我的回答只是将[-30 .. +30] 范围映射到[270 .. 30]。 S 和 L 看起来都在 0.7 标记附近。
【解决方案2】:

这是一种特殊情况,不是通用解决方案,但通过简单地在色调之间进行线性渐变并在中间范围(即绿色)中处理混合,您可以在没有颜色步进的情况下获得合理的近似值:

演示:http://jsfiddle.net/bcronin/kGqbR/18/

//
// Function to map a -30 to 30 degree temperature to 
// a color
//
var F = function(t)
{
    // Map the temperature to a 0-1 range
    var a = (t + 30)/60;
    a = (a < 0) ? 0 : ((a > 1) ? 1 : a);

    // Scrunch the green/cyan range in the middle
    var sign = (a < .5) ? -1 : 1;
    a = sign * Math.pow(2 * Math.abs(a - .5), .35)/2 + .5;

    // Linear interpolation between the cold and hot
    var h0 = 259;
    var h1 = 12;
    var h = (h0) * (1 - a) + (h1) * (a);

    return pusher.color("hsv", h, 75, 90).hex6();
};

【讨论】:

  • 是的,谢谢,听起来很有趣,你能解释一下你使用的那些常量是什么吗?它是基于梯度值还是任何算法?
  • 好点。幂函数中的常数 0.35 完全是任意的。这“很好地”压缩了渐变的中间。 h0 和 h1 是色调值 (0-360),映射到原始问题中的紫色和橙红色(大致)。 75 和 90 是颜色的任意饱和度和值。换句话说,常量仅基于看起来不错的东西,而不是任何基于物理的算法。
【解决方案3】:

关于色温的维基百科文章与您的问题无关。维基百科文章仅与数字成像专家相关。在这种情况下,色温意味着不同的东西......

您的问题是关于如何以摄氏度可视化某个温度。没有标准算法可以做到这一点。如何解决这个任务取决于设计师。

我可能会为每 2.5°C 或 5°C 构建一个 rgb 值数组,然后将 rgb 混合为两者之间的温度值。

【讨论】:

  • 混合仅色调不同的颜色的 RGB 值往往会产生“浑浊”的混合效果。
  • 你说得对,你们两个,我发现了这些要点,但直到重新打开问题才感觉编辑问题!不过谢谢!我目前使用渐变数组并且效果很好,但是您必须选择颜色步骤以避免“泥泞”问题。还有@Alnitak,因为我在 LAB 色彩空间中工作,所以我可以避免这种混合问题——至少我猜是这样。
  • 如果间隔不是太大,那么 RGB 似乎没问题。我准备了一个例子here。 LAB 可能是最好的,但性能较差...
  • 这就是我在 Lab 中所拥有的。我没有看到这个性能技巧,即使我并不真正关心这个项目,最后测试它可能会很好。再次感谢!
【解决方案4】:

我最近遇到了一个难题,即使用时间数据来显示该时间对应的天空颜色。很难,以下是我探索的三种方式:

1) 坏方法:分别为您的 R、G、B 通道创建一个函数,该函数将接受您的温度的 x 轴截距,并为您的红色通道、蓝色通道和绿色通道输出一个 y 轴截距在您拥有的温度和相应颜色范围内进行通道。为了做到这一点,我将通过沿颜色范围对温度的一些主要划分进行采样并绘制尽可能多的点,然后通过每个通道的点绘制 6 次多项式来对其进行逆向工程。你会得到一个函数,它可以接受一个温度值,并为 alpha 1 的 RGB 颜色的 R、G 和 B 通道组合 3 个输出。应该可以工作,但还没有测试过,我不愿意哈哈

2) 为每种主要颜色创建一个背景类(您决定这是 5 种颜色还是 50 种颜色)并使用 alpha 混合在它们之间切换。这就是我最终用于解决问题的方法。

if(temp > 0 && temp <= 5)
{
     greenBackground.alpha == 1
     yellowBakckground.alpha == (temp/5)
}
else if(temp > 5 && temp <= 10)

等等……

因此,如果您的温度是 2.5,那么它将是 50% 的黄色和绿色混合

我能够在 1 晚内实施此选项,结果看起来很棒!这很耗时,但可行,而且不像您想象的那么混乱。

3) 创建并存储一个数组,其中包含从渐变中采样的 RGB 颜色与所有可能的整数(-30 到 30 之间没有很多),并将 API 的数据四舍五入为整数值如果需要的话。那将是我想的最简单的。绝对不如选项 1 酷:)

祝你好运!

【讨论】:

  • 第一个选项看起来真的很棒!但我不确定是否理解所有要点,稍后我会集中精力讨论这一点。我目前正在使用第三个选项,它以我期望的更清洁的方式工作。但是,我将花一些时间考虑第一个!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2015-04-21
  • 1970-01-01
  • 2011-12-27
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多