SHOW:
|
|
- or go back to the newest paste.
| 1 | import java.awt.*; | |
| 2 | import java.awt.image.*; | |
| 3 | import javax.imageio.*; | |
| 4 | import java.io.*; | |
| 5 | ||
| 6 | /* | |
| 7 | Autore : Marco 'RootkitNeo' | |
| 8 | Descrizione: Classe che si occupa della creazione del frattale | |
| 9 | Dipendenza : http://pastebin.com/jfTDFE8W | |
| 10 | */ | |
| 11 | ||
| 12 | ||
| 13 | class Fractal {
| |
| 14 | // Variabili | |
| 15 | // ----------------------------------------------------------------------------------------------------------- | |
| 16 | private Image img; // Frattale | |
| 17 | private double X0,X1, Y0, Y1, modulo, x, y; // [X0,Y0][X0,Y1] punti luce; modulo: valore temporaneo abs(); x,y valori temporanei pixel immagine | |
| 18 | private int cicli,profondita, width, height; // profondita: dettaglio immagine | |
| 19 | private Complex c1, c2; // Numeri complessi | |
| 20 | // ----------------------------------------------------------------------------------------------------------- | |
| 21 | ||
| 22 | ||
| 23 | Fractal(int width, int height, double X0, double X1, double Y0, double Y1, int profondita) {
| |
| 24 | this.width = width; | |
| 25 | this.height= height; | |
| 26 | this.X0 = X0; | |
| 27 | this.X1 = X1; | |
| 28 | this.Y0 = Y0; | |
| 29 | this.Y1 = Y1; | |
| 30 | this.profondita = profondita; | |
| 31 | ||
| 32 | } | |
| 33 | ||
| 34 | void generaFrattale() {
| |
| 35 | int[] pixels = new int[width*height]; | |
| 36 | int k = 0; | |
| 37 | img = null; | |
| 38 | ||
| 39 | for(int i=0; i<height; i++) {
| |
| 40 | y = Y1 + (((double)i * (Y0-Y1)) / (double)height); | |
| 41 | ||
| 42 | for(int j = 0; j<width; j++) {
| |
| 43 | x = X1 + (((double)j * (X0-X1)) / (double)width); | |
| 44 | ||
| 45 | c1 = new Complex(x,y); | |
| 46 | c2 = c1; | |
| 47 | ||
| 48 | ||
| 49 | for(cicli = 0; cicli < profondita; cicli++) {
| |
| 50 | c1 = c1.somma(c1.prodotto(c1,c1),c2); | |
| 51 | modulo = c1.abs(); | |
| 52 | ||
| 53 | if(modulo > 4.0) break; | |
| 54 | } | |
| 55 | ||
| 56 | if(modulo<=4.0) {
| |
| 57 | pixels[k++] = (255 << 24) | 0; | |
| 58 | } else {
| |
| 59 | int r, g, b; | |
| 60 | ||
| 61 | r = (cicli>>2); | |
| 62 | g = (cicli>>1); | |
| 63 | b = 10+(cicli<<2); | |
| 64 | ||
| 65 | r = (r>128) ? 128 : r; | |
| 66 | g = (g>128) ? 128 : g; | |
| 67 | b = (b>255) ? 255 : b; | |
| 68 | ||
| 69 | pixels[k++] = (255 << 24) | (r << 16) | (g << 8) | b; | |
| 70 | ||
| 71 | } | |
| 72 | } | |
| 73 | } | |
| 74 | ||
| 75 | try {
| |
| 76 | Toolkit tk = Toolkit.getDefaultToolkit(); | |
| 77 | img = tk.createImage(new MemoryImageSource(width, height,pixels,0,width)); | |
| 78 | } catch(Exception e) {
| |
| 79 | e.printStackTrace(); | |
| 80 | } | |
| 81 | } | |
| 82 | ||
| 83 | ||
| 84 | void salvaImmagine(String name) {
| |
| 85 | if(img == null) return; | |
| 86 | BufferedImage b = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); | |
| 87 | Graphics g = b.getGraphics(); | |
| 88 | ||
| 89 | try {
| |
| 90 | g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null); | |
| 91 | ||
| 92 | ImageIO.write(b,"PNG",new File(name+".png")); | |
| 93 | } catch(Exception e) {e.printStackTrace();}
| |
| 94 | } | |
| 95 | ||
| 96 | ||
| 97 | Image getImage() {
| |
| 98 | return img; | |
| 99 | } | |
| 100 | } |