Barnsley fern: Difference between revisions
Content added Content deleted
(→{{headerJava}}: added Java) |
m (some changes) |
||
Line 28: | Line 28: | ||
{{works with|Java|8}} |
{{works with|Java|8}} |
||
<lang java>import java.awt.*; |
<lang java>import java.awt.*; |
||
import java.util.ArrayList; |
|||
import javax.swing.*; |
import javax.swing.*; |
||
public class BarnsleyFern extends JPanel { |
public class BarnsleyFern extends JPanel { |
||
ArrayList<Point> points = new ArrayList<>(); |
|||
public BarnsleyFern() { |
public BarnsleyFern() { |
||
final int dim = 640; |
|||
setPreferredSize(dim); |
setPreferredSize(new Dimension(dim, dim)); |
||
setBackground(Color.white); |
setBackground(Color.white); |
||
setForeground(Color.green.darker()); |
setForeground(Color.green.darker()); |
||
createFern(dim, dim); |
|||
} |
} |
||
void |
void createFern(int w, int h) { |
||
double w = getWidth(); |
|||
double h = getHeight(); |
|||
double x = 0; |
double x = 0; |
||
double y = 0; |
double y = 0; |
||
Line 50: | Line 52: | ||
if (r <= 0.01) { |
if (r <= 0.01) { |
||
tmpx = 0; |
tmpx = 0; |
||
tmpy = 0.16 * y; |
tmpy = 0.16 * y; |
||
} else if (r <= 0.08) { |
} else if (r <= 0.08) { |
||
tmpx = 0.2 * x - 0.26 * y; |
tmpx = 0.2 * x - 0.26 * y; |
||
tmpy = 0.23 * x + 0.22 * y + 1.6; |
tmpy = 0.23 * x + 0.22 * y + 1.6; |
||
} else if (r <= 0.15) { |
} else if (r <= 0.15) { |
||
tmpx = -0.15 * x + 0.28 * y; |
tmpx = -0.15 * x + 0.28 * y; |
||
tmpy = 0.26 * x + 0.24 * y + 0.44; |
tmpy = 0.26 * x + 0.24 * y + 0.44; |
||
} else { |
} else { |
||
tmpx = 0.85 * x + 0.04 * y; |
tmpx = 0.85 * x + 0.04 * y; |
||
tmpy = -0.04 * x + 0.85 * y + 1.6; |
tmpy = -0.04 * x + 0.85 * y + 1.6; |
||
} |
} |
||
x = tmpx; |
x = tmpx; |
||
y = tmpy; |
y = tmpy; |
||
points.add(new Point((int) Math.round(w / 2 + x * 60), |
|||
(int) Math.round(h - y * 60) |
(int) Math.round(h - y * 60))); |
||
} |
|||
} |
|||
void drawFern(Graphics2D g) { |
|||
for (Point p : points) { |
|||
g.fillOval(p.x, p.y, 1, 1); |
|||
} |
} |
||
} |
} |
Revision as of 16:47, 1 March 2016
Barnsley fern is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
A Barnsley fern is a fractal named after British mathematician Michael Barnsley and can be created using an iterated function system (IFS).
The task: create this fractal fern, using the following transformations:
- ƒ1 (chosen 1% of the time)
xn + 1 = 0 yn + 1 = 0.16 yn
- ƒ2 (chosen 85% of the time)
xn + 1 = 0.85 xn + 0.04 yn yn + 1 = −0.04 xn + 0.85 yn + 1.6
- ƒ3 (chosen 7% of the time)
xn + 1 = 0.2 xn − 0.26 yn yn + 1 = 0.23 xn + 0.22 yn + 1.6
- ƒ4 (chosen 7% of the time)
xn + 1 = −0.15 xn + 0.28 yn yn + 1 = 0.26 xn + 0.24 yn + 0.44.
Starting position: x = 0, y = 0
<lang java>import java.awt.*; import java.util.ArrayList; import javax.swing.*;
public class BarnsleyFern extends JPanel {
ArrayList<Point> points = new ArrayList<>();
public BarnsleyFern() { final int dim = 640; setPreferredSize(new Dimension(dim, dim)); setBackground(Color.white); setForeground(Color.green.darker()); createFern(dim, dim); }
void createFern(int w, int h) { double x = 0; double y = 0;
for (int i = 0; i < 200_000; i++) { double tmpx, tmpy; double r = Math.random();
if (r <= 0.01) { tmpx = 0; tmpy = 0.16 * y; } else if (r <= 0.08) { tmpx = 0.2 * x - 0.26 * y; tmpy = 0.23 * x + 0.22 * y + 1.6; } else if (r <= 0.15) { tmpx = -0.15 * x + 0.28 * y; tmpy = 0.26 * x + 0.24 * y + 0.44; } else { tmpx = 0.85 * x + 0.04 * y; tmpy = -0.04 * x + 0.85 * y + 1.6; } x = tmpx; y = tmpy;
points.add(new Point((int) Math.round(w / 2 + x * 60), (int) Math.round(h - y * 60))); } }
void drawFern(Graphics2D g) { for (Point p : points) { g.fillOval(p.x, p.y, 1, 1); } }
@Override public void paintComponent(Graphics gg) { super.paintComponent(gg); Graphics2D g = (Graphics2D) gg; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
drawFern(g); }
public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle("Barnsley Fern"); f.setResizable(false); f.add(new BarnsleyFern(), BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); }); }
}</lang>