2017-09-06 121 views
2

在不使用多个文件的情况下,使用java中的cos或sin平滑地(以及其他)循环背景颜色的最佳方式是什么?我尝试过使用随机性,并分别增加每个单独的r,g和b值,以使这看起来有点正常,但它很紧张,不光滑,而且颜色很可怕。现在,它只是纯白色。我只包括必要的代码,我使用的加工3.实现颜色循环背景的最佳方式是什么?

//background 
int bg1 = 255; //r 
int bg2 = 255; //g 
int bg3 = 255; //b 

void draw() { 
fill(bg1,bg2,bg3); 
} 

回答

1

你已经得到了普遍的想法了。这是一个三个步骤:

  • 第1步:在草图的顶部声明变量。
  • 第2步:使用这些变量绘制场景。
  • 第3步:随时间变化这些变量。

这是在Processing中创建任何动画的基本方法。 Here是一个包含更多信息的教程。

这里是一个小例子,显示了窗口之间的周期白色和黑色:

float c = 0; 

float cChange = 1; 

void draw(){ 

    background(c); 

    c += cChange; 
    if(c < 0 || c > 255){ 
    cChange *= -1; 
    } 
} 

您需要做同样的事情,但有3个颜色值,而不是1。注意,我只是很每次改变颜色少量,这使它看起来平滑而不是紧张。

如果您仍然遇到问题,请在新问题中发布更新后的MCVE,我们将从此处继续。祝你好运。

+0

谢谢。它适用于一些调整! – Icy4614

-1

不明白你的意思是因为cos和sin与背景颜色有关。但是,也许这样的事情是你想要的?

void draw(){ 
int H = frameCount%1536; 
background(color(abs(H-765)-256,512-abs(H-512),512-abs(H-1024))); 
} 
1

如果你特别想使用正弦波作为输入,而不是锯齿波,那么你需要你的输入(例如,时间)映射到某个色彩范围。例如:

  1. 从0每2000毫秒值增加到2.0
  2. 值范围从-1到1
  3. SIN(值)的输出范围从-1到1
  4. 地图输出到一个颜色范围。

​​行之有效的映射值,但你也可以使用colorMode()映射的颜色范围 - 因此而不是四处移动你的正弦输出值,只是让你的输出0-2.0并设置最大RGB或HSB值到2.0,而不是255

这里有一些例子,都在同一个草图同时运行:

float val; 
float out; 

void draw() { 
    background(0); 
    val = TWO_PI * (millis()%2000)/2000.0; // every 2000 milliseconds value increases from 0 to 2PI 
    out = sin(val); 

    // white-black (256-0) 
    pushStyle(); 
    fill(128 + 128*out); 
    rect(0,0,50,50); 
    popStyle(); 

    // red-black (255-0) 
    pushStyle(); 
    colorMode(RGB, 255); 
    fill(255*(out+1), 0, 0); 
    rect(50,0,50,50); 
    popStyle(); 

    // hue rainbow (0-2) 
    pushStyle(); 
    colorMode(HSB, 2.0); 
    fill(out+1, 2, 2); 
    rect(0,50,50,50); 
    popStyle(); 

    // hue blue-green (3 to 5/9) 
    pushStyle(); 
    colorMode(HSB, 9); 
    fill(out+4, 9, 9); 
    rect(50,50,50,50); 
    popStyle(); 

    translate(width/2,height/2 - out * height/2); 
    ellipse(0,0,10,10); 
} 

enter image description here

相关问题