[SFML, C++] Zaznaczenie drogi punktów na wirującej tarczy.
Witam . :)
Po dłuższej przerwie nadszedł czas na powrót do Programowania !! ;]
Mój psor z fizyki postawił przede mną następujące zadanie :
Napisać program który będzie wyświetlał dwie wirujące tarcze. Gdzie :
-Pierwsza tarcza ma r = 1/2 r drugiej tarczy.
-Środek mniejszej tarczy znajduje się w połowie promienia większej tarczy.
-Tarcza mniejsza porusza się ruchem złożonym z :
-Ruchu obrotowego w okół własnego środka .
-Ruchu obrotowego w okół środka większej tarczy.
Oczywiście program już napisałem :)
Problem jednak jest jednak następujący :
Program ma również za zadanie pokazanie drogi takich punktów :
a)środka mniejszej tarczy.
b)punktu leżącego w połowie promienia l.
c)punktu leżącego na krawędzi mniejszej tarczy i promieniu l.
moje pytanie : Czy SFML wspiera jakoś rysowanie cykloidy (lub po prostu Półokręgu) albo innych krzywych??
Jeśli nie to ma ktoś jakiś pomysł jak to zrobić ??
Ja na razie wpadłem na to że mogę stworzyć pętle która będzie tworzyła x punktów które połączę ze sobą (współrzędne punktów wezmę z pozycji wyżej wspomnianych punktów a,b,c w pierwszym cyklu. )
Oto dotychczasowo stworzony kod :
Header :
#include <iostream>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <string>
#include <ctime>
using namespace std;
double przelicznik_katow( double stopnie )
{
double radiany =( stopnie * M_PI ) / 180.0f;
return radiany;
}
class smiglo
{
public:
sf::Shape shape;
int predkosc;
int kierunek;
int poz_x;
int poz_y;
double argumentA;
double argumentB;
smiglo( int startX, int startY )
{
argumentA = 0;
argumentB = 0;
kierunek = 90;
predkosc = 1;
poz_x = startX;
poz_y = startY;
sf::Shape bal = sf::Shape::Circle( poz_x, poz_y, 125, sf::Color::Blue, 10, sf::Color::Blue );
shape = bal;
shape.SetCenter( 512, 384 );
shape.SetPosition( 512 - 125, 384 );
}
void skrec( bool strona )
{
if( predkosc != 0 )
{
cout << kierunek << endl;
if( strona == true ) kierunek -= 1, shape.SetRotation( kierunek );
if( strona == false ) kierunek += 1, shape.SetRotation( kierunek );
cout << kierunek << endl;
if( kierunek > 360 ) kierunek -= 360;
if( kierunek < 0 ) kierunek += 360;
}
}
void ruch( int predkosc )
{
double kat;
if( kierunek <= 90 )
kat = kierunek;
if( kierunek >= 180 && kierunek < 270 )
kat = kierunek - 180;
if( kierunek > 90 && kierunek < 180 )
kat = 180 - kierunek;
if( kierunek >= 270 )
kat = 360 - kierunek;
if( kierunek == 360 )
kierunek = 0;
kat = przelicznik_katow( kat );
if( kierunek < 90 && kierunek >= 0 )
{
argumentA =+ predkosc *( cos( kat ) );
argumentB =- predkosc *( sin( kat ) );
}
if( kierunek >= 180 && kierunek < 270 )
{
argumentA =- predkosc *( cos( kat ) );
argumentB =+ predkosc *( sin( kat ) );
}
if( kierunek >= 90 && kierunek < 180 )
{
argumentA = - predkosc *( cos( kat ) );
argumentB = - predkosc *( sin( kat ) );
}
if( kierunek >= 270 && kierunek < 360 )
{
argumentA =+ predkosc *( cos( kat ) );
argumentB =+ predkosc *( sin( kat ) );
}
shape.Move( argumentA, argumentB );
poz_x += argumentA;
poz_y += argumentB;
cout << argumentA << " " << argumentB << endl;
}
void ruchprawoskretny()
{
ruch( 2.108 );
skrec( true );
}
};
Main:
#include "header.hpp"
int kierunek = 0;
bool strona = true;
int main()
{
sf::Shape tarcza = sf::Shape::Circle( 512, 384, 250, sf::Color::Black, 10, sf::Color::Black );
tarcza.SetCenter( 512, 384 );
tarcza.SetPosition( 512, 384 );
tarcza.EnableFill( true ), tarcza.EnableOutline( false );
smiglo::smiglo kolo( 512, 384 );
sf::RenderWindow okno( sf::VideoMode( 1024, 768, 32 ), "Wirujace tarcze", sf::Style::Fullscreen );
while( okno.IsOpened() )
{
okno.Clear( sf::Color( 255, 255, 255 ) );
cout << kierunek << endl;
if( strona == true ) kierunek -= 1, tarcza.SetRotation( kierunek );
if( strona == false ) kierunek += 1, tarcza.SetRotation( kierunek );
if( kierunek > 360 ) kierunek -= 360;
if( kierunek < 0 ) kierunek += 360;
cout << kierunek << endl;
okno.Draw( tarcza );
okno.Draw( kolo.shape );
kolo.ruchprawoskretny();
okno.Display();
sf::Event zdarzenie;
while( okno.GetEvent( zdarzenie ) )
{
if( zdarzenie.Type == sf::Event::Closed )
okno.Close();
if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
okno.Close();
}
}
return 0;
}