-
Notifications
You must be signed in to change notification settings - Fork 1
/
fractals.cpp
169 lines (151 loc) · 6.05 KB
/
fractals.cpp
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
* File: fractals.cpp
* --------------------------
* Name: Sarthak Tandon
* Section leader: Norah Borus
* This file contains fractal problems for CS106B.
*/
#include "fractals.h"
#include "fractalgui.h"
#include <cmath>
#include "gwindow.h"
using namespace std;
const int LEAF_COLOR = 0x2e8b57; /* Color of all leaves of recursive tree (level 1) */
const int BRANCH_COLOR = 0x8b7765; /* Color of all branches of recursive tree (level >=2) */
/**
* Draws a Sierpinski triangle of the specified size and order, placing its
* top-left corner at position (x, y).
*
* This will be called by fractalgui.cpp.
*
* @param gw - The window in which to draw the Sierpinski triangle.
* @param x - The x coordinate of the top-left corner of the triangle.
* @param y - The y coordinate of the top-left corner of the triangle.
* @param size - The length of one side of the triangle.
* @param order - The order of the fractal.
*/
void drawSierpinskiTriangle(GWindow& gw, double x, double y, double size, int order) {
if (order>0){
if(order==1){
pause(0.1);
gw.drawLine(x, y, x+size, y);
gw.drawLine(x + size, y, x+size/2, y+ size*sqrt(3)/2 );
gw.drawLine(x+size/2, y+ size*sqrt(3)/2 , x, y);
}
else {
drawSierpinskiTriangle(gw, x, y, size/2, order-1);
drawSierpinskiTriangle(gw, x+size/2, y, size/2, order-1);
drawSierpinskiTriangle(gw, x+size/4, y+(size/2)*sqrt(3)/2, size/2, order-1);
}
}
}
/**
* Draws a recursive tree fractal image of the specified size and order,
* placing the bounding box's top-left corner at position (x,y).
*
* This will be called by fractalgui.cpp.
*
* @param gw - The window in which to draw the recursive tree.
* @param x - The x coordinate of the top-left corner of the bounding box.
* @param y - The y coordinate of the top-left corner of the bounding box.
* @param size - The length of one side of the bounding box.
* @param order - The order of the fractal.
*/
void drawTree(GWindow& gw, double x, double y, double size, int order) {
// TODO: write this function
}
/**
* Draws a Mandelbrot Set in the graphical window give, with maxIterations
* (size in GUI) and in a given color (zero for palette)
*
* This will be called by fractalgui.cpp.
*
* @param gw - The window in which to draw the Mandelbrot set.
* @param minX - left-most column of grid
* @param incX - increment value of columns of grid
* @param minY - top-most row of grid
* @param incY - increment value of rows of grid
* @param maxIterations - The maximum number of iterations to run recursive step
* @param color - The color of the fractal; zero if palette is to be used
*/
void mandelbrotSet(GWindow& gw, double minX, double incX,
double minY, double incY, int maxIterations, int color) {
// Creates palette of colors
// To use palette:
// pixels[r][c] = palette[numIterations % palette.size()];
Vector<int> palette = setPalette();
int width = gw.getCanvasWidth();
int height = gw.getCanvasHeight();
GBufferedImage image(width,height,0xffffff);
gw.add(&image);
Grid<int> pixels = image.toGrid(); // Convert image to grid
for (int c = 0; c<pixels.width(); c++){
for(int r = 0; r<pixels.height(); r++){
Complex coord = Complex(minX + c*incX, minY + r*incY);
int numIterations = mandelbrotSetIterations(coord, maxIterations);
if(numIterations == maxIterations){
pixels[r][c] = (color==0) ? palette[numIterations % palette.size()] : color;
} else{
if (color == 0){
pixels[r][c] = palette[numIterations % palette.size()];
}
}
}
}
image.fromGrid(pixels); // Converts and puts the grid back into the image
}
/**
* Runs the Mandelbrot Set recursive formula on complex number c a maximum
* of maxIterations times.
*
* This will be called by you. Think about how this fits with the other two functions.
*
* @param c - Complex number to use for recursive formula.
* @param maxIterations - The maximum number of iterations to run recursive step
* @return number of iterations needed to determine if c is unbounded
*/
int mandelbrotSetIterations(Complex c, int maxIterations) {
Complex startZ = Complex(0.0 , 0.0);
int numIterations = mandelbrotSetIterations(startZ, c, maxIterations);
return numIterations;
}
/**
* An iteration of the Mandelbrot Set recursive formula with given values z and c, to
* run for a maximum of maxIterations.
*
* This will be called by you. Think about how this fits with the other two functions.
*
* @param z - Complex number for a given number of iterations
* @param c - Complex number to use for recursive formula.
* @param remainingIterations - The remaining number of iterations to run recursive step
* @return number of iterations needed to determine if c is unbounded
*/
int mandelbrotSetIterations(Complex z, Complex c, int remainingIterations) {
if (remainingIterations <= 0 || z.abs()>4){
return 0;
} else {
z = z*z + c;
return ( 1 + mandelbrotSetIterations(z, c, remainingIterations -1));
}
return 0;
}
// Helper function to set the palette
Vector<int> setPalette() {
Vector<int> colors;
// Feel free to replace with any palette.
// You can find palettes at:
// http://www.colourlovers.com/palettes
// Example palettes:
// http://www.colourlovers.com/palette/4480793/in_the_middle
// string colorSt = "#A0B965,#908F84,#BF3C43,#9D8E70,#C9BE91,#A0B965,#908F84,#BF3C43";
// http://www.colourlovers.com/palette/4480786/Classy_Glass
// string colorSt = "#9AB0E9,#C47624,#25269A,#B72202,#00002E,#9AB0E9,#C47624,#25269A";
// The following is the "Hope" palette:
// http://www.colourlovers.com/palette/524048/Hope
string colorSt = "#04182B,#5A8C8C,#F2D99D,#738585,#AB1111,#04182B,#5A8C8C,#F2D99D";
Vector<string>colorsStrVec = stringSplit(colorSt,",");
for (string color : colorsStrVec) {
colors.add(convertColorToRGB(trim(color)));
}
return colors;
}