import java.awt.Point; import java.util.ArrayList; import java.util.List; public class Lightning { private static final double VAR_FACTOR = 0.40; private static final double VAR_DECREASE = 0.55; private static final int MIN_LENGTH = 50; @SuppressWarnings("unused") public static void main(String[] args) { Point start = new Point(0, 0); Point end = new Point(0, 400); ArrayList bolt = buildBolt(start, end); } public static ArrayList buildBolt(Point start, Point end) { ArrayList bolt = new ArrayList(); double dx = start.getX() - end.getX(); double dy = start.getY() - end.getY(); double length = Math.sqrt(dx*dx + dy*dy); double variance = length * VAR_FACTOR; bolt.add(start); buildBolt(start, end, bolt, variance); return bolt; } private static void buildBolt(Point start, Point end, List bolt, double variance) { double dx = start.getX() - end.getX(); double dy = start.getY() - end.getY(); double length = Math.sqrt(dx*dx + dy*dy); if (length > MIN_LENGTH) { int midX = (start.x + end.x)/2; int midY = (start.y + end.y)/2; int varX = (int) ((Math.random() * variance * 2) - variance); midX = midX + varX; Point mid = new Point(midX, midY); buildBolt(start, mid, bolt, variance * VAR_DECREASE); buildBolt(mid, end, bolt, variance * VAR_DECREASE); } else { bolt.add(end); } return; } }