/////////PARTICLE CLOUD SCRIPT/////////
import processing.pdf.*;
import processing.video.*;
import processing.opengl.*;
import processing.pdf.*;
import toxi.geom.*;
import toxi.processing.*;
PrintWriter output;
int nPoints = 5000; // points to draw
float complexity = 10; // wind complexity
float maxMass = .8; // max pollen mass
float timeSpeed = .03; // wind variation speed
float phase = TWO_PI; // separate u-noise from v-noise
float windSpeed = 10; // wind vector magnitude for debug
int step = 10; // spatial sampling rate for debug// distance between the wind vectors
float[] pollenMass;
float[][] points;
////////////////SETUP////////////////////
void setup() {
size(900, 900, P2D);//P2D (Processing 2D) - Fast 2D renderer, best used with pixel data, but not as accurate as the JAVA2D default.
// mm= new MovieMaker (this,width,height,"3W.mov",30,MovieMaker.MOTION_JPEG_B, MovieMaker.BEST);
points = new float[nPoints][2];
pollenMass = new float[nPoints];//maza gyris
for (int i = 0; i < nPoints; i++) {//for each point
points[i] = new float[] {
random(0, width), random(0, height)
};
pollenMass[i] = random(0, maxMass);
}
}
///////////////////DRAW////////////////////
void draw() {
// mm.addFrame();
float t = frameCount * timeSpeed;//defines the t
background(0);
float s = windSpeed;
//wind lines
for (int i = 0; i < width; i += step) {
for (int j = 0; j < height; j += step) {
float normx = map(i, 0, width, 0, 1);
float normy = map(j, 0, height, 0, 1);
float u = noise(t + phase, normx * complexity + phase, normy * complexity + phase);
float v = noise(t - phase, normx * complexity - phase, normy * complexity + phase);
pushMatrix(); //store the u,v in a matrix box
translate(i, j);
stroke(30);
line(1, 1, lerp(-windSpeed, windSpeed, u), lerp(-windSpeed, windSpeed, v));//xaraktiristika wind grammis, x1,y1,x2,y2
popMatrix();//takes the last stored item in the matrix box
}
}
//gia ta points: x,y
fill(255,255,0,100);//xroma ellipses sto debugmode
for (int i = 0; i < nPoints; i++) {
float x = points[i][0];
float y = points[i][1];
float normx = norm(x, 0, width);//?normalizes the value of x between 0 and width
float normy = norm(y, 0, height);//normalizes the value of y between 0 and height
float u = noise(t + phase, normx * complexity + phase, normy * complexity + phase);
float v = noise(t - phase, normx * complexity - phase, normy * complexity + phase);
float speed = (1 + noise(t, u, v)) / pollenMass[i];
x += lerp(-speed, speed, u);
y += lerp(-speed, speed, v);
//gia na mi feugoyn apo ti skini
if (x < 0 || x > width || y < 0 || y > height) {
x = random(0, width);
y = random(0, height);
}
stroke(random(130, 200), random(128, 148), 48, random(150, 200));
point(x,y);
points[i][0] = x; //otan ta svino de kounietai tipota
points[i][1] = y;
if ((frameCount% 5) == 0 ){
exportParticles();
}else{
}
}
}
void exportParticles()
{
// / open the text file
output = createWriter("points" + frameCount + ".txt");
// //String[] lines = new String[points.length];
// // loop through each agent and write to the file
for (int i = 0; i < points.length; i++) {
// // points[i] = new float[]{random(0, width), random(0, height)};
output.println (points[i][0] + "," + points[i][1]+ "," + (frameCount));
}
output.flush();
output.close();
}
/////////SINEWAVE ROBOT SCRIPT/////////
//Main Function//
import toxi.processing.*;
import toxi.geom.*;
import processing.video.*;
ArrayList population;
ArrayList attractFoodPop;
void setup(){
colorMode(HSB, 160);
smooth();
size(975,563);
population = new ArrayList();
attractFoodPop = new ArrayList();
for(int i = 0; i < 1000; i++){
Vec3D p = new Vec3D(random(0,width),random(0,height),0);
Vec3D v = new Vec3D(random(-1,1), random(-1,1), random(-1,1));
agent a = new agent(p,v, random(3,4), random(0.1, 0.3));
population.add(a);
}
for(int i = 0; i < 5; i++) {
Vec3D p = new Vec3D(random(0,width),random(0,height),0);
Vec3D v = new Vec3D(random(-1,1), random(-1,1), random(-1,1));
attractFoodPop.add(new attractorFood(p,v,random(1,2), random(0.1, 0.3))); // p, v, mv, mf
}
}
void draw(){
//mm.addFrame();
background(0,0,0);
for(int i = 0; i < population.size(); i++){
agent a = (agent) population.get(i);
a.update(attractFoodPop);
a.render();
}
for(int i = 0; i < attractFoodPop.size(); i++) {
attractorFood a = (attractorFood) attractFoodPop.get(i);
a.update();
a.render();
}
//saveFrame("output/frames-####.png");
}
//Agent Class//
class agent{
// states - global variables
Vec3D pos;
Vec3D vel;
float scaleVel = 1;
float maxVel;
float maxForce;
float Neighbors;
// constructor
agent(Vec3D p, Vec3D v, float mv, float mf){
pos = p.copy();
vel = v.copy();
maxVel = mv;
maxForce = mf;
}
// behaviors
void update(ArrayList attPop){
////////////////////////////////////////////////////////////////////////////////////////////////
this.attractorFood(attPop, 60);
Vec3D acc = new Vec3D();
// call the vector functions
//this.attractorFood(attPop, 100);
Vec3D ste = steer(new Vec3D(random(0,width),random(0,height),0));
Vec3D ali = alignment(population, 30);
Vec3D coh= cohesion (population, 30);
Vec3D sep= separation (population, 30);
// weight or scale vectors
ste.scaleSelf(2.0);//0
ali.scaleSelf(2.0);//0
coh.scaleSelf(2.0);//5
sep.scaleSelf(2.0);//3
/////////////////////////////////////////////////////////////////////////////////////////////
//coh.scaleSelf(scaleCoh);//5
// add vectors to acc
acc.addSelf(ste);
acc.addSelf(ali);
acc.addSelf(coh);
acc.addSelf(sep);
///////////////////////////////////////////////////////////////////////////////////////////////
// vel = vel + acc
vel.addSelf(acc);
vel.scaleSelf(scaleVel);
vel.limit(maxVel);
// pos = pos + vel
pos.addSelf(vel);
}
void attractorFood(ArrayList attPop, float range) {
float sumSin = 0;
int count = 0;
float minDist = 50000000;
//loop thru all the attractors
for(int i = 0; i < attPop.size(); i++) {
attractorFood a = (attractorFood) attPop.get(i);
//get the distance to the attractor
float Attdist = a.pos.distanceTo(this.pos);
if (Attdist<minDist){
minDist = Attdist;
}
}
//if distance < range of attractor
if(minDist < range) {
sumSin = sin(0.3*minDist);//sumSin = sumSin + (sin(0.06*Attdist))*(100/Attdist);
}else{sumSin = 1;}
scaleVel = sumSin; //scaleVel = 1/sumSin;
}
Vec3D steer(Vec3D target){
// make a vector from the pos to the target: vec = target - pos
Vec3D vec = target.sub(pos);
float d = vec.magnitude();
if(d > 0){
// normalize the vector - magnitude of 1
vec.normalize();
// scale to length of maxVel: vec = vec x maxVel
vec.scaleSelf(maxVel);
// subtract vel
vec.subSelf(vel);
// limit by maxForce
vec.limit(maxForce);
}else{
vec = new Vec3D(); // 0,0,0
}
// return the vector
return vec;
}
Vec3D alignment(ArrayList pop, float range){
Vec3D sum = new Vec3D(); // 0,0,0
int count = 0;
// loop through each agent in pop
for(int i = 0; i < pop.size(); i++){
agent a = (agent) pop.get(i);
// find the distance between the current agent and the other agent
float d = pos.distanceTo(a.pos);
// if distance < range
if( (d < range) && (d > 0) ){ //(d>0)
// sum = sum + other agents vel
sum.addSelf(a.vel);
// count = count + 1
count++;
}
}
// find the average: sum/count: sum = sum x 1/count
if(count > 0){
sum.scaleSelf(1/(float)count);
// limit the average vector to maxForce
sum.limit(maxForce);
}
// return the limited vector
return sum;
}
Vec3D cohesion(ArrayList pop, float range){
// make 0 vector sum, 0 int count
Vec3D sum = new Vec3D();
int count = 0;
// loop through all agents
for(int i = 0; i < pop.size(); i++){
// get one agent out of the arraylist
agent a = (agent) pop.get(i);
// calculate distance from pos to the other agent pos
float d = pos.distanceTo(a.pos);
// if distance < range && other agent is not this agent
if( (d < range) && (a != this) ){
// add other agent pos to sum, add 1 to count: sum = sum + a.pos
sum.addSelf(a.pos);
count++;
}
}
// find the average pos: sum/count: sum = sum x 1/count
if(count > 0){
sum.scaleSelf(1/(float)count); // sum is now the average pos
// steer toward the average pos
sum = steer(sum);
}
// return that vector
return sum;
}
Vec3D separation(ArrayList pop, float range){
// make 0 vector
Vec3D sum = new Vec3D(0,0,0);
// loop through each agent
for(int i = 0; i < pop.size(); i++){
// get an agent out of the arrayList
agent a = (agent) pop.get(i);
// calculate distance to the agent
float d = pos.distanceTo(a.pos);
// if distance is less than range
if( (d < range) && ( a != this) ){
// make a vector between the other agent and this agent
Vec3D vec = pos.sub(a.pos);
// scale vector by 1/distance
vec.scaleSelf(1/d);
// add the vector to sum
sum.addSelf(vec);
}
}
// limit to maxForce
sum.limit(maxForce);
// return vector
return sum;
}
void render(){
noStroke();
fill(0,0,255,40);
ellipse(pos.x, pos.y, 2, 2);
// x, y, w, h
}
}
//Attractor Class//
class attractorFood {
Vec3D pos;
Vec3D vel;
float maxVel;
float maxForce;
float mag = 100;
float range = 50;
float Neighbors;
attractorFood(Vec3D p, Vec3D v, float mv, float mf){
pos = p.copy();
vel = v.copy();
maxVel = mv;
maxForce = mf;
}
void update(){
int Neighbors= getNeighbors(population, 30);
println (Neighbors);
Vec3D acc = new Vec3D();
// call the vector functions
Vec3D ste = steer(new Vec3D(random(0,width),random(0,height),0)); //steer(new Vec3D(mouseX,mouseY,0));
Vec3D ali = alignment(attractFoodPop, 30); //steer(new Vec3D(random(0,width),random(0,height),0));
Vec3D coh= cohesion (attractFoodPop, 30);
Vec3D sep= separation (attractFoodPop, 30);
// weight or scale vectors
ste.scaleSelf(.2);//0.1
ali.scaleSelf(.2);//1.0
coh.scaleSelf(.2);//2.0
sep.scaleSelf(.2);//5.0
// add vectors to acc
acc.addSelf(ste);
acc.addSelf(ali);
acc.addSelf(coh);
acc.addSelf(sep);
// vel = vel + acc
vel.addSelf(acc);
vel.limit(maxVel);
// pos = pos + vel
pos.addSelf(vel);
torusSpace();
}
int getNeighbors(ArrayList pop, float range){
int count=0;
for(int i = 0; i < pop.size(); i++){
agent a = (agent) pop.get(i);
float d = pos.distanceTo(a.pos);
if( (d < range) && (d > 0) ) {
count++;
}
}
return count;
}
Vec3D steer(Vec3D target){
// make a vector from the pos to the target: vec = target - pos
Vec3D vec = target.sub(pos);
float d = vec.magnitude();
if(d > 0){
// normalize the vector - magnitude of 1
vec.normalize();
// scale to length of maxVel: vec = vec x maxVel
vec.scaleSelf(maxVel);
// subtract vel
vec.subSelf(vel);
// limit by maxForce
vec.limit(maxForce);
}else{
vec = new Vec3D(); // 0,0,0
}
// return the vector
return vec;
}
Vec3D alignment(ArrayList pop, float range){
Vec3D sum = new Vec3D(); // 0,0,0
int count = 0;
// loop through each agent in pop
for(int i = 0; i < attractFoodPop.size(); i++){
attractorFood a = (attractorFood) pop.get(i); ///attractorFood a = (attractorFood)
// find the distance between the current agent and the other agent
float d = pos.distanceTo(a.pos);
// if distance < range
if( (d < range) && (d > 0) ){ //(d>0)
// sum = sum + other agents vel
sum.addSelf(a.vel);
// count = count + 1
count++;
}
}
// find the average: sum/count: sum = sum x 1/count
if(count > 0){
sum.scaleSelf(1/(float)count);
// limit the average vector to maxForce
sum.limit(maxForce);
}
// return the limited vector
return sum;
}
Vec3D cohesion(ArrayList pop, float range){
// make 0 vector sum, 0 int count
Vec3D sum = new Vec3D();
int count = 0;
// loop through all agents
for(int i = 0; i < attractFoodPop.size(); i++){
// get one agent out of the arraylist
attractorFood a = (attractorFood) pop.get(i);
// calculate distance from pos to the other agent pos
float d = pos.distanceTo(a.pos);
// if distance < range && other agent is not this agent
if( (d < range) && (d > 0) ){
// add other agent pos to sum, add 1 to count: sum = sum + a.pos
sum.addSelf(a.pos);
count++;
}
}
// find the average pos: sum/count: sum = sum x 1/count
if(count > 0){
sum.scaleSelf(1/(float)count); // sum is now the average pos
// steer toward the average pos
sum = steer(sum);
}
// return that vector
return sum;
}
Vec3D separation(ArrayList pop, float range){
// make 0 vector
Vec3D sum = new Vec3D(0,0,0);
// loop through each agent
for(int i = 0; i < attractFoodPop.size(); i++){
// get an agent out of the arrayList
attractorFood a = (attractorFood) pop.get(i);
// calculate distance to the agent
float d = pos.distanceTo(a.pos);
// if distance is less than range
if( (d < range) && (d > 0) ){
// make a vector between the other agent and this agent
Vec3D vec = pos.sub(a.pos);
// scale vector by 1/distance
vec.scaleSelf(1/d);
// add the vector to sum
sum.addSelf(vec);
}
}
// limit to maxForce
sum.limit(maxForce);
// return vector
return sum;
}
void torusSpace(){
if(pos.x > width) pos.x = pos.x - width;
if(pos.y > height) pos.y = pos.y - height;
if(pos.x < 0) pos.x = pos.x + width;
if(pos.y < 0) pos.y = pos.y + height;
}
void render() {
noStroke();
fill(25,100,255,70);
ellipse(pos.x, pos.y, 7, 7);
}
}