wiring p; void setup(){ size(400,400); p = new wiring(5000,8); background(255); } void loop(){ p.load(); p.fire(); p.learn(); p.update(); } void mousePressed(){ background(255); p = new wiring(5000,mouseX); println(mouseX); } class wiring{ perceptron [] p; wiring(int n, int inp){ p = new perceptron[n]; float rad = 10; for (int i = 0; i < p.length; i++){ p[i] = new perceptron(0.01,(width/2)+(cos((TWO_PI/p.length)*i)*rad),(height/2)+(sin((TWO_PI/p.length)*i)*rad),inp); } } void load(){ for (int i1 = 0; i1 < p.length; i1++){ for (int i2 = 0; i2 < p[i1].ins.length; i2++){ p[i1].ins[i2] = p[(i1+(i2+1))%p.length].ot; } } } void fire(){ for (int i = 0; i < p.length; i++){ p[i].fire(); } } void learn(){ for (int i = 0; i < p.length; i++){ //float theta = (atan2(mouseY-p[i].y,mouseX-p[i].x)+PI)/TWO_PI; float theta = (atan2((width/2)-p[i].y,(height/2)-p[i].x)+PI) / TWO_PI; for (int i2 = 0; i2 < p[i].w.length; i2++){ //if(red(pixels[int(p[i].x)+int(p[i].y)*width])>128){ //if (sqrt(sq(abs(mouseX-p[i].x))+sq(abs(mouseY-p[i].y)))>102){ //if (sqrt(sq(abs(200-p[i].x))+sq(abs(200-p[i].y)))>50){ //p[i].ln = 0.001; //}else{ //p[i].ln = 0.2; //} p[i].ln = (sqrt(sq(abs((width/2)-p[i].x))+sq(abs((height/2)-p[i].y)))/100); //p[i].ln = (sqrt(sq(abs((mouseX)-p[i].x))+sq(abs((mouseY)-p[i].y)))/1000); p[i].learn(i2,theta); } } } void update(){ for (int i = 0; i < p.length; i++){ //p[i].x = fwrap(p[i].x + (cos(p[i].ot*TWO_PI) * 1),width-1); //p[i].y = fwrap(p[i].y + (sin(p[i].ot*TWO_PI) * 1),height-1); p[i].x = p[i].x + (cos(p[i].ot*TWO_PI)) * 1; p[i].y = p[i].y + (sin(p[i].ot*TWO_PI)) * 1; //if (r > 0 && i > p.length/2){r -= 10;}else if (r < 255){r += 10;} //if (g > 0 && i > p.length/2){g -= 10;}else if (g < 255){g += 10;} //if (b > 0 && i > p.length/2){b -= 10;}else if (b < 255){b += 10;} if(p[i].x < width && p[i].y < height && p[i].x > 0 && p[i].y > 0){ color c = pixels[int(p[i].x)+int(p[i].y)*width]; float r = red(c); float g = green(c); float b = blue(c); if (r > 0 && i > -1){r -= 10;}else if (r < 255){r += 10;} if (g > 0 && i > -1){g -= 10;}else if (g < 255){g += 10;} if (b > 0 && i > -1){b -= 10;}else if (b < 255){b += 10;} stroke(r,g,b); point(p[i].x,p[i].y); } } } } class perceptron{ float x,y,ot,ln; float [] ins; float [] w; perceptron(float ln, float x, float y, int inp){ //this.x = random(400); this.x = x; //this.y = random(400); this.y = y; this.ot = (PI+atan2(y,x))/TWO_PI; this.ln = ln; this.ins = new float[inp]; this.w = new float[inp]; for(int i = 0; i < w.length; i++){ w[i] = 1.0; } } void fire(){ ot = meanOut(ins,w); } void learn(int i, float d){ //w[i] += ln * (d - ot); w[i] += ln * (d - (w[i]*ins[i])); } } float meanOut(float [] inputs, float [] weights){ float sum = 0.0; for (int i = 0; i < inputs.length; i++){ sum += inputs[i] * weights[i]; } return sum / inputs.length; } float fwrap (float fvalu, float flimi){ float fcar=fvalu; if (fcar>flimi){ fcar=(fcar)%flimi; } if (fcar<0){ fcar=flimi-fcar; fcar=(fcar)%flimi; fcar=flimi-fcar; } return fcar; }