home server
pics
mkgarbus
aurora
This browser does not have a Java Plug-in. Get the latest Java Plug-in here.
// m.garbus 2008 (mikeandkerri.com) // GravSystem class should be rewritten to be fully portable //user defined constants int horzSize = 500; int vertSize = 500; int numberOfStaticGravBodies = 10; float gravMassMax = 1000; //setup GravSystem s1; int buttonClickState = 0; void setup() { size(horzSize,vertSize); //size(500,500); fill(0); smooth(); background(255); s1 = new GravSystem(numberOfStaticGravBodies, (float)horzSize/2, (float)vertSize/2, 0.0, 0.0, 1000.0, horzSize, vertSize); frameRate(30); } void draw() { s1.CalcNextPos(1); color myColor = color(s1.getMagOfV()*25, 128, 200, 128); fill(myColor); stroke(color(50), 128, 200, 128); strokeWeight(3); if (buttonClickState == 0) ellipse(s1.getX(), s1.getY(), 5*s1.getMagOfV(), 5*s1.getMagOfV()); if (buttonClickState == 2 || buttonClickState == 3){ point(s1.getX(), s1.getY()); } s1.CheckPosition(); } void mousePressed(){ ++buttonClickState; if (buttonClickState >= 4){ buttonClickState = 0; } if (buttonClickState == 0){ background(255); s1 = new GravSystem(numberOfStaticGravBodies, (float)horzSize/2, (float)vertSize/2, 0.0, 0.0, 1000.0, horzSize, vertSize); } if (buttonClickState == 2){ background(255); s1 = new GravSystem(numberOfStaticGravBodies, (float)horzSize/2, (float)vertSize/2, 0.0, 0.0, 1000.0, horzSize, vertSize); } else if (buttonClickState == 3){ for (int i = 0; i < s1.numOfStaticObjs; ++i){ fill(s1.staticObjGravMass[i]*20/gravMassMax); ellipse(s1.staticObjPos[0][i], s1.staticObjPos[1][i], s1.staticObjGravMass[i]*20/gravMassMax, s1.staticObjGravMass[i]*20/gravMassMax); } } } class GravSystem { int numOfStaticObjs; float [][] staticObjPos; float [] staticObjGravMass; float [] particlePosition; float [] particleVelocity; float particleMass; float gravConst = 0.1; int horzSize; int vertSize; GravSystem(int numberOfObj, float posX, float posY, float velX, float velY, float partMass, int UniverseSizeX, int UniverseSizeY) { numOfStaticObjs = numberOfObj; staticObjPos = new float[2][numOfStaticObjs]; staticObjGravMass = new float[numOfStaticObjs]; particlePosition = new float[2]; particleVelocity = new float[2]; particleMass = partMass; horzSize = UniverseSizeX; vertSize = UniverseSizeY; for (int i = 0; i < numOfStaticObjs; ++i) { staticObjPos[0][i] = random((float)horzSize*1.0/4.0,(float)horzSize*3.0/4.0); staticObjPos[1][i] = random((float)vertSize*1.0/4.0,(float)vertSize*3.0/4.0); staticObjGravMass[i] = random(gravMassMax/2,gravMassMax); } particlePosition[0] = posX; particlePosition[1] = posY; particleVelocity[0] = velX; particleVelocity[1] = velY; } public float getX(){ return particlePosition[0]; } public float getY(){ return particlePosition[1]; } public float getVx(){ return particleVelocity[0]; } public float getVy(){ return particleVelocity[1]; } public float getMagOfV(){ return sqrt(particleVelocity[0]*particleVelocity[0]+particleVelocity[1]*particleVelocity[1]); } public void CalcNextPos (float timeStep) { float[][] forces = new float[3][numOfStaticObjs]; float[][] positions = new float[2][numOfStaticObjs]; float[][] velocities = new float[2][numOfStaticObjs]; float sumOfPositionX = 0; float sumOfPositionY = 0; float sumOfVelocitiesX = 0; float sumOfVelocitiesY = 0; for (int i = 0; i < numOfStaticObjs; ++i) { float rSquared = (staticObjPos[0][i] - particlePosition[0])*(staticObjPos[0][i] - particlePosition[0]) + (staticObjPos[1][i] - particlePosition[1])*(staticObjPos[1][i] - particlePosition[1]); float r = sqrt(rSquared); forces[0][i] = gravConst * particleMass * staticObjGravMass[i] / (rSquared); forces[1][i] = forces[0][i] * (staticObjPos[0][i] - particlePosition[0]); // removed division by r ('normalize' effect of grav over space) forces[2][i] = forces[0][i] * (staticObjPos[1][i] - particlePosition[1]); // removed division by r ('normalize' effect of grav over space) velocities[0][i] = particleVelocity[0] + (forces[1][i] / particleMass) * timeStep; velocities[1][i] = particleVelocity[1] + (forces[2][i] / particleMass) * timeStep; positions[0][i] = particlePosition[0] + particleVelocity[0] * timeStep; positions[1][i] = particlePosition[1] + particleVelocity[1] * timeStep; sumOfPositionX += positions[0][i]; sumOfPositionY += positions[1][i]; sumOfVelocitiesX += velocities[0][i]; sumOfVelocitiesY += velocities[1][i]; } particlePosition[0] = sumOfPositionX / numOfStaticObjs; particlePosition[1] = sumOfPositionY / numOfStaticObjs; particleVelocity[0] = sumOfVelocitiesX / numOfStaticObjs; particleVelocity[1] = sumOfVelocitiesY / numOfStaticObjs; } void CheckPosition(){ if (particlePosition[0] > horzSize) { particlePosition[0] = 0; particleVelocity[0] = particleVelocity[0]/1.5; particleVelocity[1] = particleVelocity[1]/1.5; } else if (particlePosition[0] < 0){ particlePosition[0] = horzSize; particleVelocity[0] = particleVelocity[0]/1.5; particleVelocity[1] = particleVelocity[1]/1.5; } else if (particlePosition[1] > vertSize){ particlePosition[1] = 0; particleVelocity[0] = particleVelocity[0]/1.5; particleVelocity[1] = particleVelocity[1]/1.5; } else if (particlePosition[1] < 0){ particlePosition[1] = vertSize; particleVelocity[0] = particleVelocity[0]/1.5; particleVelocity[1] = particleVelocity[1]/1.5; } } }