DavidNorgren

Untitled

May 15th, 2015
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <Windows.h>
  5. #include "gmp.h"
  6.  
  7. #define WIDTH 79
  8. #define HEIGHT 40
  9.  
  10. #define MAX_ITERATION 256
  11.  
  12. HANDLE hOut;
  13.  
  14. void setColor(int textColor, int bgColor)
  15. {
  16.     SetConsoleTextAttribute(hOut, textColor + 16 * bgColor);
  17. }
  18. void emptyScreen() {
  19.     COORD Position;
  20.     Position.X = 0;
  21.     Position.Y = 0;
  22.     SetConsoleCursorPosition(hOut, Position);
  23. }
  24. void setSize(int x, int y) {
  25.     COORD Position;
  26.     Position.X = x;
  27.     Position.Y = y;
  28.     SetConsoleScreenBufferSize(hOut, Position);
  29. }
  30.  
  31. int main()
  32. {
  33.     int sx, sy, key;
  34.     mpf_t mx, my, zoom, hzoom;
  35.     mpf_t dx, dy, x, y, xx, yy, xxpyy, xxmyy, xy2, mul, temp;
  36.     mpf_t screenxperc, screenyperc, xstep, ystep;
  37.     mpf_t zoomdwid, zoomdhei;
  38.  
  39.     mpf_set_default_prec(1024);
  40.  
  41.     mpf_init_set_si(mx, -2);
  42.     mpf_init(my);
  43.     mpf_init_set_si(zoom, 8);
  44.     mpf_init_set_si(hzoom, 4);
  45.  
  46.     mpf_init(dx);
  47.     mpf_init(dy);
  48.     mpf_init(x);
  49.     mpf_init(y);
  50.     mpf_init(xx);
  51.     mpf_init(yy);
  52.     mpf_init(xxpyy);
  53.     mpf_init(xxmyy);
  54.     mpf_init(xy2);
  55.     mpf_init_set_d(mul, 0.5);
  56.     mpf_init(temp);
  57.  
  58.     mpf_init(screenxperc);
  59.     mpf_init(screenyperc);
  60.     mpf_init(xstep);
  61.     mpf_init(ystep);
  62.  
  63.     mpf_init(zoomdwid);
  64.     mpf_init(zoomdhei);
  65.  
  66.     hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  67.     setSize(100,100);
  68.     do {
  69.         emptyScreen();
  70.         for (sy = 0; sy < HEIGHT; sy++) {
  71.             mpf_set_d(screenyperc, (double)sy / (double)HEIGHT); //% of screen covered vertically
  72.             mpf_mul(ystep, screenyperc, zoom);
  73.  
  74.             for (sx = 0; sx < WIDTH; sx++) {
  75.                 int iteration = 0;
  76.  
  77.                 mpf_set_d(screenxperc, (double)sx / (double)WIDTH); //% of screen covered horizontally
  78.                 mpf_mul(xstep, screenxperc, zoom);
  79.  
  80.                 mpf_sub(dx, mx, hzoom); //dx = mx - zoom / 2
  81.                 mpf_sub(dy, my, hzoom); //dy = my - zoom / 2
  82.                 mpf_add(dx, dx, xstep); //dx += screenxperc * zoom
  83.                 mpf_add(dy, dy, ystep); //dy += screenyperc * zoom
  84.  
  85.                 mpf_set_ui(x, 0);
  86.                 mpf_set_ui(y, 0);
  87.                 while (iteration < MAX_ITERATION) {
  88.                     mpf_mul(xx, x, x);
  89.                     mpf_mul(yy, y, y);
  90.                     mpf_add(xxpyy, xx, yy);
  91.  
  92.                     if (mpf_cmp_ui(xxpyy, 32 * 32) >= 0) break; //x*x + y*y > 2*2
  93.  
  94.                     mpf_sub(xxmyy, xx, yy);
  95.                     mpf_add(temp, xxmyy, dx); //temp = x*x - y*y + dx
  96.  
  97.                     mpf_mul(xy2, x, y);
  98.                     mpf_mul_ui(xy2, xy2, 2);
  99.                     mpf_add(y, xy2, dy); //y = x*y*2 + dy
  100.                     mpf_set(x, temp); //x = temp
  101.                     iteration++;
  102.                 }
  103.                 setColor((iteration + 1) % 256,0);
  104.                 if (iteration == MAX_ITERATION) printf(" ");
  105.                 else printf("%c",(char)(33+iteration % 92));
  106.             }
  107.             printf("\n");
  108.         }
  109.  
  110.         setColor(15, 0);
  111.         printf("Mid Position: %f,%f\n", mpf_get_d(mx), mpf_get_d(my));
  112.         printf("View range: %f\n", mpf_get_d(zoom));
  113.         printf("ADSW: Move, QE: Zoom");
  114.  
  115.         key = getch();
  116.         if (key < 97) key += 32;
  117.         mpf_div_ui(zoomdwid, zoom, (int)WIDTH / 10);
  118.         mpf_div_ui(zoomdhei, zoom, (int)HEIGHT / 10);
  119.         switch ((char) key) {
  120.             case 'd': mpf_add(mx, mx, zoomdwid); break;
  121.             case 'a': mpf_sub(mx, mx, zoomdwid); break;
  122.             case 's': mpf_add(my, my, zoomdhei); break;
  123.             case 'w': mpf_sub(my, my, zoomdhei); break;
  124.             case 'q': mpf_mul(zoom, zoom, mul); break;
  125.             case 'e': mpf_div(zoom, zoom, mul); break;
  126.         }
  127.         mpf_div_ui(hzoom, zoom, 2);
  128.     } while (key != 'x');
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment