Változó kiíratása c++-ban opengl
2015-11-29T22:49:57+01:00
2015-12-07T21:50:19+01:00
2022-08-18T10:30:46+02:00
gzsolthy
Sziasztok,

Bezier görbét kellene gyártanom, ami meg is van. A T értékét szeretném kiírni a konzolra, mégpedig ahogy a görbe rajzolódik, úgy nőne T értéke is. De hogyan? A glutBitmapCharacter nem jött be. 

Köszönöm előre is a segítséget!
gzsolthy
Mutasd a teljes hozzászólást!
Elvileg a transzformációk (nézeti és leképezési) is vonatkoznak rá. Ha a 40,500 működött, akkor ott amúgy is kell, hogy legyen valami transzformáció, hiszen az eredmény koordinátáknak -1 és 1 között kéne lenniük.
Ilyen példakódot találtam:

glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glRasterPos2f(0,0); glColor4f(1.0f,1.0f,1.0f,1.0f);
//glutBitmapCharacter-es ciklus
glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix();
Mutasd a teljes hozzászólást!

  • Miért nem jött be?

    Haladjunk sorba.
    1. egy karakter kirajzolása.
    2. egy string kiírása a képernyőre.
    Ha ezek mennek, akkor már csak a változó -> string konverzió lehet a probléma.

    Tehát melyik része nem megy?
    Mutasd a teljes hozzászólást!
  • Mert a 800x600as ablakban a görbén és a kontrollpontokon kívűl nem jelenik meg semmi - ami persze nem zárja ki, hogy én rontottam el.

    for(t=0.0; t<=1.0; t+=0.0001){ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, t); }
    Mutasd a teljes hozzászólást!
  • Azon gondolkodtál-e már, hogy a gluBitmapCharacter miért úgy néz ki, hogy 
    "void glutBitmapCharacter(void *font, int character)"?
    A második argumentumnak egy (egy darab) karakternek (nem pedig lebegőpontos számnak) kéne lennie (próbáld ki mondjuk azzal, hogy 'a' <- az aposztrófokat is beleértve). Szóval előbb kalapálj egy sztringet a számodból, majd írasd ki karakterenként (számjegyenként, ha úgy érthetőbb). Vagy keress egy másik függvényt, ami sztringet ír ki. Olyan, ami közvetlenül lebegőpontos számot, szinte biztosan nem lesz.
    Mutasd a teljes hozzászólást!
  • De, elgondolkodtam rajta.

    void BitmapText (GLfloat x, GLfloat y, void *font, char *string){ glRasterPos2f (x, y); int len=(int) strlen (string); for (int j=0; j<len; j++){ glutBitmapCharacter (font, string[j]); } } void onDisplay() { glColor3d (1.0, 0.0, 0.0); BitmapText (40, 500, GLUT_BITMAP_HELVETICA_12, "halihooo"); }


    Ez magában működik, csak már a kódomban nem.
    Mutasd a teljes hozzászólást!
  • Elvileg a transzformációk (nézeti és leképezési) is vonatkoznak rá. Ha a 40,500 működött, akkor ott amúgy is kell, hogy legyen valami transzformáció, hiszen az eredmény koordinátáknak -1 és 1 között kéne lenniük.
    Ilyen példakódot találtam:

    glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glRasterPos2f(0,0); glColor4f(1.0f,1.0f,1.0f,1.0f);
    //glutBitmapCharacter-es ciklus
    glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix();
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget, a kódom átírásával a szöveg megjelenik.
    Mutasd a teljes hozzászólást!
  • Azért nézd meg ezt is:

    #include <iostream> #include <stdlib.h> #include <GL/glut.h> #include <math.h> using namespace std; class Point { public: float x, y; void setxy(float x2, float y2) { x = x2; y = y2; const Point & operator=(const Point &rPoint) { x = rPoint.x; y = rPoint.y; return *this; } }; int factorial(int n) { if (n<=1) return(1); else n=n*factorial(n-1); return n; } float binomial_coff(float n,float k) { float ans; ans = factorial(n) / (factorial(k)*factorial(n-k)); return ans; } Point abc[20]; int SCREEN_HEIGHT = 500; int points = 0; int clicks = 4; void myInit() { glClearColor(1.0,1.0,1.0,0.0); glColor3f(0.0,0.0,0.0); glPointSize(3); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,640.0,0.0,500.0); } void drawDot(int x, int y) { glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); glFlush(); } void drawLine(Point p1, Point p2) { glBegin(GL_LINES); glVertex2f(p1.x, p1.y); glVertex2f(p2.x, p2.y); glEnd(); glFlush(); } Point drawBezier(Point PT[], double t) { Point P; P.x = pow((1 - t), 3) * PT[0].x + 3 * t * pow((1 -t), 2) * PT[1].x + 3 * (1-t) * pow(t, 2)* PT[2].x + pow (t, 3)* PT[3].x; P.y = pow((1 - t), 3) * PT[0].y + 3 * t * pow((1 -t), 2) * PT[1].y + 3 * (1-t) * pow(t, 2)* PT[2].y + pow (t, 3)* PT[3].y; return P; } Point drawBezierGeneralized(Point PT[], double t) { Point P; P.x = 0; P.y = 0; for (int i = 0; i<clicks; i++) { P.x = P.x + binomial_coff((float)(clicks - 1), (float)i) * pow(t, (double)i) * pow((1 - t), (clicks - 1 - i)) * PT[i].x; P.y = P.y + binomial_coff((float)(clicks - 1), (float)i) * pow(t, (double)i) * pow((1 - t), (clicks - 1 - i)) * PT[i].y; } //cout<<P.x<<endl<<P.y; //cout<<endl<<endl; return P; } void myMouse(int button, int state, int x, int y) { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { abc[points].setxy((float)x,(float)(SCREEN_HEIGHT - y)); points++; drawDot(x, SCREEN_HEIGHT - y); if(points == clicks) { glColor3f(0.2,1.0,0.0); for(int k=0;k<clicks-1;k++) drawLine(abc[k], abc[k+1]); Point p1 = abc[0]; for(double t = 0.0;t <= 1.0; t += 0.02) { Point p2 = drawBezierGeneralized(abc,t); cout<<p1.x<<" , "<<p1.y<<endl; cout<<p2.x<<" , "<<p2.y<<endl; cout<<endl; drawLine(p1, p2); p1 = p2; } glColor3f(0.0,0.0,0.0); points = 0; } } } void myDisplay() { glClear(GL_COLOR_BUFFER_BIT); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(640,500); glutInitWindowPosition(100,150); glutCreateWindow("Bezier Curve"); glutMouseFunc(myMouse); glutDisplayFunc(myDisplay); myInit(); glutMainLoop(); return 0; }
    Mutasd a teljes hozzászólást!
abcd