The following is the web exercise 3.2.27. from the book Computer Science An Interdisciplinary Approach by Sedgewick & Wayne:
Write a data type that represents a particle undergoing a Brownian motion in two dimensions. Create a client program that takes a command line integer N, creates N particles at the origin, and simulates a Brownian motion for the N particles.
One thing to note: For the initial position of particles I chose random points throughout the blank page instead of the origin.
Here is my data-type implementation for Brownian particles:
public class BrownianParticle {
private double xPosition;
private double yPosition;
private final double particleRadius;
public BrownianParticle(double xPosition, double yPosition, double particleRadius) {
this.xPosition = xPosition;
this.yPosition = yPosition;
this.particleRadius = particleRadius;
}
public double getXPosition() {
return xPosition;
}
public double getYPosition() {
return yPosition;
}
public double getParticleRadius() {
return particleRadius;
}
public BrownianParticle updatePosition(double xIncrement, double yIncrement) {
double random = Math.random();
if (random < 1.0/8.0) {xPosition -= xIncrement; yPosition += yIncrement;}
else if (random < 2.0/8.0) {yPosition += yIncrement;}
else if (random < 3.0/8.0) {xPosition += xIncrement; yPosition += yIncrement;}
else if (random < 4.0/8.0) {xPosition += xIncrement;}
else if (random < 5.0/8.0) {xPosition += xIncrement; yPosition -= yIncrement;}
else if (random < 6.0/8.0) {yPosition -= yIncrement;}
else if (random < 7.0/8.0) {xPosition -= xIncrement; yPosition -= yIncrement;}
else if (random < 8.0/8.0) {xPosition -= xIncrement;}
return new BrownianParticle(xPosition, yPosition, particleRadius);
}
}
Here is my data-type implementation for drawing Brownian particles:
import java.awt.Color;
public class BrownianParticleDraw {
private final BrownianParticle particle;
public BrownianParticleDraw(BrownianParticle particle) {
this.particle = particle;
}
public void draw() {
StdDraw.setPenColor(StdDraw.GRAY);
StdDraw.filledCircle(particle.getXPosition(),
particle.getYPosition(),
particle.getParticleRadius());
}
public void drawWithSpotlight() {
Color lightYellow = new Color(255,255,51);
StdDraw.setPenColor(lightYellow);
StdDraw.filledCircle(particle.getXPosition(),
particle.getYPosition(),
particle.getParticleRadius()*5);
StdDraw.setPenColor(StdDraw.GRAY);
}
}
Here is my test client for simulating Brownian motion:
public class BrownianMotion {
public static double pickRandomlyBetween(double a, double b) {
return a + Math.random()*(b-a);
}
public static BrownianParticle[] InitializeRandomly(int numberOfParticles) {
BrownianParticle[] particles = new BrownianParticle[numberOfParticles];
double particleRadius = 0.005;
for (int i = 0; i < numberOfParticles; i++) {
// StdDraw creates a 1-by-1 blank page (from 0 to 1) by default
double xPoistion = pickRandomlyBetween(0.05, 0.95);
double yPosition = pickRandomlyBetween(0.05, 0.95);
particles[i] = new BrownianParticle(xPoistion, yPosition, particleRadius);
}
return particles;
}
public static void animate(int trials, BrownianParticle[] particles) {
int numberOfParticles = particles.length;
StdDraw.enableDoubleBuffering();
for (int t = 1; t <= trials; t++) {
double specificParticleRadius = particles[0].getParticleRadius();
particles[0].updatePosition(2*specificParticleRadius, 2*specificParticleRadius);
BrownianParticleDraw specificParticleDrawn = new BrownianParticleDraw(particles[0]);
StdDraw.clear();
specificParticleDrawn.drawWithSpotlight();
specificParticleDrawn.draw();
for (int i = 1; i < numberOfParticles; i++) {
double particleRadius = particles[i].getParticleRadius();
particles[i].updatePosition(2*particleRadius, 2*particleRadius);
BrownianParticleDraw particleDrawn = new BrownianParticleDraw(particles[i]);
particleDrawn.draw();
}
StdDraw.pause(100);
StdDraw.show();
}
}
public static void main(String[] args) {
int numberOfParticles = Integer.parseInt(args[0]);
int trials = Integer.parseInt(args[1]);
BrownianParticle[] particles = InitializeRandomly(numberOfParticles);
animate(trials, particles);
}
}
StdDraw is a simple API written by the authors of the book. I checked my program and it works. Here are 2 different instances of it.
Input: 2 50
Output:
Input: 200 50
Output:
Is there any way that I can improve my programs (especially their performance)?
Thanks for your attention.