Ok.. I know the code is sloppy.. just playing around and thought it was cool. It's based on some sine wave code I found in the hacks section. Figured I would share it.
Code:import processing.opengl.*;
import javax.media.opengl.GL;
int xspacing = 30; // How far apart should each horizontal location be spaced
int w; // Width of entire wave
int maxwaves = 1; // total # of waves to add together
int wavecycles =4; //times to run it
float theta = 0.0;
float[] amplitude = new float[maxwaves]; // Height of wave
float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing
float[] yvalues; // Using an array to store height values for the wave (not entirely necessary)
float[] zvalues;
PGraphicsOpenGL pgl;
GL gl;
void setup() {
size(350, 130,OPENGL);
hint(DISABLE_OPENGL_2X_SMOOTH);
hint(ENABLE_OPENGL_2X_SMOOTH); //after disabling the 2x this works fine
pgl = (PGraphicsOpenGL) g;
gl = pgl.gl;
gl.glDepthMask(false);
gl.glEnable( gl.GL_BLEND );
gl.glHint (gl.GL_LINE_SMOOTH_HINT, gl.GL_NICEST);
gl.glEnable (gl.GL_LINE_SMOOTH);
frameRate(30);
}
void draw() {
gl.glEnable( gl.GL_BLEND );
gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE);
background(0);
for (int i=0;i < wavecycles; i++) {
calcWave(-100,50,0,300,100,100);
renderWave(-100,50,0,300,100,100);
}
strokeWeight(2);
stroke(255,255,255,180);
rect(-3,37,width,23);
noStroke();
fill(255,255,255,90);
rect(-3,39,width,10);
gl.glDisable( gl.GL_BLEND );
fill(255);
stroke(160,160,160,140);
rect(-3,35,45,28);
noStroke();
fill(200,200,200,255);
rect(-4,49,45,13);
fill(255);
stroke(160,160,160,140);
rect(width-42,35,45,28);
noStroke();
fill(200,200,200,255);
rect(width-41,49,45,13);
strokeWeight(2);
stroke(210,210,210);
line(40,37,40,61);
line(width-40,37,width-40,61);
}
void calcWave(int x1, int y1, int z1, int x2, int y2, int z2) {
w = (int)dist(x1, y1, z1, x2, y2, z2);
for (int i = 0; i < maxwaves; i++) {
amplitude[i] = random(6,10);
float period = random(100,300); // How many pixels before the wave repeats
dx[i] = (TWO_PI / period) * xspacing;
}
yvalues = new float[w/xspacing];
zvalues = new float[w/xspacing];
// Increment theta (try different values for 'angular velocity' here
theta += 1.42;
// Set all height values to zero
for (int i = 0; i < yvalues.length; i++) {
yvalues[i] = y1;
zvalues[i] = z1;
}
// Accumulate wave height values
for (int j = 0; j < maxwaves; j++) {
float x = theta;
for (int i = 0; i < yvalues.length; i++) {
// Every other wave is cosine instead of sine
if (j % 2 == 0) yvalues[i] += sin(x)*amplitude[j];
else yvalues[i] += cos(x)*amplitude[j];
if (j % 2 == 0) zvalues[i] += sin(yvalues[i])*amplitude[j];
else zvalues[i] += cos(yvalues[i])*amplitude[j];
x+=dx[j];
}
}
}
void renderWave(int x1, int y1, int z1, int x2, int y2, int z2) {
noFill();
int ranx = int(random(-4,0));
int rany = int(random(-4,0));
int ranz = int(random(-4,0));
beginShape();
strokeWeight(3);
stroke(0,0,255,160);
for (int x = 0; x < yvalues.length; x++) {
curveVertex(int(x*xspacing)+ranx,int(yvalues[x])+rany,int(zvalues[x])+ranz);
}
endShape();
beginShape();
strokeWeight(1);
stroke(255,255,255,120);
for (int x = 0; x < yvalues.length; x++) {
curveVertex(int(x*xspacing)+ranx,int(yvalues[x])+rany,int(zvalues[x])+ranz);
}
endShape();
strokeWeight(6);
stroke(255,255,255,50);
int yval = yvalues.length-2;
line(int(1*xspacing),int(yvalues[1]),int(zvalues[1]),int(yval*xspacing),int(yvalues[yval]),int(zvalues[yval]));
}