From 373594a68ea46eb866e9ce6a12de075c56eb1310 Mon Sep 17 00:00:00 2001 From: angeluriot <46031994+angeluriot@users.noreply.github.com> Date: Fri, 3 Jan 2020 14:36:32 +0100 Subject: [PATCH 1/7] Code source --- Fractal_generator.cpp | 237 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 Fractal_generator.cpp diff --git a/Fractal_generator.cpp b/Fractal_generator.cpp new file mode 100644 index 0000000..dea5a11 --- /dev/null +++ b/Fractal_generator.cpp @@ -0,0 +1,237 @@ +#include +#include +#include +#include +#include +#include + + + +// ---------- Affichage ---------- + + + +HWND myconsole = GetConsoleWindow(); +HDC mydc = GetDC(myconsole); + +int window_size; // Taille de l'affichage + +int Gap_x = 200; // Décalage en X +int Gap_y = 100; // Décalage en Y + +double color_constant = 7.; // Constante permettant d'améliorer les couleurs + +double sequence_max = 10.; // Le calcul de la suite s'arrête quand elle atteint cette valeur + + + +// Affiche un pixel aux coordonnées voulues + +void set_point(int x, int y, COLORREF color) +{ + x = Gap_x + x; + y = Gap_y + window_size - y; + + SetPixel(mydc, x, y, color); +} + + + +// Donne une couleur à partir du temps que prend la suite à diverger + +COLORREF color(int value, int max_value) +{ + value *= color_constant; + + value = int(double((double(value) / double(max_value)) * double(255. * 2.))); + + if (value <= 255) + return RGB(255, 255 - value, 0); + + if (value > 255 and value <= 255 * 2) + return RGB(2 * 255 - value, 0, value - 255); + + return RGB(0, 0, 0); +} + + + +// Trace un contour blanc + +void contour() +{ + for (int i = 0; i < window_size; i++) + { + SetPixel(mydc, i + Gap_x, Gap_y, RGB(255, 255, 255)); + SetPixel(mydc, i + Gap_x, Gap_y + window_size + 1, RGB(255, 255, 255)); + } + + for (int j = 0; j < window_size + 2; j++) + { + SetPixel(mydc, Gap_x - 1, j + Gap_y, RGB(255, 255, 255)); + SetPixel(mydc, Gap_x + window_size, j + Gap_y, RGB(255, 255, 255)); + } +} + + + +// ---------- Génération de la forme fractale ---------- + + + +enum Fractale_type {Julia, Mandelbrot}; // Type de fractale + + + +// Création d'une classe définissant un nombre complexe + +class Complex +{ +public : + + double a; + double b; + + Complex(double a, double b) + { + this->a = a; + this->b = b; + } + + Complex() + { + a = 0; + b = 0; + } + + void operator=(Complex z) + { + a = z.a; + b = z.b; + } + + double modulus() // Module du nombre complexe + { + return sqrt(a * a + b * b); + } +}; + +Complex operator*(Complex z_1, Complex z_2) // Multiplication +{ + Complex z_3; + + z_3.a = z_1.a * z_2.a - z_1.b * z_2.b; + z_3.b = z_1.a * z_2.b + z_1.b * z_2.a; + + return z_3; +} + +Complex operator+(Complex z_1, Complex z_2) // Addition +{ + Complex z_3; + + z_3.a = z_1.a + z_2.a; + z_3.b = z_1.b + z_2.b; + + return z_3; +} + + + +// Calcul la suite d'équation z = z² + c et renvoie le nombre d'itérations pour atteindre "sequence_max" + +int Sequence(Complex z, Complex c, int iteration_nb) +{ + Complex temp; + + for (int i = 0; i < iteration_nb; i++) + { + z = z * z + c; // L'équation + + if (z.modulus() > sequence_max) + return i; + } + + return iteration_nb; +} + + + +// Affiche l'image en entier de la forme fractale + +void show_image(double p_x, double p_y, double zoom, int iteration_nb, Fractale_type fractale_type, Complex c = Complex(0, 0)) +{ + double x = p_x - zoom / 2; + double y = p_y - zoom / 2; + double x_pas = zoom / double(window_size); + double y_pas = zoom / double(window_size); + + for (int i = 0; i < window_size; i++) + { + x = p_x - zoom / 2; + y += y_pas; + + for (int j = 0; j < window_size; j++) + { + x += x_pas; + + int s; + + if (fractale_type == Julia) + { + Complex z = Complex(x, y); + s = Sequence(z, c, iteration_nb); + } + + else + { + Complex c = Complex(x, y); + s = Sequence(Complex(0, 0), c, iteration_nb); + } + + if (s != iteration_nb) + set_point(j, i, color(s, iteration_nb)); + } + } +} + + + +// ---------- Le main ---------- + + + +int main() +{ + // ---------- Choix de l'utilisateur ---------- + + + + window_size = 800; + color_constant = 7.; + + double x = -0.75; + double y = 0.; + + double graph_size = 3.; + int iteration_nb = 250; + + Fractale_type fractale_type = Mandelbrot; + Complex c = Complex(-0.55, 0.55); + + + + // ---------- Lancement du programme ---------- + + + + MoveWindow(myconsole, 0, 0, 1920, 1080, TRUE); + Sleep(100); + contour(); + show_image(x, y, graph_size, iteration_nb, fractale_type, c); + + std::cout << "finished"; + + while (1) + {} +} \ No newline at end of file From ae7759728d1649c2e02f3e0129f4422b8f3713d7 Mon Sep 17 00:00:00 2001 From: angeluriot <46031994+angeluriot@users.noreply.github.com> Date: Fri, 3 Jan 2020 14:36:48 +0100 Subject: [PATCH 2/7] =?UTF-8?q?Ex=C3=A9cutable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Fractal_generator.exe | Bin 0 -> 49520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Fractal_generator.exe diff --git a/Fractal_generator.exe b/Fractal_generator.exe new file mode 100644 index 0000000000000000000000000000000000000000..8e334edbe82a640fada2b71c6a7eb54bc3814884 GIT binary patch literal 49520 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 Date: Fri, 3 Jan 2020 14:39:14 +0100 Subject: [PATCH 3/7] README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..71b3535 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Fractal_generator + +[**Fractal_generator.cpp**](https://github.com/angeluriot/Fractal_generator/blob/master/Fractal_generator.cpp) contient le code source en C++ du projet. + +[**Fractal_generator.exe**](https://github.com/angeluriot/Fractal_generator/blob/master/Fractal_generator.exe) contient un exécutable du programme. *(Attention, il est possible que le programme soit bloqué par Windows, cliquez alors sur* ***"Informations complémentaires"*** *puis sur* ***"Exécuter quand même"****)* From 41b68500a7ca2257177e3ec75c2a0fcb73bb65ac Mon Sep 17 00:00:00 2001 From: Angel Uriot <46031994+angeluriot@users.noreply.github.com> Date: Fri, 3 Jan 2020 21:53:41 +0100 Subject: [PATCH 4/7] Code source --- Fractal_generator.cpp | 95 ++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/Fractal_generator.cpp b/Fractal_generator.cpp index dea5a11..aba6b1e 100644 --- a/Fractal_generator.cpp +++ b/Fractal_generator.cpp @@ -16,30 +16,27 @@ HDC mydc = GetDC(myconsole); int window_size; // Taille de l'affichage -int Gap_x = 200; // Décalage en X -int Gap_y = 100; // Décalage en Y +int Gap_x = 200; // Décalage en X +int Gap_y = 100; // Décalage en Y -double color_constant = 7.; // Constante permettant d'améliorer les couleurs +double color_constant = 7.; // Constante permettant d'améliorer les couleurs -double sequence_max = 10.; // Le calcul de la suite s'arrête quand elle atteint cette valeur +double sequence_max = 10.; // Le calcul de la suite s'arrête quand elle atteint cette valeur -// Affiche un pixel aux coordonnées voulues +// Affiche un pixel aux coordonnées voulues -void set_point(int x, int y, COLORREF color) +void set_point(const int &x, const int &y, const COLORREF &color) { - x = Gap_x + x; - y = Gap_y + window_size - y; - - SetPixel(mydc, x, y, color); + SetPixel(mydc, Gap_x + x, Gap_y + window_size - y, color); } -// Donne une couleur à partir du temps que prend la suite à diverger +// Donne une couleur à partir du temps que prend la suite à diverger -COLORREF color(int value, int max_value) +COLORREF color(int value, const int &max_value) { value *= color_constant; @@ -75,7 +72,7 @@ void contour() -// ---------- Génération de la forme fractale ---------- +// ---------- Génération de la forme fractale ---------- @@ -83,7 +80,7 @@ enum Fractale_type {Julia, Mandelbrot}; // Type de fractale -// Création d'une classe définissant un nombre complexe +// Création d'une classe définissant un nombre complexe class Complex { @@ -91,12 +88,6 @@ public : double a; double b; - - Complex(double a, double b) - { - this->a = a; - this->b = b; - } Complex() { @@ -104,7 +95,19 @@ public : b = 0; } - void operator=(Complex z) + Complex(const Complex &z) + { + a = z.a; + b = z.b; + } + + Complex(const double& a, const double& b) + { + this->a = a; + this->b = b; + } + + void operator=(const Complex &z) { a = z.a; b = z.b; @@ -116,37 +119,25 @@ public : } }; -Complex operator*(Complex z_1, Complex z_2) // Multiplication +Complex operator+(const Complex &z_1, const Complex &z_2) // Addition { - Complex z_3; - - z_3.a = z_1.a * z_2.a - z_1.b * z_2.b; - z_3.b = z_1.a * z_2.b + z_1.b * z_2.a; - - return z_3; + return Complex(z_1.a + z_2.a, z_1.b + z_2.b); } -Complex operator+(Complex z_1, Complex z_2) // Addition +Complex operator*(const Complex& z_1, const Complex& z_2) // Multiplication { - Complex z_3; - - z_3.a = z_1.a + z_2.a; - z_3.b = z_1.b + z_2.b; - - return z_3; + return Complex(z_1.a * z_2.a - z_1.b * z_2.b, z_1.a * z_2.b + z_1.b * z_2.a); } -// Calcul la suite d'équation z = z² + c et renvoie le nombre d'itérations pour atteindre "sequence_max" +// Calcul la suite d'équation z = z² + c et renvoie le nombre d'itérations pour atteindre "sequence_max" -int Sequence(Complex z, Complex c, int iteration_nb) +int sequence(Complex z, const Complex &c, const int &iteration_nb) { - Complex temp; - for (int i = 0; i < iteration_nb; i++) { - z = z * z + c; // L'équation + z = z * z + c; // L'équation if (z.modulus() > sequence_max) return i; @@ -159,38 +150,38 @@ int Sequence(Complex z, Complex c, int iteration_nb) // Affiche l'image en entier de la forme fractale -void show_image(double p_x, double p_y, double zoom, int iteration_nb, Fractale_type fractale_type, Complex c = Complex(0, 0)) +void show_image(const double &p_x, const double &p_y, const double &graph_size, const int &iteration_nb, const Fractale_type &fractale_type, const Complex &c) { - double x = p_x - zoom / 2; - double y = p_y - zoom / 2; - double x_pas = zoom / double(window_size); - double y_pas = zoom / double(window_size); + double x = p_x - graph_size / 2.; + double y = p_y - graph_size / 2.; + double x_pas = graph_size / double(window_size); + double y_pas = graph_size / double(window_size); for (int i = 0; i < window_size; i++) { - x = p_x - zoom / 2; + x = p_x - graph_size / 2; y += y_pas; for (int j = 0; j < window_size; j++) { x += x_pas; - int s; + int sequence_result; if (fractale_type == Julia) { Complex z = Complex(x, y); - s = Sequence(z, c, iteration_nb); + sequence_result = sequence(z, c, iteration_nb); } else { Complex c = Complex(x, y); - s = Sequence(Complex(0, 0), c, iteration_nb); + sequence_result = sequence(Complex(0, 0), c, iteration_nb); } - if (s != iteration_nb) - set_point(j, i, color(s, iteration_nb)); + if (sequence_result != iteration_nb) + set_point(j, i, color(sequence_result, iteration_nb)); } } } @@ -234,4 +225,4 @@ int main() while (1) {} -} \ No newline at end of file +} From 4e3a6eeefd3d0fc2378fa8bdad1192817800587c Mon Sep 17 00:00:00 2001 From: Angel Uriot <46031994+angeluriot@users.noreply.github.com> Date: Tue, 21 Jan 2020 21:16:23 +0100 Subject: [PATCH 5/7] Delete Fractal_generator.exe --- Fractal_generator.exe | Bin 49520 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Fractal_generator.exe diff --git a/Fractal_generator.exe b/Fractal_generator.exe deleted file mode 100644 index 8e334edbe82a640fada2b71c6a7eb54bc3814884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49520 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 Date: Tue, 21 Jan 2020 21:54:27 +0100 Subject: [PATCH 6/7] Delete Fractal_generator.cpp --- Fractal_generator.cpp | 228 ------------------------------------------ 1 file changed, 228 deletions(-) delete mode 100644 Fractal_generator.cpp diff --git a/Fractal_generator.cpp b/Fractal_generator.cpp deleted file mode 100644 index aba6b1e..0000000 --- a/Fractal_generator.cpp +++ /dev/null @@ -1,228 +0,0 @@ -#include -#include -#include -#include -#include -#include - - - -// ---------- Affichage ---------- - - - -HWND myconsole = GetConsoleWindow(); -HDC mydc = GetDC(myconsole); - -int window_size; // Taille de l'affichage - -int Gap_x = 200; // Décalage en X -int Gap_y = 100; // Décalage en Y - -double color_constant = 7.; // Constante permettant d'améliorer les couleurs - -double sequence_max = 10.; // Le calcul de la suite s'arrête quand elle atteint cette valeur - - - -// Affiche un pixel aux coordonnées voulues - -void set_point(const int &x, const int &y, const COLORREF &color) -{ - SetPixel(mydc, Gap_x + x, Gap_y + window_size - y, color); -} - - - -// Donne une couleur à partir du temps que prend la suite à diverger - -COLORREF color(int value, const int &max_value) -{ - value *= color_constant; - - value = int(double((double(value) / double(max_value)) * double(255. * 2.))); - - if (value <= 255) - return RGB(255, 255 - value, 0); - - if (value > 255 and value <= 255 * 2) - return RGB(2 * 255 - value, 0, value - 255); - - return RGB(0, 0, 0); -} - - - -// Trace un contour blanc - -void contour() -{ - for (int i = 0; i < window_size; i++) - { - SetPixel(mydc, i + Gap_x, Gap_y, RGB(255, 255, 255)); - SetPixel(mydc, i + Gap_x, Gap_y + window_size + 1, RGB(255, 255, 255)); - } - - for (int j = 0; j < window_size + 2; j++) - { - SetPixel(mydc, Gap_x - 1, j + Gap_y, RGB(255, 255, 255)); - SetPixel(mydc, Gap_x + window_size, j + Gap_y, RGB(255, 255, 255)); - } -} - - - -// ---------- Génération de la forme fractale ---------- - - - -enum Fractale_type {Julia, Mandelbrot}; // Type de fractale - - - -// Création d'une classe définissant un nombre complexe - -class Complex -{ -public : - - double a; - double b; - - Complex() - { - a = 0; - b = 0; - } - - Complex(const Complex &z) - { - a = z.a; - b = z.b; - } - - Complex(const double& a, const double& b) - { - this->a = a; - this->b = b; - } - - void operator=(const Complex &z) - { - a = z.a; - b = z.b; - } - - double modulus() // Module du nombre complexe - { - return sqrt(a * a + b * b); - } -}; - -Complex operator+(const Complex &z_1, const Complex &z_2) // Addition -{ - return Complex(z_1.a + z_2.a, z_1.b + z_2.b); -} - -Complex operator*(const Complex& z_1, const Complex& z_2) // Multiplication -{ - return Complex(z_1.a * z_2.a - z_1.b * z_2.b, z_1.a * z_2.b + z_1.b * z_2.a); -} - - - -// Calcul la suite d'équation z = z² + c et renvoie le nombre d'itérations pour atteindre "sequence_max" - -int sequence(Complex z, const Complex &c, const int &iteration_nb) -{ - for (int i = 0; i < iteration_nb; i++) - { - z = z * z + c; // L'équation - - if (z.modulus() > sequence_max) - return i; - } - - return iteration_nb; -} - - - -// Affiche l'image en entier de la forme fractale - -void show_image(const double &p_x, const double &p_y, const double &graph_size, const int &iteration_nb, const Fractale_type &fractale_type, const Complex &c) -{ - double x = p_x - graph_size / 2.; - double y = p_y - graph_size / 2.; - double x_pas = graph_size / double(window_size); - double y_pas = graph_size / double(window_size); - - for (int i = 0; i < window_size; i++) - { - x = p_x - graph_size / 2; - y += y_pas; - - for (int j = 0; j < window_size; j++) - { - x += x_pas; - - int sequence_result; - - if (fractale_type == Julia) - { - Complex z = Complex(x, y); - sequence_result = sequence(z, c, iteration_nb); - } - - else - { - Complex c = Complex(x, y); - sequence_result = sequence(Complex(0, 0), c, iteration_nb); - } - - if (sequence_result != iteration_nb) - set_point(j, i, color(sequence_result, iteration_nb)); - } - } -} - - - -// ---------- Le main ---------- - - - -int main() -{ - // ---------- Choix de l'utilisateur ---------- - - - - window_size = 800; - color_constant = 7.; - - double x = -0.75; - double y = 0.; - - double graph_size = 3.; - int iteration_nb = 250; - - Fractale_type fractale_type = Mandelbrot; - Complex c = Complex(-0.55, 0.55); - - - - // ---------- Lancement du programme ---------- - - - - MoveWindow(myconsole, 0, 0, 1920, 1080, TRUE); - Sleep(100); - contour(); - show_image(x, y, graph_size, iteration_nb, fractale_type, c); - - std::cout << "finished"; - - while (1) - {} -} From cfcd5a7d6f8b1495939b3f337b708bff2ab16da6 Mon Sep 17 00:00:00 2001 From: Angel Uriot <46031994+angeluriot@users.noreply.github.com> Date: Tue, 21 Jan 2020 22:06:58 +0100 Subject: [PATCH 7/7] Delete README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 71b3535..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Fractal_generator - -[**Fractal_generator.cpp**](https://github.com/angeluriot/Fractal_generator/blob/master/Fractal_generator.cpp) contient le code source en C++ du projet. - -[**Fractal_generator.exe**](https://github.com/angeluriot/Fractal_generator/blob/master/Fractal_generator.exe) contient un exécutable du programme. *(Attention, il est possible que le programme soit bloqué par Windows, cliquez alors sur* ***"Informations complémentaires"*** *puis sur* ***"Exécuter quand même"****)*