Advertisement
Guest User

Fractals part 3

a guest
Sep 7th, 2014
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.93 KB | None | 0 0
  1. import java.awt.image.BufferedImage;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.regex.Pattern;
  5.  
  6. import javax.imageio.ImageIO;
  7.  
  8. public class Fractal {
  9.    
  10.     public static int n;
  11.     public static BufferedImage fractal;
  12.     public static Pattern p;
  13.     public static int threadNumber;
  14.     private static int returnedThreads = 0;
  15.     private static long t = System.nanoTime();
  16.     public static int[] rgbArray;
  17.    
  18.     public static void main(String[] args) throws IOException {
  19.         n = Integer.parseInt(args[0]);
  20.         p = Pattern.compile(args[1]);
  21.         threadNumber = Integer.parseInt(args[2]);
  22.         rgbArray = new int[n * n];
  23.         int section = (n * n) / threadNumber;
  24.         for (int i = 0; i < threadNumber; i++) {
  25.             Thread thread = new Thread(new FractalThread(n, section * i, section * (i + 1)));
  26.             thread.start();
  27.         }
  28.         fractal = new BufferedImage(n, n, BufferedImage.TYPE_INT_RGB);
  29.     }
  30.    
  31.     public static synchronized void writeImage() throws IOException {
  32.         returnedThreads++;
  33.         if(returnedThreads >= threadNumber) {
  34.             fractal.setRGB(0, 0, n, n, rgbArray, 0, n);
  35.             File f = new File("fractal.png");
  36.             ImageIO.write(fractal, "PNG", f);
  37.             System.out.println("Done in " + (System.nanoTime()-t)/1000000000F + " s");
  38.         }
  39.     }
  40.    
  41. }
  42.  
  43. import java.io.IOException;
  44. import java.util.regex.Matcher;
  45.  
  46.  
  47. public class FractalThread implements Runnable {
  48.    
  49.     private int n;
  50.     private int startingPoint;
  51.     private int endPoint;
  52.  
  53.     public FractalThread(int n, int startingPoint, int endPoint) {
  54.         this.n = n;
  55.         this.startingPoint = startingPoint;
  56.         this.endPoint = endPoint;
  57.     }
  58.    
  59.     @Override
  60.     public void run() {
  61.         int[] privatePixels = new int[endPoint - startingPoint];
  62.         int index = 0;
  63.         for (int i = startingPoint; i < endPoint; i++) {
  64.             String code = getCode(i);
  65.             Matcher m = Fractal.p.matcher(code);
  66.             float percentage;
  67.             int rgb = 0;
  68.             if (m.find()) {
  69.                 String match = m.group(1);
  70.                 percentage = match.length()/(float)code.length();
  71.             } else {
  72.                 percentage = 1;
  73.                 rgb += (255 << 16) + (255 << 8);
  74.             }
  75.             int blue = (int) (255 * percentage);
  76.             rgb += blue;
  77.             privatePixels[index++] = rgb;
  78.             if(i % 100000 == 0) System.gc();
  79.         }
  80.         System.arraycopy(privatePixels, 0, Fractal.rgbArray, startingPoint, endPoint - startingPoint);
  81.         try {
  82.             Fractal.writeImage();
  83.         } catch (IOException e) {
  84.             e.printStackTrace();
  85.         }
  86.     }
  87.    
  88.     public String getCode(int pixel) {
  89.         StringBuilder code = new StringBuilder();
  90.         int currentN = n;
  91.         int x = pixel % currentN;
  92.         int y = pixel / currentN;
  93.         while (currentN > 1) {
  94.             if (y >= currentN >> 1) {
  95.                 if (x >= currentN >> 1) {
  96.                     code.append("4");
  97.                     x -= currentN >> 1;
  98.                     y -= currentN >> 1;
  99.                 } else {
  100.                     code.append("3");
  101.                     y -= currentN >> 1;
  102.                 }
  103.             } else {
  104.                 if (x >= currentN >> 1) {
  105.                     code.append("1");
  106.                     x -= currentN >> 1;
  107.                 } else {
  108.                     code.append("2");
  109.                 }
  110.             }
  111.             currentN = currentN >> 1;
  112.         }
  113.         return code.toString();
  114.     }
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement