# Julia Sets

## Background

Remember that a complex number is one that has a real part and an imaginary part, typically written in the form a + b*i, where a is the real part and b is the imaginary part.

Now let's look at a two-dimensional coordinate system, where real numbers (a) are along the x-axis and imaginary numbers (b) are along the y-axis. Thus, every point in this plane is a complex number with an x-value of a and a y-value of b.

Let's say that both the x and y-axes go from -2 to 2.

Okay, now let's take this coordinate system and make it a matrix. Basically, we are creating bins at a desired resolution to capture the two-dimensional coordinate system we just discussed. For example, if we set our binsize to be 1 (or our resolution to be 5), we'd get the matrix pictured to the right.

From a practical perspective, we'll want a much greater resolution, say 500, for computing Julia Sets.

The basic Julia Set works like this: for each point in the matrix we just defined, you take the entry, square it, and add some complex number C. You repeat this process of squaring and adding C for a given number of iterations. Here, C can be any complex number (a + b*i), where a and b vary between –1 and 1.

After each iteration, you essentially ask if the value diverges (simplistically, if the value is >10 or something like that). If it does, you note the index at which the divergence happened in an output matrix. After you finish iterating, you can view the output matrix as a heatmap. It turns out that simply varying the value of C is sufficient to create a huge array of interesting designs!

## Code

function juliaSet(r,w,inc)

% Draws a julia set with iterations r and resolution w. Inc determines

% the factor c you add to the julia set at each iteration. repeatColors

% should be set to 1 if you want the colors to cycle back through black

% partway through the drawing

% Create the real and imaginary parts of each number in a temporary

% variable

temp=zeros(w,w,2);

for i=1:w

temp(i,:,1)=linspace(-2,2,w);

temp(:,i,2)=linspace(-1.5,1.5,w);

end

% Set the initial values based on their real and imaginary components

values=zeros(w,w);

for i=1:w

for j=1:w

values(i,j)=temp(i,j,1)+1i*temp(i,j,2);

end

end

% Initialize the output

output=zeros(w,w);

% For each iteration, cycle through data and perform the desired

% computatation

for i=1:r

for m=1:w

for k=1:w

values(m,k)=(values(m,k))^2+inc;

% Essentially, set output(m,k) equal to the current

% iteration if the series diverges

if abs(values(m,k))>10 && output(m,k)==0

output(m,k)=i;

end

end

end

if i==r

for m=1:w

for k=1:w

if output(m,k)==0

output(m,k)=i;

end

end

end

end

end

% Create the figure

figure('Position',[50,50,750,500],'Color',[1,1,1]);

imagesc(output(:,:));

colormap('hot');

axis off

end

## Examples

In the examples shown below, the animated gif shows the heatmap of divergence for a number of different iterations.

c = −0.8i

c = 0.285 + 0.01i

c = −0.835 − 0.2321i

## Other options

You can also do operations other than squaring the entry with each iteration! Here are some examples of other operations.

values(m,k) = cos((values(m,k))^2)+(inc) c = −0.8i

values(m,k) = sin((values(m,k))^2)+(inc) c = −0.8i

values(m,k)=sin((values(m,k))^6)+(inc); c = −0.8i