float gMag = 1, gVelMax = 10, gThres, gThresT, gBgAlpha = 255, gBgAlphaT = 255;
gThres = lerp(gThres, gThresT, .02);
gBgAlpha = lerp(gBgAlpha, gBgAlphaT, .02);
gMag = sliderForce.value;
rect(0, 0, width, height);
for (int i=0; i<ptcs.length; i++) {
for (int i=0; i<ptcs.length; i++) {
ptcs[i].update(mouseX, mouseY);
for (int i=0; i<ptcs.length; i++) {
for (int i=0; i<ptcs.length; i++) {
for (int i=0; i<ptcs.length; i++) {
for (int j=i+1; j<ptcs.length; j++) {
float d = dist(ptcs[i].pos.x, ptcs[i].pos.y, ptcs[j].pos.x, ptcs[j].pos.y);
float scalar = map(d, 0, gThres, 1, 0);
ptcs[i].drawCnt(ptcs[j], scalar);
PVector pos, pPos, vel, acc;
float decay, weight, magScalar;
pos = new PVector(random(width), random(height));
pPos = new PVector(pos.x, pos.y);
decay = map(weight, 1, 10, .95, .85);
magScalar = map(weight, 1, 10, .5, .05);
void update(float tgtX, float tgtY) {
acc.set(tgtX-pos.x, tgtY-pos.y);
float accMag = sqrt(sq(acc.x)+sq(acc.y));
acc.mult(gMag * magScalar);
float velMag = sqrt(sq(vel.x)+sq(vel.y));
if(velMag>gVelMax) vel.mult(gVelMax/velMag);
if(onPressed)line(pos.x, pos.y, pPos.x, pPos.y);
else point(pos.x, pos.y);
void drawCnt(Ptc coPtc, float scalar) {
strokeWeight((weight+coPtc.weight)*.5*scalar);
line(pos.x, pos.y, coPtc.pos.x, coPtc.pos.y);
ArrayList <Slider> slidersList;
Slider sliderGhost, sliderThres, sliderForce;
slidersList = new ArrayList<Slider>();
sliderGhost = new Slider(100, 30, 120, 20);
sliderGhost.setTag("Ghost");
sliderGhost.setValue(32, 6, 255);
sliderThres = new Slider(100, 55, 120, 20);
sliderThres.setTag("Threshold");
sliderThres.setValue(100, 0, 240);
sliderForce = new Slider(100, 80, 120, 20);
sliderForce.setTag("Force");
sliderForce.setValue(1, -1, 1);
slidersList.add(sliderGhost);
slidersList.add(sliderThres);
slidersList.add(sliderForce);
for(int i=0; i<slidersList.size(); i++){
Slider slider = slidersList.get(i);
for(int i=0; i<slidersList.size(); i++){
Slider slider = slidersList.get(i);
PVector pos, nameTagPos, valueTagPos;
float w, h, innerW, value, valueMin, valueMax;
String nameTag, valueTag;
Slider(float x, float y, float w, float h){
nameTagPos = new PVector(x-10, y);
valueTagPos = new PVector(x+w*.5, y);
void setTag(String nameTag){
void setValue(float value, float valueMin, float valueMax){
this.valueMin = valueMin;
this.valueMax = valueMax;
valueTag = str(round(value*100)/100);
innerW = map(value, valueMin, valueMax, 0, w);
innerW = constrain(mouseX-pos.x, 0, w);
value = map(innerW, 0, w, valueMin, valueMax);
valueTag = str(round(value*100)/100);
rect(pos.x, pos.y, w, h);
rect(pos.x, pos.y, innerW, h);
rect(pos.x-10-textWidth(nameTag), pos.y, 10+textWidth(nameTag), h);
text(nameTag, nameTagPos.x, nameTagPos.y);
text(valueTag, valueTagPos.x, valueTagPos.y);
for(int i=0; i<slidersList.size(); i++){
Slider slider = slidersList.get(i);
if(mouseX>slider.pos.x && mouseX<slider.pos.x+slider.w && mouseY>slider.pos.y && mouseY<slider.pos.y+slider.h){
gThresT = sliderThres.value;
gBgAlphaT = sliderGhost.value;
for(int i=0; i<slidersList.size(); i++){
Slider slider = slidersList.get(i);