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

Przesuwanie kwadratu i okręgu

Ostatnio zmodyfikowano 2016-03-05 22:25
Autor Wiadomość
Skipper11
Temat założony przez niniejszego użytkownika
Przesuwanie kwadratu i okręgu
» 2016-03-05 22:25:13
Witam, przesuwam sobie właśnie okręg i kwadrat. I na razie działa mi to tak, że jeśli nacisnę 'o' to przesuwa okrąg o to co tam sobie wybiorę, ale jeśli nacisnę 'k' to okrąg wraca mi do pierwotnego miejsca, a mogę przesuwać kwadrat. A chcę, żeby okrąg został mi tam gdzie był. I wyglądało to sobie tak o:
C/C++
#include "glut.h"
#include "math.h"

float x = 0, y = 0;
float x_c = 0, y_c = 0;
float m_x = 0, m_y = 0;
int kolor = 0;
bool isSquare = true;


void drawCircle( float xc, float yc, float rad )
{
    //
    // draw a circle centered at (xc,yc) with radius rad
    //
    glPushMatrix(); //zachowuje aktualna macierz transformacji
    if( isSquare == false )
    {
        x_c += m_x;
        y_c += m_y;
        glTranslatef( x_c, y_c, 0 );
    }
    //przesuwa uklad o dany wektor
    glBegin( GL_LINE_LOOP );
    //
    for( int angle = 0; angle < 365; angle = angle + 5 )
    {
        float angle_radians = angle *( float ) 3.14159 /( float ) 180;
        float x = rad *( float ) cos( angle_radians );
        float y = rad *( float ) sin( angle_radians );
        glVertex3f( x, y, 0 );
    }
    //
    glEnd();
    glPopMatrix();
}

void display( void )
{
    /* clear window */
   
    glClear( GL_COLOR_BUFFER_BIT );
    glPushMatrix();
    if( isSquare )
    {
        x += m_x;
        y += m_y;
        glTranslatef( x, y, 0 );
    }
   
    //glRotatef(kat,0,0,1); rotacja w okolo osi z
   
    if( kolor > 3 ) kolor = 1;
   
    if( kolor == 1 ) glColor3f( 1.0, 0.0, 0.0 ); //pokoloruj red
   
    if( kolor == 2 ) glColor3f( 0.0, 1.0, 0.0 ); //pokoloruj green
   
    if( kolor == 3 ) glColor3f( 0.0, 0.0, 1.0 ); //pokoloruj blue
   
    /* draw unit square polygon */
    glBegin( GL_POLYGON );
    glVertex2f( - 0.5, - 0.5 );
    glVertex2f( - 0.5, 0.5 );
    glVertex2f( 0.5, 0.5 );
    glVertex2f( 0.5, - 0.5 );
    glEnd();
    /* flush GL buffers */
    glPopMatrix();
   
    //rysowanie okregu
    drawCircle( 0, 0, 1 );
    //
   
    glFlush(); //natychmiastowe wykonanie wszystkich poprzednich polecen
}
static void Key( unsigned char key, int x_d, int y_d )
{
    m_x = 0, m_y = 0;
    switch( key )
    {
    case 'k':
        isSquare = true;
        break;
    case 'o':
        isSquare = false;
        break;
    case 'w':
        m_y +=.1;
        glutPostRedisplay();
        break;
    case 's':
        m_y -=.1;
        glutPostRedisplay();
        break;
    case 'a':
        m_x -=.1;
        glutPostRedisplay();
        break;
    case 'd':
        m_x +=.1;
        glutPostRedisplay();
        break;
    case ' ':
        kolor++;
        glutPostRedisplay();
        break;
    case 27:
        exit( 0 );
        default:
       
        break;
       
    }
   
}


void init()
{
    /* set clear color to black */
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    /* set fill  color to white */
    glColor3f( 1.0, 1.0, 1.0 );
   
    /* set up standard orthogonal view with clipping */
    /* box as cube of side 2 centered at origin */
    /* This is default view and these statement could be removed */
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( - 1.0, 1.0, - 1.0, 1.0, - 1.0, 1.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}

int main( int argc, char * argv[] )
{
    glutInit( & argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 500, 500 );
    glutInitWindowPosition( 0, 0 );
    glutCreateWindow( "simple" );
    glutDisplayFunc( display );
    glutKeyboardFunc( Key );
    init();
    glutMainLoop();
   
    return 0;
}

No i teraz dodałam zmienne globalne e_xc i e_yc i wyzerowałam je globalnie i z nimi działam, ale coś nie do końca styka to.
Bo np wybieram 'k' i mogę sobie przesuwać kwadrat, wybieram 'o' i przesuwac mogę okrag(a kwadrat wraca mi na początkowe położenie, więc źle), ale gdy znów się przełączę na 'k', mogę ten kwadrat przesuwać od miejsca gdzie był ostatnio, a nie od startu(więc tutaj okej).
No i tak to wygląda dla okręgu teraz:
C/C++
if( isSquare )
{
    x_c = 0; y_c = 0;
    x_c = e_xc + m_x;
    y_c = e_yc + m_y;
    glTranslatef( x_c, y_c, 0 );
    e_xc = x_c;
    e_yc = y_c;
}

Bo ogółem potem chce te dwie figury zamienić miejscami w czasie 2sekund za pomocą GlutTimerFunc.
C/C++
int licznik;

static void timercallback( int value )
{
    float krok;
    krok = sqrt((( e_x - e_xc ) *( e_x - e_xc ) ) -(( e_y - e_yc )( e_y - e_yc ) ) );
    if( licznik < 50 )
    {
        licznik++; //odliczanie kolejnych klatek
        glutTimerFunc( 100, timercallback, value ); //ustawienie ponownego wywolania naszej funkcji 'timercallback' po 100ms
    }
}

I ja wiem, że muszę to e_xc, e_yc i e_x i e_y zmieniać właśnie dodając ten krok, i, że to musi być w tym ifie. Jednak też nie wiem zbyt jak tu uwzględnić kierunek przesuwania.
P-145596
« 1 »
  Strona 1 z 1