Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <Windows.h>
- #include "gmp.h"
- #define WIDTH 79
- #define HEIGHT 40
- #define MAX_ITERATION 256
- HANDLE hOut;
- void setColor(int textColor, int bgColor)
- {
- SetConsoleTextAttribute(hOut, textColor + 16 * bgColor);
- }
- void emptyScreen() {
- COORD Position;
- Position.X = 0;
- Position.Y = 0;
- SetConsoleCursorPosition(hOut, Position);
- }
- void setSize(int x, int y) {
- COORD Position;
- Position.X = x;
- Position.Y = y;
- SetConsoleScreenBufferSize(hOut, Position);
- }
- int main()
- {
- int sx, sy, key;
- mpf_t mx, my, zoom, hzoom;
- mpf_t dx, dy, x, y, xx, yy, xxpyy, xxmyy, xy2, mul, temp;
- mpf_t screenxperc, screenyperc, xstep, ystep;
- mpf_t zoomdwid, zoomdhei;
- mpf_set_default_prec(1024);
- mpf_init_set_si(mx, -2);
- mpf_init(my);
- mpf_init_set_si(zoom, 8);
- mpf_init_set_si(hzoom, 4);
- mpf_init(dx);
- mpf_init(dy);
- mpf_init(x);
- mpf_init(y);
- mpf_init(xx);
- mpf_init(yy);
- mpf_init(xxpyy);
- mpf_init(xxmyy);
- mpf_init(xy2);
- mpf_init_set_d(mul, 0.5);
- mpf_init(temp);
- mpf_init(screenxperc);
- mpf_init(screenyperc);
- mpf_init(xstep);
- mpf_init(ystep);
- mpf_init(zoomdwid);
- mpf_init(zoomdhei);
- hOut = GetStdHandle(STD_OUTPUT_HANDLE);
- setSize(100,100);
- do {
- emptyScreen();
- for (sy = 0; sy < HEIGHT; sy++) {
- mpf_set_d(screenyperc, (double)sy / (double)HEIGHT); //% of screen covered vertically
- mpf_mul(ystep, screenyperc, zoom);
- for (sx = 0; sx < WIDTH; sx++) {
- int iteration = 0;
- mpf_set_d(screenxperc, (double)sx / (double)WIDTH); //% of screen covered horizontally
- mpf_mul(xstep, screenxperc, zoom);
- mpf_sub(dx, mx, hzoom); //dx = mx - zoom / 2
- mpf_sub(dy, my, hzoom); //dy = my - zoom / 2
- mpf_add(dx, dx, xstep); //dx += screenxperc * zoom
- mpf_add(dy, dy, ystep); //dy += screenyperc * zoom
- mpf_set_ui(x, 0);
- mpf_set_ui(y, 0);
- while (iteration < MAX_ITERATION) {
- mpf_mul(xx, x, x);
- mpf_mul(yy, y, y);
- mpf_add(xxpyy, xx, yy);
- if (mpf_cmp_ui(xxpyy, 32 * 32) >= 0) break; //x*x + y*y > 2*2
- mpf_sub(xxmyy, xx, yy);
- mpf_add(temp, xxmyy, dx); //temp = x*x - y*y + dx
- mpf_mul(xy2, x, y);
- mpf_mul_ui(xy2, xy2, 2);
- mpf_add(y, xy2, dy); //y = x*y*2 + dy
- mpf_set(x, temp); //x = temp
- iteration++;
- }
- setColor((iteration + 1) % 256,0);
- if (iteration == MAX_ITERATION) printf(" ");
- else printf("%c",(char)(33+iteration % 92));
- }
- printf("\n");
- }
- setColor(15, 0);
- printf("Mid Position: %f,%f\n", mpf_get_d(mx), mpf_get_d(my));
- printf("View range: %f\n", mpf_get_d(zoom));
- printf("ADSW: Move, QE: Zoom");
- key = getch();
- if (key < 97) key += 32;
- mpf_div_ui(zoomdwid, zoom, (int)WIDTH / 10);
- mpf_div_ui(zoomdhei, zoom, (int)HEIGHT / 10);
- switch ((char) key) {
- case 'd': mpf_add(mx, mx, zoomdwid); break;
- case 'a': mpf_sub(mx, mx, zoomdwid); break;
- case 's': mpf_add(my, my, zoomdhei); break;
- case 'w': mpf_sub(my, my, zoomdhei); break;
- case 'q': mpf_mul(zoom, zoom, mul); break;
- case 'e': mpf_div(zoom, zoom, mul); break;
- }
- mpf_div_ui(hzoom, zoom, 2);
- } while (key != 'x');
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment