当前位置: 首页 > 知识库问答 >
问题:

javascript - js封装通过传入温度值获得对应的温度颜色,如何弄呢?求助?

上官彬
2023-06-16

想封装一个通过传入温度值获得对应的温度颜色的方法,可是没思路,不知道改怎么弄?求助大神的帮助
网上找到了一段java代码,感觉可以满足我的需求,但是不知道该如何转成js,求大神帮助一下
看这种形式可以实现我的需求吗?或者有什么好的思路和写法呢?

public  static  class TemperatuerColor
{
     private  static Color Red = Color.FromRgb( 255,  0,  0);
     private  static Color Yellow = Color.FromRgb( 255,  0,  0);
     private  static Color Blue = Color.FromRgb( 255,  0,  0);

    
     public  static SolidColorBrush GetColor( double temperature,  double maxtemperature,  double mintemperature)
    {
         double ratio = temperature / (maxtemperature - mintemperature);
        Color result1 = Compute(Blue, Yellow, ratio);
        Color result2 = Compute(Yellow, Red, ratio);
        Color result =  Compute(result1, result2, ratio);

         return  new SolidColorBrush(result);
    }

     private  static Color Compute(Color fromColor, Color toColor,  double ratio)
    {
         byte r = ( byte)(fromColor.R * ( 1.0f - ratio) + toColor.R * ratio);
         byte g = ( byte)(fromColor.G * ( 1.0f - ratio) + toColor.G * ratio);
         byte b = ( byte)(fromColor.B * ( 1.0f - ratio) + toColor.B * ratio);
         return Color.FromRgb(r, g, b);
    }

}

共有4个答案

暨曾笑
2023-06-16

image.png

export const HsvToRgb = (data) => {
  var h = data[0],
    s = data[1],
    v = data[2];
  s = s / 100;
  v = v / 100;
  var r = 0,
    g = 0,
    b = 0;
  var i = parseInt((h / 60) % 6);
  var f = h / 60 - i;
  var p = v * (1 - s);
  var q = v * (1 - f * s);
  var t = v * (1 - (1 - f) * s);
  switch (i) {
    case 0:
      r = v;
      g = t;
      b = p;
      break;
    case 1:
      r = q;
      g = v;
      b = p;
      break;
    case 2:
      r = p;
      g = v;
      b = t;
      break;
    case 3:
      r = p;
      g = q;
      b = v;
      break;
    case 4:
      r = t;
      g = p;
      b = v;
      break;
    case 5:
      r = v;
      g = p;
      b = q;
      break;
    default:
      break;
  }
  r = parseInt(r * 255.0);
  g = parseInt(g * 255.0);
  b = parseInt(b * 255.0);
  const rgb = "rgb(" + r + "," + g + "," + b + ")";
  return rgb;
};
const h  // 角度 0-360 角度控制颜色
const s // 半径 0-100 你要纯色就100,白色的就0
const v // 深度 直接100
HsvToRgb([h,s,v])

想要什么颜色就什么角度,和温度范围对照起来就行

林运浩
2023-06-16

我直接改成了构造函数,你new实例的时候传三个参数:当前温度,最高温度,最低温度。然后,再调用getColor()就能获取到对应颜色:

class TemperatureColor {
  static Red = { r: 255, g: 0, b: 0 };
  static Yellow = { r: 255, g: 255, b: 0 };
  static Blue = { r: 0, g: 0, b: 255 };
  // temperature: 当前温度
  // maxTemperature: 最高温度
  // minTemperature: 最小温度
  constructor(temperature, maxTemperature, minTemperature) {
      this.temperature = temperature
      this.maxTemperature = maxTemperature
      this.minTemperature = minTemperature
  }
  
  getColor() {
    const ratio = this.temperature / (this.maxTemperature - this.minTemperature);
    const result1 = this.compute(TemperatureColor.Blue, TemperatureColor.Yellow, ratio);
    const result2 = this.compute(TemperatureColor.Yellow, TemperatureColor.Red, ratio);
    const result = this.compute(result1, result2, ratio);

    return `rgb(${result.r}, ${result.g}, ${result.b})`;
  }

  compute(fromColor, toColor, ratio) {
    const r = Math.round(fromColor.r * (1 - ratio) + toColor.r * ratio);
    const g = Math.round(fromColor.g * (1 - ratio) + toColor.g * ratio);
    const b = Math.round(fromColor.b * (1 - ratio) + toColor.b * ratio);

    return { r, g, b };
  }
}

console.log(new TemperatureColor(23, 100, 0).getColor())
// 打印 rgb(104, 91, 151)
谢雅珺
2023-06-16
function getTemperatureColor(temperature) {
  let hue = ((1 - (temperature / 50)) * 120).toString(10);
  return ["hsl(", hue, ",100%,50%)"].join("");
}
雍河
2023-06-16

全部翻译一遍,java是类,你可以通过function函数来实现。

例如 Color.FromRgb你可以考虑这样封装:

const Color = {
    FromRgb: (r, g, b) => {
    // ....省略
    }
}

Compute、 GetColor 可以直接通过函数封装:

export function Compute(fromColor, toColor, ratio) {
// .....省略
}

export function GetColor(temperature, maxtemperature, mintemperature) {
// .....省略
}

以上都可以作为例子,不要被被它的类型、参数迷惑,其实本质就是方法、函数代码而已。

对了,如果你想通过js实现这个功能,相关的代码方法、属性,相关的东西你都是需要翻译过来的,

反而我建议,看看市面有没有合适的库,能直接满足你的要求

 类似资料:
  • 检测物体的温度。 用法 Your browser does not support the video tag. 案例:温度计 说明:通过将温度传感器检测到的温度值转化为舵机转动的角度值,来展示度数。 所需模块:智能电源、温度传感器、双舵机驱动、舵机。

  • 温度传感器模块用于检测水、人体等物体的温度。 净重量:13.7g 体积:24×24×14mm 参数 工作电压:5V 测量范围:-55℃~125℃ 测量精度:±0.5℃(-10℃~85℃) 工作电压:DC 5V 抗跌落能力:1.5m 工作温度(模块):-10℃~55℃ 工作湿度:<95%" 特点 高灵敏度 注意事项 测量温度超过100℃时, 传感器线材可能会损坏。请小心使用以免受损坏设备。

  • 温度传感器能够直接和被检测物体接触,检测其温度。 使用前,请先将温度传感器探头与模块如上图组装。 生活实例 电子温度计上使用了温度传感器 参数 尺寸:24×20mm 读值范围:-55~125℃ 读值误差:±0.5℃ 工作电流:14mA

  • 温度传感器能够直接和被检测物体接触,检测其温度。 使用前,请先将温度传感器探头与模块如上图组装。 生活实例 电子温度计上使用了温度传感器 参数 尺寸:24×20mm 读值范围:-55~125℃ 读值误差:±0.5℃ 工作电流:14mA

  • 检测空气温湿度。 用法 Your browser does not support the video tag. 案例:自动收衣架 说明:用舵机模块来控制双舵机转动的角度,温湿度传感器能感知环境的湿度。使用神经元APP可以调试舵机的角度,让双舵机转动的角度一致,设置湿度的数值,当湿度大于该数值就收进衣服,低于该数值则将衣服晒出去。 所需模块:电源、蓝牙模块、温湿度传感器、双舵机驱动、舵机组件包、连