Last active
March 23, 2017 19:28
-
-
Save simon446/35e529ebdcb477db013cc7f49af9b918 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ArrayList<Particle> ellipses = new ArrayList<Particle>(); // En lista som sparar alla partiklar i sketchen | |
void setup() { | |
fullScreen(); | |
frameRate(30); | |
//Skapar partiklarna | |
for (int i = 0; i < 500; i++) { | |
float x = random(width); // x = slumpmässig bredd | |
float y = random(height); // y = slumpmässig höjd | |
ellipses.add(new Particle(x,y)); // Skapa en partikel vis x, y | |
} | |
//Beräkna partiklar som ligger nära varandra (endast för prestandaförbättring) | |
for (int i = 0; i < ellipses.size(); i++) { | |
Particle ellipse = ellipses.get(i); | |
ellipse.calcNear(); | |
} | |
} | |
// Drawfunktionen | |
void draw() { | |
background(10); //Ny bakgrund för varje frame | |
for (int i = 0; i < ellipses.size(); i++) { // Körs en gång för varje partikel (varje ellipse) | |
Particle ellipse = ellipses.get(i); // Sparar ellipses med index i till variabeln ellipse | |
ellipse.move(); // Flytta partikeln med movefunktionen (se nedan) | |
ellipse.makeLine(); // Beräkna vilka andra partiklar som det ska dras en linje mellan | |
ellipse.show(); // Slutlige så ritas ellipsen med funktionen show() | |
} | |
} | |
// Partikelklassen | |
class Particle { | |
// Den position där partikeln roterar runt | |
public float xCenter; // Rotationspunkt x-led | |
public float yCenter; // Rotationspunkt y-led | |
// Partikelns nuvarade position i dess omloppsbana | |
public float xPos; // Position i x-led | |
public float yPos; // Position i y-led | |
public float rot; // Partikelns nuvarande rotation i förhållande till centerpositionen | |
public float rotSpeed; // Hastighet och rotation (varierar mellan partiklar) | |
public color c; // En färgvariabel för varje partikel | |
public ArrayList<Particle> near; // En variabel för att hålla koll på de partiklarana som ligger nära partikeln (för prestandaoptimering) | |
public Particle(float x, float y) { // Konstruktionsfunktion | |
// xCenter och yCenter variablarna bestäms när partikeln skapas, se funktionen setup() | |
this.xCenter = x; | |
this.yCenter = y; | |
// Partikelns initiala rotation är lika med 0 | |
this.rot = 0; | |
// Partikeln får en slumpmässig rotationshastighet | |
this.rotSpeed = random(-1,1); | |
// Definiering av near ArrayList | |
this.near = new ArrayList<Particle>(); | |
//Flyttar partikeln och ger den en färg enligt funktionerna nedan | |
this.move(); | |
this.newColor(); | |
} | |
void calcNear() { // En funktion som optimiserar så att varje partikel endast kollar på närliggande partiklar | |
for (int i = 0; i < ellipses.size(); i++) { // Körs en gång för varje partikel | |
Particle testEllipse = ellipses.get(i); // Placerar partikeln som loopen går igenom i variabeln testEllipse | |
if (testEllipse != this) { // Konstrollerar att den ellipse som programmet går igenom inte är sig själv | |
if (dist(testEllipse.xCenter,testEllipse.yCenter,this.xCenter,this.yCenter) <= 200) { | |
near.add(testEllipse); // Lägger till en partikel i ArrayList near | |
} | |
} | |
} | |
} | |
void move() { // Funktion som flyttar en partikel | |
// Partikelns x och y positioner flyttas enligt formeln | |
this.xPos = this.xCenter + cos(this.rot) * 100; | |
this.yPos = this.yCenter + sin(this.rot) * 100; | |
// Partikelns rotation ökar/minskar enligt formeln | |
this.rot += 0.06 * this.rotSpeed; | |
} | |
void show() { // Partikeln visas med funktionen | |
fill(this.c,70); // Partikeln får färg från variabeln this.c med 80/255 opacitet | |
noStroke(); | |
ellipse(this.xPos,this.yPos,4,4); // Ritar partikeln med x-positionen, y-positionen med storleken 4 px diameter | |
} | |
void makeLine() { // Funktion för att skapa en linje mellan två partiklar | |
for (int i = 0; i < near.size(); i++) { // Körs en gång för alla partiklar i närheten av partikeln | |
Particle testEllipse = near.get(i); // Placerar partikeln som loopen går igenom i variabeln testEllipse | |
if (testEllipse != this) { // Konstrollerar att den ellipse som programmet går igenom inte är sig själv | |
// Ritar en linje mellan nuvarande partikel och testpartikeln endast om avståndet är mindre än 70 px | |
if(dist(testEllipse.xPos,testEllipse.yPos,this.xPos,this.yPos) < 70) { | |
stroke(this.c,60); // Ändrar färg på linjen | |
line(testEllipse.xPos,testEllipse.yPos,this.xPos,this.yPos); // Ritar linjen | |
this.c = testEllipse.c; // Partikeln får samma färg som testpartikeln | |
} | |
} | |
} | |
} | |
void newColor() { // Funktion som ger en slumpmässig färg till partikeln | |
// En tredjedels chans att det blir vardera av dessa nedan | |
float r = random(1); | |
if (r < 0.33) { // 33% chans | |
this.c = color(random(255),255,0); | |
} else if (r >= 0.33 && r < 0.66) { // 33% chans | |
this.c = color(0,random(255),255); | |
} else { // 33% chans | |
this.c = color(255,0,random(255)); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment