Частота в RGB - PullRequest
       70

Частота в RGB

1 голос
/ 22 апреля 2020

Я ищу способ преобразовать сигнал dynamic frequency в соответствующий цвет. и я нашел этот скрипт здесь :

<script type="text/javascript" src="data.js"></script>
<script type="text/javascript">


function trim1 (str) {  
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
function decimalToHex(d) {
    d = Math.round(d);
    var hex = d.toString(16);
    while (hex.length < 2) {
        hex = "0" + hex;
    }

    return hex;
}
function freqToNM() {
    freq = (document.getElementById("in").value);
    Slight = 299792458;
      convert();
   }

function convert() {

        var input = document.getElementById("in").value;
        input = trim1(input);
        var w = parseFloat(input);

    if (w >= 380 && w < 440)
    {
        red   = -(w - 440) / (440 - 380);
        green = 0.0;
        blue  = 1.0;
    }
    else if (w >= 440 && w < 490)
    {
        red   = 0.0;
        green = (w - 440) / (490 - 440);
        blue  = 1.0;
    }
    else if (w >= 490 && w < 510)
    {
        red   = 0.0;
        green = 1.0;
        blue  = -(w - 510) / (510 - 490);
    }
    else if (w >= 510 && w < 580)
    {
        red   = (w - 510) / (580 - 510);
        green = 1.0;
        blue  = 0.0;
    }
    else if (w >= 580 && w < 645)
    {
        red   = 1.0;
        green = -(w - 645) / (645 - 580);
        blue  = 0.0;
    }
    else if (w >= 645 && w < 781)
    {
        red   = 1.0;
        green = 0.0;
        blue  = 0.0;
    }
    else
    {
        red   = 0.0;
        green = 0.0;
        blue  = 0.0;
    }


    // Let the intensity fall off near the vision limits

    if (w >= 380 && w < 420)
        factor = 0.3 + 0.7*(w - 380) / (420 - 380);
    else if (w >= 420 && w < 701)
        factor = 1.0;
    else if (w >= 701 && w < 781)
        factor = 0.3 + 0.7*(780 - w) / (780 - 700);
    else
        factor = 0.0;

    var gamma = 0.80;
    var R = (red   > 0 ? 255*Math.pow(red   * factor, gamma) : 0);
    var G = (green > 0 ? 255*Math.pow(green * factor, gamma) : 0);
    var B = (blue  > 0 ? 255*Math.pow(blue  * factor, gamma) : 0); 

    var hex = "#" + decimalToHex(R) + decimalToHex(G) + decimalToHex(B);
    var output = hex;
    document.getElementById("result").firstChild.nodeValue = output;
    document.getElementById("result").style.color = hex;
}
</script>

Я добавил функцию freqToNM, пытаясь преобразовать частоту в герцах (Гц) в длину волны в нанометрах (нм) перед тем, как выполнить преобразование функция. Любые идеи? Заранее спасибо!

Редактировать: Вот html того, как я его применил.

<!DOCTYPE html>
<head>
  <title>Freqency to Color Converter</title>
</head>
    <body>
        <div id="main">

            <p><input type="text" id = "in" name="in" size="20" tabindex="1" onKeyDown="if(event.keyCode==13) freqToNM();"/> &nbsp; <input type="button" value="Convert" name="B1" tabindex="2" onclick = "freqToNM()" /></p>

            <p id="result">&nbsp;</p>
            <p>&nbsp;</p>
        </div>

<script type="text/javascript" src="data.js"></script>
<script type="text/javascript">


function trim1 (str) {  
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
function decimalToHex(d) {
    d = Math.round(d);
    var hex = d.toString(16);
    while (hex.length < 2) {
        hex = "0" + hex;
    }

    return hex;
}
function freqToNM() {
    var freq = (document.getElementById("in").value);
    var Slight = 299792458;
      convert();
   }

function convert() {

        var input = Slight / freq;
        input = trim1(input);
        var w = parseFloat(input);

    if (w >= 380 && w < 440)
    {
        red   = -(w - 440) / (440 - 380);
        green = 0.0;
        blue  = 1.0;
    }
    else if (w >= 440 && w < 490)
    {
        red   = 0.0;
        green = (w - 440) / (490 - 440);
        blue  = 1.0;
    }
    else if (w >= 490 && w < 510)
    {
        red   = 0.0;
        green = 1.0;
        blue  = -(w - 510) / (510 - 490);
    }
    else if (w >= 510 && w < 580)
    {
        red   = (w - 510) / (580 - 510);
        green = 1.0;
        blue  = 0.0;
    }
    else if (w >= 580 && w < 645)
    {
        red   = 1.0;
        green = -(w - 645) / (645 - 580);
        blue  = 0.0;
    }
    else if (w >= 645 && w < 781)
    {
        red   = 1.0;
        green = 0.0;
        blue  = 0.0;
    }
    else
    {
        red   = 0.0;
        green = 0.0;
        blue  = 0.0;
    }


    // Let the intensity fall off near the vision limits

    if (w >= 380 && w < 420)
        factor = 0.3 + 0.7*(w - 380) / (420 - 380);
    else if (w >= 420 && w < 701)
        factor = 1.0;
    else if (w >= 701 && w < 781)
        factor = 0.3 + 0.7*(780 - w) / (780 - 700);
    else
        factor = 0.0;

    var gamma = 0.80;
    var R = (red   > 0 ? 255*Math.pow(red   * factor, gamma) : 0);
    var G = (green > 0 ? 255*Math.pow(green * factor, gamma) : 0);
    var B = (blue  > 0 ? 255*Math.pow(blue  * factor, gamma) : 0); 

    var hex = "#" + decimalToHex(R) + decimalToHex(G) + decimalToHex(B);
    var output = hex;
    document.getElementById("result").firstChild.nodeValue = output;
    document.getElementById("result").style.color = hex;
}
</script>


</body>

</html>

1 Ответ

1 голос
/ 22 апреля 2020

Длина волны - скорость / частота. Когда вы переводите частоту вместо длины волны в функцию convert, вы должны изменить переданную частоту на длину волны, например:

function freqToNM(freq) {
  // freq: The frequency as THz [float]
  const Slight = 299792458;
  return Slight / freq / 1000;
}

function convert() {
  var input = document.getElementById("in").value;
  input = trim1(input);
  var f = parseFloat(input);
  var w = freqToNM(f);

  // The rest of the convert code
}

Обратите внимание, что freqToNM возвращает вычисленное значение, это не вызывает convert функцию.

...