// Reflections inside Descartes' Folium. // It should be ergodic but appears not to be. import java.awt.*; import java.awt.image.*; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; class Main { static double c = 0; static final int X = 750, Y = X; static final double xm = X, e = 1.8; static double p(double x, double y){return x*x*x+y*y*y-e*x*y;} static double fx(double x, double y){return 3*x*x-e*y;} static double fy(double x, double y){return 3*y*y-e*x;} static BufferedImage I = new BufferedImage(X, Y, BufferedImage.TYPE_INT_RGB); static Graphics g = I.getGraphics(); static WritableRaster wr = I.getRaster(); static void dr(double x, double y, double xe, double ye){ g.drawLine((int)(x*xm), Y-1-(int)(y*xm), (int)(xe*xm), Y-1-(int)(ye*xm));}; static class MainCanvas extends Canvas { public void paint(Graphics g){g.drawImage(Main.I, 0, 0, Color.red, null);}} static public void main( String[] args ){ Frame f = new Frame("Ergodic Folium"); Canvas can = new MainCanvas(); f.add(can, "Center"); f.setSize(new Dimension(X, Y)); double x = 0.16, y = 0.5, xd = 1, yd = -0.3; c = p(x, y); f.setVisible(true); try {int[] mk = new int[] {255, 255, 255}; for(int i = 0; i c) wr.setPixel(i, Y-1-j, mk);} catch (ArrayIndexOutOfBoundsException d) {System.out.println("zarg");} g.setColor(new Color((float)0.9, (float)0.5, (float)0.8)); for (int q = 0; q<300; ++q) {double a = xd*xd*xd + yd*yd*yd, b = 3*(x*xd*xd + y*yd*yd) - e*xd*yd, z = (-b + Math.sqrt(b*b - 4*a*(3*(x*x*xd + y*y*yd) - e*(x*yd + y*xd))))/(2*a); double nx = x+z*xd, ny = y+z*yd; dr(x, y, nx, ny); x = nx; y = ny; double px = fx(x, y), py = fy(x, y), r = 2*(xd*px + yd*py)/(px*px+py*py); xd -= r*px; yd -= r*py; System.out.println("z = "+ z + ", p = " + (p(x, y) - c) + ", px = "+px+", py = "+py);} for(int q=0; q < args.length; ++q) {int z = args[q].lastIndexOf('.'); if (z > 0) try {ImageIO.write(I, args[q].substring(z+1), new File(args[q]));} catch (IOException e) {System.err.println("image not saved.");}} }} /* p(z) = p(x+z*xd, y+z*yd) = p(x, y) + 3*z*(x^2*xd + y^2*yd) + 3*z^2*(x*xd^2 + y*yd^2) + z^3*(xd^3 + yd^3) - e*(x*yd*z + xd*y*z + xd*yd*z^2) = z*((xd^3 + yd*3)*z^2 + (3*(x*xd^2 + y*yd^2) - e*xd*yd)*z + 3*(x^2*xd + y^2*yd) - e*(x*yd + xd*y)) a = (xd^3 + yd*3) b = 3*(x*xd^2 + y*yd^2) - e*xd*yd z = (-b +- sqrt(b^2 - 4*a*(3*(x^2*xd + y^2*yd) - e*(x*yd + xd*y))))/(2*a) */ /* zd -= 2*(zd.n)n/(|n|^2) */