使用RGB变量进行彩色循环,不会平滑过渡

时间:2014-04-02 13:47:19

标签: javascript

我拥有它,以便当圆圈完成时,正在绘制的圆将慢慢地穿过彩虹。前两个很好地工作。在那之后,它停止缓慢变化,只是捕捉到一个阴影,直到下一个阴影。你能告诉我我做错了什么吗?这可能是非常明显的事情:C

function setcolor() {
    if (degrees <= 60) {
            var g = Math.floor(255 * (degrees/60));
            color = "rgb(255, "+ g +", 0)";
        }
            else if (degrees <= 120) {
            var r = Math.floor(255 / (degrees/60));
            color = "rgb("+ r +", 255, 0)";
        }
            else if (degrees <= 180) {
            var b = Math.floor(255 * (degrees/60));
            color = "rgb(0, 255, "+ b +")";
        }
            else if (degrees <= 240) {
            (g = Math.floor(255 /(degrees/60)));
            color = "rgb(0, "+ g +", 255)";
        }
            else if (degrees <= 300) {
            (r = Math.floor(255 * (degrees/60)));
            color = "rgb("+ r +", 0, 255)";
        }
            else if (degrees <= 360) {
            (g = Math.floor(255 / (degrees/60)));
            color = "rgb(255, "+ g +", 0)";
        }
}

1 个答案:

答案 0 :(得分:1)

让我们来看看你的最后一个街区。它被称为elsedegrees <= 300,因此我们知道至少degrees将为301.为了便于计算,我们只需将其称为300.

g = Math.floor(255 / (degrees / 60));

这导致255 / (300 / 60) = 255 / 5 = 51 - 这不是你所期望的,因为平滑过渡应该从255变为0(或0到255)。

之所以这样,是因为您的degrees / 60应该从0过渡到1,这只是在第一步中才会发生。请尝试(degrees - 300) / 60,因为这符合范围。

您还会注意到,对于平滑转换,您要使用255 * (1-(degrees-300)/60)

然而,当你能做到这一点时,所有这一切都没有实际意义:

color = "hsl("+degrees+"deg, 100%, 50%)";