AIExport ai; Tracer make; SOM net; Vec2 [] netImage; Vec2 [] vectorImage; int polyLimit = 15; int state = 0; int num = 0; int netSize = 10; float vectorShift = 0.1; Vec2 [] template; Buttons [] button; Slider slider; PFont font; int exportState = 0; void setup(){ size(400,400);//,P3D); ai = new AIExport( this, 1 ); font = loadFont("Kartika-48.vlw"); textFont(font,26); button = new Buttons[2]; button[0] = new Buttons(width-100, 100, 100, 20, color(240,240,240), "train", null); button[1] = new Buttons(width-100, 120, 100, 20, color(240,240,240), "clear image", null); //button[2] = new Buttons(width-100, 140, 100, 20, color(240,240,240), "export data", null); slider = new Slider(width-100, 160, 100, 20, color(230,230,230), color(255,255,255), "vector shift", 0.0, 1.0, 0.1); template = new Vec2[9]; for(int i = 0; i < template.length; i++){ template[i] = new Vec2((1.0 / 2) * (i % 3),(1.0 / 2) * (i / 3)); } make = new Tracer(); netImage = new Vec2[netSize*netSize]; for(int i = 0; i < netImage.length; i++){ netImage[i] = new Vec2((1.0 / (netSize-1)) * (i % netSize),(1.0 / (netSize-1)) * (i / netSize)); } ellipseMode(CENTER); } void draw(){ ai.run(); background(240,240,240); make.draw(); drawNetImage(); drawVectorImage(); switch(state){ case 0: int rand; while (true){ if(vectorImage == null){ rand = int(random(netSize*netSize)); if (!overVector(netImage[rand].x,netImage[rand].y)) break; } else{ rand = int(random(netSize*netSize)); if (netImage[rand].dist(vectorImage[num]) < vectorShift && !overVector(netImage[rand].x,netImage[rand].y)) break; } } make.trace(netImage[rand]); num++; if(make.vector.length > polyLimit) state++; break; case 1: make.vector = concatVector(make.vector, template); net = new SOM(netSize,make.xVectors(),make.yVectors()); state++; break; case 2: net.run(); net.draw(); if(net.stable){ netImage = net.netImage(); state++; } break; case 3: break; } for(int i = 0; i < button.length; i++) button[i].draw(); slider.update(); slider.draw(); if(mousePressed && slider.locked){ noFill(); stroke(140,140,20); for(int i = 0; i < polyLimit+1; i++) ellipse(make.vector[i].x*width,make.vector[i].y*height,slider.xpos*width,slider.xpos*height); } switch(exportState){ case 1: ai.toggleContinuousRecording(); exportState++; break; case 2: aiExport(); exportState++; break; case 3: ai.toggleContinuousRecording(); exportState = 0; break; } } void mousePressed(){ int choice = -1; for(int i = 0; i < button.length; i++) if(button[i].over()) choice = i; switch(choice){ case 0: vectorImage = make.vector; make = new Tracer(); state = 0; num = 0; break; case 1: for(int i = 0; i < netImage.length; i++){ netImage[i] = new Vec2((1.0 / (netSize-1)) * (i % netSize),(1.0 / (netSize-1)) * (i / netSize)); } vectorImage = null; break; case 2: exportState = 1; break; } } void mouseReleased(){ vectorShift = slider.xpos; } void drawNetImage(){ stroke(0,0,255,255); for(int i = 0; i < netImage.length; i++) ellipse(netImage[i].x*width,netImage[i].y*width,4,4); } void drawVectorImage(){ if(vectorImage != null){ for(int i = 0; i < vectorImage.length; i++){ stroke(0,255,0,255); noFill(); ellipse(vectorImage[i].x*width,vectorImage[i].y*width,18,18); fill(0,180,0); text(i,vectorImage[i].x*width,vectorImage[i].y*width); } fill(0,255,0,20); beginShape(POLYGON); for(int i = 0; i < polyLimit+1; i++) vertex(vectorImage[i].x*width,vectorImage[i].y*height); endShape(); } } boolean overVector(float x, float y){ for(int i = 0; i < make.vector.length; i++) if (make.vector[i].equals(x,y)) return true; return false; } Vec2 [] concatVector(Vec2 [] vectors, Vec2 [] addVectors) { Vec2 [] temp = new Vec2[vectors.length + addVectors.length]; System.arraycopy(vectors, 0, temp, 0, vectors.length); System.arraycopy(addVectors, 0, temp, vectors.length, addVectors.length); return temp; } Vec2 [] addVector(Vec2 [] vectors, Vec2 newVector) { Vec2 [] temp = new Vec2[vectors.length + 1]; System.arraycopy(vectors, 0, temp, 0, vectors.length); temp[vectors.length] = newVector; return temp; }