Advertisement
qberik

Untitled

Mar 27th, 2022
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <SFML/Graphics.hpp>
  3. #include <iostream>
  4. #include <vector>
  5. #include <cmath>
  6.  
  7. using namespace sf;
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.     constexpr int pointCount = 200;
  13.     const Vector2f ellipseRadius = { 200.f, 80.f };
  14.  
  15.     ContextSettings settings;
  16.     settings.antialiasingLevel = 8;
  17.     RenderWindow window(VideoMode({ 800,600 }), "Ellipse", Style::Default, settings);
  18.  
  19.     ConvexShape ellipse;
  20.     ellipse.setPosition({ 400,320 });
  21.     ellipse.setFillColor(Color::Blue);
  22.  
  23.     //ellipse.setOutlineThickness(1);
  24.     //ellipse.setOutlineColor(Color::White);
  25.  
  26.     ellipse.setPointCount(pointCount);
  27.     for (int pointNo = 0; pointNo < pointCount; pointNo++) {
  28.         float angle = float(2 * M_PI * pointNo) / float(pointCount);
  29.         Vector2f point = {
  30.             ellipseRadius.x * sin(angle),
  31.             ellipseRadius.y * cos(angle)
  32.         };
  33.         ellipse.setPoint(pointNo, point);
  34.     }
  35.  
  36.     vector< vector< vector<Vertex> > > lines;
  37.  
  38.     int lineCount = 5;
  39.     int segmentCount = 200;
  40.  
  41.     int _x = 400;
  42.     int _y = 320;
  43.  
  44.  
  45.   vector< ConvexShape > small_ellipse;
  46.  
  47.  
  48.   for( int i = 0; i < lineCount; i++ ){
  49.     ConvexShape RightHalf;
  50.     RightHalf.setPosition( _x - 0.5, _y );
  51.     ConvexShape LeftHalf;
  52.     LeftHalf.setPosition( _x + 0.5 , _y );
  53.  
  54.  
  55.     vector< Color > col = { Color::Red, Color::Green, Color::Magenta };
  56.     RightHalf.setFillColor( col[ (i ) % col.size() ]  );
  57.     LeftHalf.setFillColor( col[ (i + 1 ) % col.size() ]  );
  58.  
  59.     RightHalf.setPointCount( segmentCount );
  60.     for( int j = 0; j < segmentCount; j++ ){
  61.       float angle = float( M_PI * j ) / float( segmentCount );
  62.       Vector2f point = {
  63.         ellipseRadius.x * sin(angle) * ( float( i + 1 ) / lineCount ) ,
  64.               ellipseRadius.y * cos(angle)
  65.       };
  66.       RightHalf.setPoint( j, point );
  67.     }
  68.  
  69.     LeftHalf.setPointCount( segmentCount );
  70.     for( int j = 0; j < segmentCount; j++ ){
  71.       float angle = M_PI + float( M_PI * j ) / float( segmentCount );
  72.       Vector2f point = {
  73.         ellipseRadius.x * sin(angle) * ( float( i + 1 ) / lineCount ) ,
  74.               ellipseRadius.y * cos(angle)
  75.       };
  76.       LeftHalf.setPoint( j, point );
  77.     }
  78.  
  79.     small_ellipse.push_back( RightHalf );
  80.     small_ellipse.push_back( LeftHalf );
  81.    
  82.   }
  83.  
  84.    
  85.  
  86.     for (int i = 0; i < lineCount; i++) {
  87.         vector< vector<Vertex> > line;
  88.         for (int j = 0; j < segmentCount - 1; j++) {
  89.             float a1 = float(2 * M_PI * j) / float(segmentCount);
  90.             float a2 = float(2 * M_PI * (j + 1)) / float(segmentCount);
  91.             float x = ellipseRadius.x * (float(i+1)  / lineCount);
  92.             float y = ellipseRadius.y;
  93.             vector<Vertex> lineSegment{
  94.               Vertex(Vector2f(_x + x * sin(a1), _y + y * cos(a1))),
  95.               Vertex(Vector2f(_x + x * sin(a2), _y + y * cos(a2))),
  96.             };
  97.             line.push_back(lineSegment);
  98.         }
  99.         lines.push_back(line);
  100.     }
  101.  
  102.     while (window.isOpen())
  103.     {
  104.         Event event;
  105.         while (window.pollEvent(event))
  106.         {
  107.             if (event.type == Event::Closed)
  108.             {
  109.                 window.close();
  110.             }
  111.         }
  112.  
  113.         window.clear();
  114.         window.draw(ellipse);
  115.  
  116.     for( int i = 0; i < small_ellipse.size() ; i++ ){
  117.       window.draw( small_ellipse[ small_ellipse.size() - 1 - i] );
  118.     }
  119.  
  120.  
  121.         for (int i = 0; i < lineCount; i++) {
  122.             for (int j = 0; j < segmentCount - 1; j++) {
  123.                 Vertex line[2] = {
  124.                   lines[i][j][0],
  125.                   lines[i][j][1]
  126.                 };
  127.                 window.draw(line, 10, Lines);
  128.             }
  129.         }
  130.  
  131.  
  132.         window.display();
  133.     }
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement