Kevinが示唆したように、point()
を使用すると、beginShape();vertex() and endShape();
が呼び出されて以来、最も効率的な方法ではありません。ピクセルを使用する方が良いかもしれません。
さらに、入れ子になったループは単一のループとして記述することができ、背後の平方根を使用するdist()
は避けることができます(より高い値で平方距離を使用できます)。これは、このようなsin()
やexp()
などの機能を消費するより多くの時間のためのルックアップテーブルを用いてさらにスピードアップすることができます
float x1;
float y1;
float x2;
float y2;
int t = 0;
//using larger factors to use squared distance bellow instead of dist(),sqrt()
float factorA = 20*200;
float factorB = 80*200;
void setup() {
//noLoop();
frameRate(30);
size(400, 400);
x1 = width/4;
y1 = height/2;
x2 = width * 3/4;
y2 = height/2;
//use pixels, not points()
loadPixels();
}
void draw() {
for (int i = 0; i < pixels.length; i++) {
int x = i % width;
int y = i/height;
float dx1 = x1-x;
float dy1 = y1-y;
float dx2 = x2-x;
float dy2 = y2-y;
//squared distance
float d1 = dx1*dx1+dy1*dy1;//dist(x1, y1, x, y);
float d2 = dx2*dx2+dy2*dy2;//dist(x2, y2, x, y);
float wave1 = (1 + (sin(TWO_PI * d1/factorA + t))) * 0.5 * exp(-d1/factorB);
float wave2 = (1 + (sin(TWO_PI * d2/factorA + t))) * 0.5 * exp(-d2/factorB);
pixels[i] = color((wave1 + wave2) *255);
}
updatePixels();
text((int)frameRate+"fps",10,15);
// endShape();
t--; //Wave propagation
//saveFrame("wave-##.png");
}
:
ここではこれらを使用したバージョンです。
あなたがラフ(数字は微調整する必要がある)見ることができても、JavaScriptで実行されているプレビュー:
var x1;
var y1;
var x2;
var y2;
var t = 0;
var factorA = 20*200;
var factorB = 80*200;
function setup() {
createCanvas(400, 400);
frameRate(30);
x1 = width/4;
y1 = height/2;
x2 = width * 3/4;
y2 = height/2;
loadPixels();
}
function draw() {
for (var i = 0; i < pixels.length; i+= 4) {
var x = i % width;
var y = i/height;
var dx1 = x1-x;
var dy1 = y1-y;
var dx2 = x2-x;
var dy2 = y2-y;
var d1 = dx1*dx1+dy1*dy1;//dist(x1, y1, x, y);
var d2 = dx2*dx2+dy2*dy2;//dist(x2, y2, x, y);
var wave1 = (1 + (sin(TWO_PI * d1/factorA + t))) * 0.5 * exp(-d1/factorB);
var wave2 = (1 + (sin(TWO_PI * d2/factorA + t))) * 0.5 * exp(-d2/factorB);
pixels[i] = pixels[i+1] = pixels[i+2] = (wave1 + wave2) * 255;
pixels[i+3] = 255;
}
updatePixels();
text(frameRate+"fps",10,15);
// endShape();
t--; //Wave propagation
//saveFrame("wave-##.png");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.24/p5.min.js"></script>
あなたが画像を合成するために数学を使用しているので、それはより多くを行うことができますこれをGLSLシェーダとして記述します。詳細についてはPShader tutorialを必ずチェックアウトしてください。
アップデート:ここで
はGLSLのバージョンがあります:コードが少ないハックされ、より多くの読み:
float t = 0;
float factorA = 0.20;
float factorB = 0.80;
PShader waves;
void setup() {
size(400, 400, P2D);
noStroke();
waves = loadShader("waves.glsl");
waves.set("resolution", float(width), float(height));
waves.set("factorA",factorA);
waves.set("factorB",factorB);
waves.set("pt1",-0.5,0.0);
waves.set("pt2",0.75,0.0);
}
void draw() {
t++;
waves.set("t",t);
shader(waves);
rect(0, 0, width, height);
}
void mouseDragged(){
float x = map(mouseX,0,width,-1.0,1.0);
float y = map(mouseY,0,height,1.0,-1.0);
println(x,y);
if(keyPressed) waves.set("pt2",x,y);
else waves.set("pt1",x,y);
}
void keyPressed(){
float amount = 0.05;
if(keyCode == UP) factorA += amount;
if(keyCode == DOWN) factorA -= amount;
if(keyCode == LEFT) factorB -= amount;
if(keyCode == RIGHT) factorB += amount;
waves.set("factorA",factorA);
waves.set("factorB",factorB);
println(factorA,factorB);
}
そしてwaves.glsl:
#define PROCESSING_COLOR_SHADER
uniform vec2 pt1;
uniform vec2 pt2;
uniform float t;
uniform float factorA;
uniform float factorB;
const float TWO_PI = 6.283185307179586;
uniform vec2 resolution;
uniform float time;
void main(void) {
vec2 p = -1.0 + 2.0 * gl_FragCoord.xy/resolution.xy;
float d1 = distance(pt1,p);
float d2 = distance(pt2,p);
float wave1 = (1.0 + (sin(TWO_PI * d1/factorA + t))) * 0.5 * exp(-d1/factorB);
float wave2 = (1.0 + (sin(TWO_PI * d2/factorA + t))) * 0.5 * exp(-d2/factorB);
float gray = wave1 + wave2;
gl_FragColor=vec4(gray,gray,gray,1.0);
}
あなたが使用することができます最初の点をドラッグし、キーを押しながら2番目の点をドラッグします。 さらにfactorAとfactorBを変更するには、UP/DOWN
,LEFT/RIGHT
のキーを使用します。結果は面白そうに見える:
また、あなたは(私は非圧縮保存をお勧めします)スレッドを使用してフレームを保存するためにthis answerからコードのビットをつかむことができます。
どのAPIですか?私は減速の大部分がポイント(x、y)法の内側にあると考えます。基本的なJavaのBufferedImageでピクセルを直接設定し、それを1秒間に30回スクリーンに表示すると、十分速く動作するはずです。 –