Advertisement
LegoSosiska

Even crazier fractals

Sep 19th, 2022
1,017
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <SFML/Window.hpp>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. #include <cmath>
  7.  
  8. sf::Vector2f c = { -1, 0 };
  9. double n = 1000, m = 1000;
  10. int mode = 0;
  11.  
  12. bool Process2(double x, double y) {
  13.     double p = (x - 0.25) * (x - 0.25) + y * y;
  14.     double pc = (0.5 - 0.5 * cos(std::atan2l(y, x - 0.25)));
  15.     return p < pc;
  16. }
  17.  
  18. int Process(double x, double y) {
  19.     /*if (Process2(x, y)) {
  20.         return -1;
  21.     }*/
  22.     int ans = 0;
  23.     sf::Vector2f z(0, 0);
  24.     sf::Vector2f c(x, y);
  25.     /*if (mode == 0) {
  26.         c = { x, y };
  27.         z = { 0, 0 };
  28.     }
  29.     else {
  30.         z = { x, y };
  31.     }*/
  32.     while (z.x * z.x + z.y * z.y < 4) {
  33.         z = sf::Vector2f(z.x * z.x - z.y * z.y + c.x, z.x * z.y * 2 + c.y);
  34.         ++ans;
  35.         if (ans > 100) {
  36.             return -1;
  37.         }
  38.     }
  39.     return ans;
  40. }
  41.  
  42.  
  43.  
  44. void Create(sf::VertexArray& dots, double crop = 0.002, sf::Vector2f start = { -1, -1 }) {
  45.     double x = start.x;
  46.     int xd = 0;
  47.     while (xd < n) {
  48.         int yd = 0;
  49.         double y = start.y;
  50.         while (yd < m) {
  51.             int k = Process(x, y);
  52.             sf::Vector2f dot(xd, yd);
  53.             dots.append(dot);
  54.             if (k == -1) {
  55.                 dots[dots.getVertexCount() - 1].color = sf::Color(0, 0, 0);
  56.                
  57.             }
  58.             else {
  59.                 if (k > 5) {
  60.                     dots[dots.getVertexCount() - 1].color = sf::Color(-100 + k * 10,0 + k * 10 , -200 + k * 10);
  61.                 }
  62.                 else {
  63.                     dots[dots.getVertexCount() - 1].color = sf::Color(10 + k * 5, 10 + k * 5, 10 + k * 5);
  64.                 }
  65.                 //std::cout << k << " ";
  66.             }
  67.             yd += 1;
  68.             y += crop;
  69.         }
  70.         xd += 1;
  71.         x += crop;
  72.     }
  73. }
  74.  
  75. int main() {
  76.     sf::Font font;
  77.     if (!font.loadFromFile("Hack-regular.ttf")) {
  78.         std::cout << "NO FONT";
  79.         return 0;
  80.     }
  81.     sf::VertexArray dots(sf::Points), square(sf::LineStrip);
  82.     sf::RenderWindow window(sf::VideoMode(1000, 1000), "AA");
  83.    
  84.    
  85.     int iteration = 0;
  86.  
  87.     std::vector<std::pair<double, sf::Vector2f>> history;
  88.     sf::Vector2f zoomCords1, zoomCords2;
  89.     bool pressed = false;
  90.     double crop = 0.003;
  91.     sf::Vector2f start = { -2.2, -1.5 };
  92.  
  93.     Create(dots, crop, start);
  94.  
  95.     while (window.isOpen()) {
  96.         sf::Event event;
  97.         while (window.pollEvent(event)) {
  98.             if (event.type == sf::Event::Closed) {
  99.                 window.close();
  100.             }
  101.             /*if (event.type == sf::Event::KeyPressed) {
  102.                 if (event.key == sf::Event::KeyEvent::alt)
  103.             }*/
  104.             if (event.type == sf::Event::MouseButtonPressed) {
  105.                 if (event.mouseButton.button == sf::Mouse::Left) {
  106.                     zoomCords1.x = event.mouseButton.x;
  107.                     zoomCords1.y = event.mouseButton.y;
  108.                     pressed = true;
  109.                     zoomCords2.x = sf::Mouse::getPosition(window).x;
  110.                     zoomCords2.y = sf::Mouse::getPosition(window).y;
  111.                     square.clear();
  112.                     square.append(zoomCords1);
  113.                     square.append(sf::Vector2f(zoomCords1.x, zoomCords2.y));
  114.                     square.append(zoomCords2);
  115.                     square.append(sf::Vector2f(zoomCords2.x, zoomCords1.y));
  116.                     square.append(zoomCords1);
  117.                 }
  118.                 if (event.mouseButton.button == sf::Mouse::Right) {
  119.                     pressed = false;
  120.                     dots.clear();
  121.                     if (history.size()) {
  122.                         std::pair<double, sf::Vector2f> pair = *(history.end() - 1);
  123.                         history.pop_back();
  124.                         crop = pair.first;
  125.                         start = pair.second;
  126.                         Create(dots, pair.first, pair.second);
  127.                     }
  128.                    
  129.                    
  130.                 }
  131.             }
  132.             if (event.type == sf::Event::MouseMoved) {
  133.                 if (pressed) {
  134.                     zoomCords2.x = sf::Mouse::getPosition(window).x;
  135.                     zoomCords2.y = sf::Mouse::getPosition(window).y;
  136.                     square.clear();
  137.                     square.append(zoomCords1);
  138.                     square.append(sf::Vector2f(zoomCords1.x, zoomCords2.y));
  139.                     square.append(zoomCords2);
  140.                     square.append(sf::Vector2f(zoomCords2.x, zoomCords1.y));
  141.                     square.append(zoomCords1);
  142.                 }
  143.             }
  144.             if (event.type == sf::Event::MouseButtonReleased) {
  145.                 if (event.mouseButton.button == sf::Mouse::Left) {
  146.                     pressed = false;
  147.                     history.push_back(std::make_pair(crop, start));
  148.                     double height = abs(square[0].position.y - square[1].position.y);
  149.                     double width = abs(square[0].position.x - square[2].position.x);
  150.                     sf::Vector2f topLeft(std::min(square[0].position.x, square[2].position.x),std::min(square[0].position.y, square[1].position.y));
  151.                     if (height > width) {
  152.                         start.y = start.y + topLeft.y * crop;
  153.                         start.x = start.x + (topLeft.x) * crop;
  154.                         crop = crop * (height / 1000);
  155.                        
  156.                     }
  157.                     else {
  158.                         start.y = start.y + topLeft.y * crop;
  159.                         start.x = start.x + (topLeft.x) * crop;
  160.                         crop = crop * (width / 1000);
  161.                     }
  162.                     square.clear();
  163.                     dots.clear();
  164.                     Create(dots, crop, start);
  165.                 }
  166.             }
  167.  
  168.  
  169.  
  170.         }
  171.         window.clear(sf::Color::Black);
  172.  
  173.  
  174.         window.draw(dots);
  175.         if (pressed) {
  176.             window.draw(square);
  177.         }
  178.         window.display();
  179.     }
  180. }
Tags: C++ sfml
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement