Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _USE_MATH_DEFINES
- #include <SFML/Graphics.hpp>
- #include <iostream>
- #include <vector>
- #include <cmath>
- using namespace sf;
- using namespace std;
- int main()
- {
- constexpr int pointCount = 200;
- const Vector2f ellipseRadius = { 200.f, 80.f };
- ContextSettings settings;
- settings.antialiasingLevel = 8;
- RenderWindow window(VideoMode({ 800,600 }), "Ellipse", Style::Default, settings);
- ConvexShape ellipse;
- ellipse.setPosition({ 400,320 });
- ellipse.setFillColor(Color::Blue);
- //ellipse.setOutlineThickness(1);
- //ellipse.setOutlineColor(Color::White);
- ellipse.setPointCount(pointCount);
- for (int pointNo = 0; pointNo < pointCount; pointNo++) {
- float angle = float(2 * M_PI * pointNo) / float(pointCount);
- Vector2f point = {
- ellipseRadius.x * sin(angle),
- ellipseRadius.y * cos(angle)
- };
- ellipse.setPoint(pointNo, point);
- }
- vector< vector< vector<Vertex> > > lines;
- int lineCount = 5;
- int segmentCount = 200;
- int _x = 400;
- int _y = 320;
- vector< ConvexShape > small_ellipse;
- for( int i = 0; i < lineCount; i++ ){
- ConvexShape RightHalf;
- RightHalf.setPosition( _x - 0.5, _y );
- ConvexShape LeftHalf;
- LeftHalf.setPosition( _x + 0.5 , _y );
- vector< Color > col = { Color::Red, Color::Green, Color::Magenta };
- RightHalf.setFillColor( col[ (i ) % col.size() ] );
- LeftHalf.setFillColor( col[ (i + 1 ) % col.size() ] );
- RightHalf.setPointCount( segmentCount );
- for( int j = 0; j < segmentCount; j++ ){
- float angle = float( M_PI * j ) / float( segmentCount );
- Vector2f point = {
- ellipseRadius.x * sin(angle) * ( float( i + 1 ) / lineCount ) ,
- ellipseRadius.y * cos(angle)
- };
- RightHalf.setPoint( j, point );
- }
- LeftHalf.setPointCount( segmentCount );
- for( int j = 0; j < segmentCount; j++ ){
- float angle = M_PI + float( M_PI * j ) / float( segmentCount );
- Vector2f point = {
- ellipseRadius.x * sin(angle) * ( float( i + 1 ) / lineCount ) ,
- ellipseRadius.y * cos(angle)
- };
- LeftHalf.setPoint( j, point );
- }
- small_ellipse.push_back( RightHalf );
- small_ellipse.push_back( LeftHalf );
- }
- for (int i = 0; i < lineCount; i++) {
- vector< vector<Vertex> > line;
- for (int j = 0; j < segmentCount - 1; j++) {
- float a1 = float(2 * M_PI * j) / float(segmentCount);
- float a2 = float(2 * M_PI * (j + 1)) / float(segmentCount);
- float x = ellipseRadius.x * (float(i+1) / lineCount);
- float y = ellipseRadius.y;
- vector<Vertex> lineSegment{
- Vertex(Vector2f(_x + x * sin(a1), _y + y * cos(a1))),
- Vertex(Vector2f(_x + x * sin(a2), _y + y * cos(a2))),
- };
- line.push_back(lineSegment);
- }
- lines.push_back(line);
- }
- while (window.isOpen())
- {
- Event event;
- while (window.pollEvent(event))
- {
- if (event.type == Event::Closed)
- {
- window.close();
- }
- }
- window.clear();
- window.draw(ellipse);
- for( int i = 0; i < small_ellipse.size() ; i++ ){
- window.draw( small_ellipse[ small_ellipse.size() - 1 - i] );
- }
- for (int i = 0; i < lineCount; i++) {
- for (int j = 0; j < segmentCount - 1; j++) {
- Vertex line[2] = {
- lines[i][j][0],
- lines[i][j][1]
- };
- window.draw(line, 10, Lines);
- }
- }
- window.display();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement