我有一个完整的像素颜色值的数组顺序排列(R,G,B,A,R,G,B,A ......等),我试图通过它们改变值对于R,G和B,但我想单独留下A.什么是特别跳过数组第4(或第n)值的最佳方法?
我想做的事情:
我正在处理的项目是在P5.js中,但我认为这个问题更具体针对Javascript。
谢谢大家!
ETA:由于人们在问我在这里使用的是什么,你可以去:
var m = 0;
var array = [0];
function draw() {
var last = array[array.length-1];
loadPixels();
pixels[array[last]] += 1;
updatePixels();
if (pixels[array[last]] == 255) {
loadPixels();
pixels[array[last]] = 0;
updatePixels();
m += 1;
array.push(m);
}
}
这似乎工作得很接近,我可以看到像素循环通过颜色,但随后它们很快变白(可能是因为if
语句在循环通过它后将A值重置为零。虽然我仍然希望保持所有像素的移动(有点像我在列表中所描述的那样),而不仅仅是做一个然后继续下一个。
我原本没有包含这个,因为我仍然是Javascript的新手,并且意识到我的工作到目前为止可能是如此深奥的自我引导,我担心大多数人都无法做出正面或反面它的。但是如果可以的话,我想更好。
答案 0 :(得分:3)
您可以使用模运算非常简洁地执行此操作:
var myPixels = [255, 255, 255, 0.5, 255, 189, 22, 0.3];
function updatePixels(pixels) {
var shouldContinue = true,
i = 0;
for ( ; i < pixels.length && shouldContinue; i += 1) {
// Skip every 4th index
if (i % 4 !== 3) {
pixels[i] = (pixels[i] + 1) % 256;
// keep going as long as the current RGB value has just been reset to 0
shouldContinue = (pixels[i] === 0);
}
}
}
// EXAMPLE USAGE
console.log(myPixels);
updatePixels(myPixels);
console.log(myPixels);
updatePixels(myPixels);
console.log(myPixels);
运行时,会产生输出:
[255, 255, 255, 0.5, 0, 189, 22, 0.3]
[0, 0, 0, 0.5, 0, 190, 22, 0.3]
[1, 0, 0, 0.5, 0, 190, 22, 0.3]
答案 1 :(得分:1)
特别跳过数组第4(或第n)值的最佳方法是什么?
我们的想法是创建一个for
循环,并将i
作为索引,并检查i % 4 != 3
是否为真。下面的代码将跳过数组的第4项,其中n
是一个正整数。
var arr = ['R', 'G', 'B', 'A', 'R', 'G', 'B', 'A', 'R', 'G', 'B', 'A', 'R', 'G',
'B', 'A', 'R', 'G', 'B', 'A','R'];
for (i = 0; i < arr.length; i++) {
if (i % 4 != 3) {
alert(arr[i]); // will display only R, G, and B
// do your thing here for R, G, and B
}
}
字符串元素仅用于示例。您可以使用数组更改arr
并使用相同的for
循环。
答案 2 :(得分:1)
使用关键字continue
跳过迭代:
for(var i = 0; i < ary.length; i++) {
if(i % 4 === 3) {
continue; // this keyword means skip following steps, jump to next iteration
}
// work to do
}
答案 3 :(得分:0)
在数组循环逻辑上跳过4,然后RGB上的三个嵌套循环做你想做的事,见下文:
P.S。由于我的回答错误地被拒绝了,我添加了一个示例数组和一个console.log消息,为您提供一个完整的工作示例,您可以在节点或浏览器中运行它以查看它正在执行OP所要求的内容。
var a=[0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4];
for(i=0;i<a.length;i+=4) // notice the i+=4 instead of i++, this the trick.
{
for(b=0;b<256;b++) {
for(g=0;g<256;g++) {
for(r=0;r<256;r++) {
a[i]=r; // R cycles from 0 to 255
console.log(i, a[i], a[i+1], a[i+2]);
}
a[i+1]=g; // G cycles from 0 to 255
}
a[i+2]=b; // B cycles from 0 to 255
}
}