Advertisement
Guest User

SFML Fourier Series Plot

a guest
Nov 21st, 2014
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.89 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <math.h>
  3. #include <iostream> //Debugging
  4.  
  5. float rads(int);
  6. float Calculate_Y(float,int,int,int,int);
  7.  
  8. const float pi = 3.14159;
  9. const int L_KNOB = 1;
  10. const int A_KNOB = 2;
  11. const int T_KNOB = 3;
  12. const int NIL = 0;
  13.  
  14. class Application
  15. {
  16.  
  17.     public:
  18.  
  19.     sf::RenderWindow window;
  20.     sf::Vector2f origin;
  21.     sf::Event event;
  22.  
  23.     int L;
  24.     int a;
  25.     int t;
  26.  
  27.     Application()
  28.     {
  29.         window.create(sf::VideoMode(800,600,32), "Serie de Fourier");
  30.         window.setFramerateLimit(30);
  31.         origin.x = 75;
  32.         origin.y = 300;
  33.         L = 200;
  34.         a = 5;
  35.         t = 10;
  36.     }
  37.  
  38.     void ChecarEventos()
  39.     {
  40.  
  41.         while (window.pollEvent(event))
  42.         {
  43.  
  44.             if (event.type == sf::Event::Closed)
  45.             {
  46.                 window.close();
  47.             }
  48.  
  49.         }
  50.  
  51.     }
  52.  
  53. };
  54.  
  55. class Grid
  56. {
  57.  
  58.     public:
  59.  
  60.     sf::Texture grid_texture;
  61.     sf::Sprite grid_sprite;
  62.    
  63.     Grid()
  64.     {
  65.         grid_texture.loadFromFile("img/grid.png");
  66.         grid_sprite.setTexture(grid_texture);
  67.     }
  68.  
  69. };
  70.  
  71. class Sliders
  72. {
  73.  
  74.     public:
  75.  
  76.     int selected_knob;
  77.  
  78.     sf::Texture slider_texture;
  79.     sf::Texture knob_texture;
  80.     sf::Sprite L_slider_sprite;
  81.     sf::Sprite a_slider_sprite;
  82.     sf::Sprite t_slider_sprite;
  83.     sf::Sprite L_knob_sprite;
  84.     sf::Sprite a_knob_sprite;
  85.     sf::Sprite t_knob_sprite;
  86.  
  87.     Sliders()
  88.     {
  89.         selected_knob = NIL;
  90.  
  91.         slider_texture.loadFromFile("img/slider.png");
  92.         knob_texture.loadFromFile("img/knob.png");
  93.        
  94.         L_slider_sprite.setTexture(slider_texture);
  95.         a_slider_sprite.setTexture(slider_texture);
  96.         t_slider_sprite.setTexture(slider_texture);
  97.         L_knob_sprite.setTexture(knob_texture);
  98.         a_knob_sprite.setTexture(knob_texture);
  99.         t_knob_sprite.setTexture(knob_texture);
  100.  
  101.         L_slider_sprite.setPosition(450,425);
  102.         a_slider_sprite.setPosition(450,450);
  103.         t_slider_sprite.setPosition(450,475);
  104.  
  105.         L_knob_sprite.setPosition(500,421);
  106.         a_knob_sprite.setPosition(500,446);
  107.         t_knob_sprite.setPosition(500,471);
  108.  
  109.     }
  110.  
  111.     void selectKnob(sf::RenderWindow &window)
  112.     {
  113.  
  114.         sf::Vector2i mouse = sf::Mouse::getPosition(window);
  115.         sf::Vector2f L_knob = L_knob_sprite.getPosition();
  116.         sf::Vector2f a_knob = a_knob_sprite.getPosition();
  117.         sf::Vector2f t_knob = t_knob_sprite.getPosition();
  118.  
  119.         if ((mouse.x > L_knob.x) && (mouse.x < (L_knob.x+7)) && (mouse.y > L_knob.y) && (mouse.y < (L_knob.y+15)))
  120.         {
  121.             selected_knob = L_KNOB;
  122.             return;
  123.         }
  124.         else if ((mouse.x > a_knob.x) && (mouse.x < (a_knob.x+7)) && (mouse.y > a_knob.y) && (mouse.y < (a_knob.y+15)))
  125.         {
  126.             selected_knob = A_KNOB;
  127.             return;
  128.         }
  129.         else if ((mouse.x > t_knob.x) && (mouse.x < (t_knob.x+7)) && (mouse.y > t_knob.y) && (mouse.y < (t_knob.y+15)))
  130.         {
  131.             selected_knob = T_KNOB;
  132.             return;
  133.         }
  134.  
  135.     }
  136.  
  137.     void Move(int knob, sf::RenderWindow &window)
  138.     {
  139.         sf::Vector2i mouse = sf::Mouse::getPosition(window);
  140.         int x = mouse.x;
  141.         int y = mouse.y;
  142.  
  143.         if (x < 455) x = 455;
  144.         if (x > 645) x = 645;
  145.  
  146.         switch (knob)
  147.         {
  148.             case L_KNOB:
  149.                 L_knob_sprite.setPosition(x-3,L_knob_sprite.getPosition().y);
  150.                 break;
  151.             case A_KNOB:
  152.                 a_knob_sprite.setPosition(x-3,a_knob_sprite.getPosition().y);
  153.                 break;
  154.             case T_KNOB:
  155.                 t_knob_sprite.setPosition(x-3,t_knob_sprite.getPosition().y);
  156.                 break;
  157.             default:
  158.                 break;
  159.         }
  160.  
  161.     }
  162.  
  163.  
  164. };
  165.  
  166. int main()
  167. {
  168.     Application app;
  169.     Grid grid;
  170.     Sliders sliders;
  171.  
  172.     sf::VertexArray points(sf::Points, 700);
  173.  
  174.     while (app.window.isOpen())
  175.     {
  176.  
  177.         app.ChecarEventos();
  178.  
  179.         if (sf::Mouse::isButtonPressed(sf::Mouse::Left) && sliders.selected_knob == NIL)
  180.         {
  181.             sliders.selectKnob(app.window);
  182.         }
  183.         else if (!sf::Mouse::isButtonPressed(sf::Mouse::Left))
  184.         {
  185.             sliders.selected_knob = NIL;
  186.         }
  187.  
  188.         if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
  189.         {
  190.             sliders.Move(sliders.selected_knob,app.window);
  191.         }
  192.  
  193.         app.L = (sliders.L_knob_sprite.getPosition().x - 300);
  194.         app.a = (sliders.a_knob_sprite.getPosition().x - 495)*3;
  195.         app.t = ((sliders.t_knob_sprite.getPosition().x - 490)/5);
  196.  
  197.         for (int i=0, j=0;i<app.L;i++,j++)
  198.         {
  199.  
  200.         points[j].position = sf::Vector2f((app.origin.x + i),Calculate_Y(app.origin.y,i,app.L,app.a,app.t) );
  201.         points[j].color = sf::Color(0,0,0);
  202.  
  203.         }
  204.  
  205.         app.window.clear(sf::Color(200,200,150));
  206.  
  207.         app.window.draw(grid.grid_sprite);
  208.  
  209.         app.window.draw(sliders.L_slider_sprite);
  210.         app.window.draw(sliders.a_slider_sprite);
  211.         app.window.draw(sliders.t_slider_sprite);
  212.         app.window.draw(sliders.L_knob_sprite);
  213.         app.window.draw(sliders.a_knob_sprite);
  214.         app.window.draw(sliders.t_knob_sprite);
  215.  
  216.         app.window.draw(points);
  217.  
  218.         app.window.display();
  219.  
  220.     }
  221.  
  222.     return 0;
  223.  
  224. }
  225.  
  226. float rads(int degree)
  227. {
  228.  
  229.     return degree*(3.14159/180);
  230.  
  231. }
  232.  
  233. float Calculate_Y(float origin, int x, int L, int a, int t)
  234. {
  235.     double Z = 0;
  236.  
  237.         for (int n = 1; n <= 100; n++)
  238.         {
  239.  
  240.             double An = ((4 * pow(L, 2)) / pow((n * M_PI), 3)) * (1 + pow(-1, n));
  241.             double Bn = ((4 * pow(L, 3)) / (a * pow((n * M_PI), 4))) * (1 - pow(-1, n));
  242.             double zn = (An * cos((n * M_PI * a)/ L) * t) + (Bn * sin((n * M_PI * a)/ L) * t);
  243.                
  244.             Z = Z + ( zn * sin((n * M_PI * x) / L));
  245.         }
  246.  
  247.     Z /= -1000;
  248.     return origin + Z;
  249.  
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement