42's project, zoom on fractal
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long. Fabien Stadelwieser 6413bf107f 10 months ago
10 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
10 months ago
2 years ago

# Fractol

Display infinitely zoomable fractal.

Implemented :

``````./fractol [mandelbrot julia burning-ship sierpinski mandelrot]
`````` ## Showcase

### Mandelbrot #### Zoomed in #### Zoomed out ### Julia #### Julia with another parameter (can be modified using the mouse) #### Julia zoomed in ### Burning-ship #### Burning-ship zoomed in ## Install

One of the requirement of this project was to use 42l's minilibX which only run easily on the school's mac.

Could be done on Linux but you're on your own.

So make sure you have :

• MacOS
• 42's MinilibX

Then :

``````git clone ssh://git@git.42l.fr:42084/Fabien/fractol.git
cd fractol
make
``````

## How it's done

For each fractal the goal is to get a number of iteration in a given point of a graph.

So for this you loop over each pixel of the screen, and for each pixel you

call your drawing function, `draw_mandelbrot` in this case. For Mandelbrot, Julia and Burning-ship:

• The first thing you do is convert the `(t_vec2)` coordinate of the pixel into an imaginary number `(t_reel)` (`x` is the real part `r`, `y` is the imaginary `i`)
• Adjust for the zoom and the offset
• Iterate until the "normal" of the imaginary number is not above 2. By Pythagoras' theorem -> (`nb.r * nb.r + nb.i * nb.i < 4`)
• For each iteration apply a different operation depending on the fractal
• Colorize the pixel depending on the number of iteration result
``````#include "fractol.h"

uint32_t	draw_mandelbrot(t_fractol *fractol, t_vec2 pos)
{
t_reel		base_point;
t_reel		z;
uint32_t	iter;
double		tmp;

base_point = (t_reel){
.r = pos.x
/ (fractol->mlx.win_size.x / fractol->fract->size.x)
+ fractol->fract->pos.x,
.i = pos.y
/ (fractol->mlx.win_size.y / fractol->fract->size.y)
+ fractol->fract->pos.y
};
z = base_point;
iter = 0;
while (z.r * z.r + z.i * z.i < 4 && iter < fractol->fract->iter_num)
{
tmp = z.r;
z.r = z.r * z.r - z.i * z.i + base_point.r;
z.i = 2 * z.i * tmp + base_point.i;
iter++;
}
return (iter);
}
``````

## Credit

Student project for School 42.

Realized in about a weekend by myself.