Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML, C++] Zaznaczenie drogi punktów na wirującej tarczy.

Ostatnio zmodyfikowano 2012-03-01 19:51
Autor Wiadomość
jaupl
Temat założony przez niniejszego użytkownika
[SFML, C++] Zaznaczenie drogi punktów na wirującej tarczy.
» 2012-02-28 17:11:24
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 :
C/C++
#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 ) //   /***KONSTRUKTOR***/
    {
       
        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 );
    }
   
    /***Metody***/
   
    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:
C/C++
#include "header.hpp"
int kierunek = 0;
bool strona = true;
int main()
{ /** Tworzenie okregu **/
    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 ) );
        /** ruch obrotowy **/
        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();
       
        /** Obsuga zdarzen **/
        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;
}
P-51568
jaupl
Temat założony przez niniejszego użytkownika
» 2012-02-29 20:46:25
teoria teorią ale zderzenie z praktyką wykluczyło prawidłowość mojego toku myślenia :\ oto kod tworzący kształt mający być drogą punktu c :
C/C++
sf::Shape drogax;
int x = 0;

if( x < 360 )
{
    x++;
    drogax.AddPoint( kolo.shape.GetPointPosition( 1 ), sf::Color::Red );
    drogax.SetPointOutlineColor( x, sf::Color::Red );
}
cout << x << endl;
drogax.EnableOutline( true );
drogax.EnableFill( false );
drogax.SetOutlineWidth( 3 );
okno.Draw( drogax );
okno.display();
Nie daje to niestety żadnego efektu na ekranie .... wie ktoś dlaczego ?? Naprawdę nie wiem co robię źle . wymyślę coś innego ale do tego czasu proszę o weryfikację mojego sposobu myślenia :) Mile widziane konstruktywne słowa krytyki . :PP
C/C++
// Droga punktu a już narysowana ;)[/cpp]

/Edit : hmmm ... drogiem tego punktu (c) jest ... Linia prosta ? :D konkretnie odcinek ... oczywiście jeśli mniejsza tarcza porusza się bez "poślizgu" .
 Zostaje punkt B . no i oczywiście pytanie czemu ten odcinek się nie wyświetla ...
P-51649
waxx
» 2012-03-01 07:09:21
Moze narysuj o co ci chodzi bo ciezko zrozumiec.
P-51664
jaupl
Temat założony przez niniejszego użytkownika
» 2012-03-01 08:37:17
Mówisz masz : http://imageshack.us/mobile/gallery.php
Mam nadzieje że dokładnie wszystko widać :D a co do samego rysunku to proszę o odrobinę wyrozumiałości. :PP zaznaczyłem punkty ABC na 1 rysunku a również kierunek obrotu w okół własnej osi. na ostatnim jest zaznaczona droga A i C :) Pytanie brzmi Jak będzie wyglądała droga punktu B ?? moim zdaniem to będzie jakaś krzywa nieco zbliżona do kształtu równoległoboku o wierzchołkach w punktach b zaznaczonych na kolejnych rysunkach 1, 3, 5, 7 (tego jednego tu nie umieściłem ... ) albo sam równoległobok jest drogą ... nie wiem ciężko mi to rozkminić ... X)
P-51665
fish13
» 2012-03-01 09:43:07
Link do rysunku przekierowuje na stronę główną ;)
P-51666
jaupl
Temat założony przez niniejszego użytkownika
» 2012-03-01 11:49:20
Nie wiem czemu i wrzuciłem jako tekst. A co do mojego problemu, juz wiem :-) Drogą punktu B jest elipsa :-P
P-51668
jaupl
Temat założony przez niniejszego użytkownika
SFML i QT ??
» 2012-03-01 19:51:38
Zamykam Temat. ;p
P-51700
« 1 »
  Strona 1 z 1