实现颜色循环背景的最佳方式是什么?
问题描述:
在不使用多个文件的情况下,使用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步:在草图的顶部声明变量。
- 第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,我们将从此处继续。祝你好运。
答
不明白你的意思是因为cos和sin与背景颜色有关。但是,也许这样的事情是你想要的?
void draw(){
int H = frameCount%1536;
background(color(abs(H-765)-256,512-abs(H-512),512-abs(H-1024)));
}
答
如果你特别想使用正弦波作为输入,而不是锯齿波,那么你需要你的输入(例如,时间)映射到某个色彩范围。例如:
- 从0每2000毫秒值增加到2.0
- 值范围从-1到1
- SIN(值)的输出范围从-1到1
- 地图输出到一个颜色范围。
行之有效的映射值,但你也可以使用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);
}
谢谢。它适用于一些调整! – Icy4614