-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFractal.java
136 lines (114 loc) · 3.91 KB
/
Fractal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import java.awt.*;
import java.awt.event.KeyEvent;
/**
* Abstract class for Fractals. Contains info about zoom, pan,
* and fractal settings.
*/
public abstract class Fractal {
private final FractalType mType;
private FractalSetting[] mFractalSettings;
private FractalListener mListener;
private double mZoom = 0.75;
private int mPanX = 0;
private int mPanY = 0;
Fractal(FractalType type) {
mType = type;
}
void zoom(double amount) {
if (mZoom + amount / 10 > 0) {
amount /= 10;
mZoom += amount;
invalidate();
}
}
void pan(int panX, int panY) {
mPanX = panX;
mPanY = panY;
invalidate();
}
double getZoom() {
return mZoom;
}
int getPanX() {
return mPanX;
}
int getPanY() {
return mPanY;
}
FractalSetting[] getFractalSettings() {
if (mFractalSettings == null) {
mFractalSettings = buildFractalSettings();
}
return mFractalSettings;
}
FractalType getFractalType() {
return mType;
}
// A listener is bound to the Fractal so it knows when to redraw the Fractal
void setFractalListener(FractalListener listener) {
mListener = listener;
}
// Helper function for letting a listener know the Fractal needs to be redrawn
void invalidate() {
if (mListener != null) {
mListener.onFractalInvalidated();
}
}
abstract void draw(Graphics g, int width, int height);
abstract FractalSetting[] buildFractalSettings();
interface FractalListener {
void onFractalInvalidated();
}
// Constants containing the names of the FractalTypes
private static final String FRACTAL_TYPE_KOCH = "Koch snowflake";
private static final String FRACTAL_TYPE_SIERPINSKI = "Sierpinski carpet";
private static final String FRACTAL_TYPE_MANDELBROT = "Mandelbrot set";
private static final String FRACTAL_TYPE_JULIA = "Julia set";
// The below functions are used for serialization
// Get a Fractal object by FractalType.
static Fractal getFractal(FractalType type) {
switch (type) {
case Koch: return new FractalKoch();
case Sierpinski: return new FractalSierpinski();
case Mandelbrot: return new FractalMandelbrot();
case Julia: return new FractalJulia();
default: return null;
}
}
// Get a FractalType's name by FractalType
static String getFractalTypeName(FractalType type) {
switch (type) {
case Koch: return FRACTAL_TYPE_KOCH;
case Sierpinski: return FRACTAL_TYPE_SIERPINSKI;
case Mandelbrot: return FRACTAL_TYPE_MANDELBROT;
case Julia: return FRACTAL_TYPE_JULIA;
default: return null;
}
}
// Get a FractalType's mnemonic key code by FractalType
static int getFractalTypeMnemonic(FractalType type) {
switch (type) {
case Koch: return KeyEvent.VK_K;
case Sierpinski: return KeyEvent.VK_S;
case Mandelbrot: return KeyEvent.VK_M;
case Julia: return KeyEvent.VK_J;
default: return -1;
}
}
// Get a FractalType by its name
static FractalType getFractalType(String name) {
if (name.equals(FRACTAL_TYPE_KOCH)) {
return FractalType.Koch;
} else if (name.equals(FRACTAL_TYPE_SIERPINSKI)) {
return FractalType.Sierpinski;
} else if (name.equals(FRACTAL_TYPE_MANDELBROT)) {
return FractalType.Mandelbrot;
} else if (name.equals(FRACTAL_TYPE_JULIA)) {
return FractalType.Julia;
}
return null;
}
enum FractalType {
Koch, Sierpinski, Mandelbrot, Julia
}
}