From d4f4778a5d960cd360a37a1fea7b052f2312d5a8 Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Tue, 28 Oct 2025 11:24:10 +0100 Subject: [PATCH] improved plasma clouds --- week7/PlasmaClouds.java | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/week7/PlasmaClouds.java b/week7/PlasmaClouds.java index f59fd75..6ac65e8 100644 --- a/week7/PlasmaClouds.java +++ b/week7/PlasmaClouds.java @@ -11,23 +11,41 @@ public class PlasmaClouds { StdDraw.enableDoubleBuffering(); - draw(.5, .5, 1, 1, variance, s); + draw(.5, .5, 1, StdRandom.uniformDouble(), StdRandom.uniformDouble(), StdRandom.uniformDouble(), StdRandom.uniformDouble(), variance, s); StdDraw.show(); } - public static void draw(double x, double y, double halfSize, double color, double var, double s) { - if (halfSize < 0.01) { - StdDraw.setPenColor((int) (color * 255), (int) (color * 255), 255); + // c = color ("color vertical horizontal") + // t = top + // r = right + // l = left + // m = middle (horizontal) + // c = center (vertical) + public static void draw(double x, double y, double halfSize, double ctl, double ctr, double cbl, double cbr, double var, double s) { + var color = (ctl+ctr+cbl+cbr) / 4; + if (halfSize < 1/512.) { + var clamped = Math.clamp(color, 0, 1); + StdDraw.setPenColor((int) (clamped * 255), (int) (clamped * 255), 255); StdDraw.filledRectangle(x, y, halfSize, halfSize); return; } - var newColor = Math.clamp(StdRandom.gaussian(color, Math.sqrt(var)), 0, 1); + var newColor = StdRandom.gaussian(color, Math.sqrt(var)); var newVar = var / s; var newHalfSize = halfSize / 2; - int[][] offsets = { { 1, 1 }, { -1, 1 }, { -1, -1 }, { 1, -1 } }; - for (var offset : offsets) { - draw(x + newHalfSize * offset[0], y + newHalfSize * offset[1], newHalfSize, newColor, newVar, s); - } + + var ctm = (ctl + ctr) / 2; + var cbm = (cbl + cbr) / 2; + var ccl = (cbl + ctl) / 2; + var ccr = (cbr + ctr) / 2; + + // tl + draw(x - newHalfSize, y - newHalfSize, newHalfSize, ctl, ctm, ccl, newColor, newVar, s); + // tr + draw(x + newHalfSize, y - newHalfSize, newHalfSize, ctm, ctr, newColor, ccr, newVar, s); + // bl + draw(x - newHalfSize, y + newHalfSize, newHalfSize, ccl, newColor, cbl, cbm, newVar, s); + // br + draw(x + newHalfSize, y + newHalfSize, newHalfSize, newColor, ccr, cbm, cbr, newVar, s); } }