Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <complex>
- #include <vector>
- #include <allegro5/allegro.h>
- #include <allegro5/allegro_image.h>
- const int MANDELBROT_RESOLUTION_W = 2000;
- const int MANDELBROT_RESOLUTION_H = 2000;
- const unsigned int ITERATIONS = 100;
- inline float complex_length_squared(const std::complex<float>& cmplx) {
- return cmplx.real()*cmplx.real() + cmplx.imag()*cmplx.imag();
- }
- inline float lin_interpol(float p1, float p2, float rate) {
- return p1 + (p2-p1)*rate;
- }
- int main()
- {
- al_init();
- al_init_image_addon();
- ALLEGRO_BITMAP* bitmap = al_create_bitmap(MANDELBROT_RESOLUTION_W, MANDELBROT_RESOLUTION_H);
- std::vector<std::complex<float>> setCandidates;
- setCandidates.reserve(MANDELBROT_RESOLUTION_W * MANDELBROT_RESOLUTION_H);
- for(int i = 0; i<MANDELBROT_RESOLUTION_W; ++i) {
- for(int j = 0; j<MANDELBROT_RESOLUTION_H; ++j) {
- setCandidates.push_back(std::complex<float>(lin_interpol(-2,2,i/static_cast<float>(MANDELBROT_RESOLUTION_W)),
- lin_interpol(-2,2,j/static_cast<float>(MANDELBROT_RESOLUTION_H))));
- }
- }
- std::vector<std::complex<float>> discriminants(MANDELBROT_RESOLUTION_W*MANDELBROT_RESOLUTION_H,1);
- std::vector<int> escapeChecker(MANDELBROT_RESOLUTION_W * MANDELBROT_RESOLUTION_H, 0);
- for(int currentIteration = 1; currentIteration <= ITERATIONS; ++currentIteration) {
- for(int i = 0; i< MANDELBROT_RESOLUTION_W; ++i) {
- for(int j=0; j<MANDELBROT_RESOLUTION_H; ++j) {
- if(escapeChecker[i]) continue;
- discriminants[i*MANDELBROT_RESOLUTION_H+j] *= discriminants[i*MANDELBROT_RESOLUTION_H+j];
- discriminants[i*MANDELBROT_RESOLUTION_H+j] += setCandidates[i*MANDELBROT_RESOLUTION_H+j];
- float length = complex_length_squared(discriminants[i*MANDELBROT_RESOLUTION_H+j]);
- if(length > 2) {
- escapeChecker[i*MANDELBROT_RESOLUTION_H+j] = currentIteration;
- }
- }
- }
- }
- al_set_target_bitmap(bitmap);
- al_clear_to_color(al_map_rgb(0,0,0));
- for(int i=0; i<MANDELBROT_RESOLUTION_W; ++i) {
- for(int j=0; j<MANDELBROT_RESOLUTION_H; ++j) {
- int escaped = escapeChecker[i*MANDELBROT_RESOLUTION_H+j];
- if(escaped) {
- float rate = static_cast<float>(escaped)/ITERATIONS;
- al_draw_pixel(i,j,al_map_rgb(static_cast<unsigned char>(lin_interpol(0,255,rate)),
- 0,
- static_cast<unsigned char>(lin_interpol(255,0,rate))));
- }
- }
- }
- al_save_bitmap("mandelbrot.png",bitmap);
- al_destroy_bitmap(bitmap);
- }
Advertisement
Add Comment
Please, Sign In to add comment