» »

[opengl] Pop-up menu

[opengl] Pop-up menu

archer ::

Z uporabo pop-up menujev v opengl bi rad dodal možnost izbire izpisa izračunanih podatkov.
Program imam sestavljen iz numeričnega dela, kjer računam željene podatke sistema. Nato nadaljujem z grafičnim delom, kjer sistem izrišem in izpišem podatke (v prostoru z bitmap fonti), ki sem jih prej izračunal.

Prvotni izpis podatkov zgleda takole (deluje):
//napisi cevi in rezultatov preračuna
for(i = 0; i<npipes; i++)
{
sprintf(message1, "Cev %d", i);
sprintf(message2, "Q=%.1f l/h", q[i]);
glColor3f(1.0f, 1.0f, -0.3f);
print3D((xroom1[i]+xroom2[i])/2, (yroom1[i]+yroom2[i])/2, zroom1[i]+roomh/2, message1);
print3D((xroom1[i]+xroom2[i])/2, (yroom1[i]+yroom2[i])/2, zroom1[i]+roomh/4, message2);
}


Pri čemer je print3D tale podprogram:
/* PRINT3D */
void print3D(float x, float y, float z, char *string)
{  
char *c;
glRasterPos3f(x, y, z);
for (c=string; *c != '\0'; c++)
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, *c);
}
}


Izris zgleda takole:
 Izgled izrisa

Izgled izrisa



Kot sem že omenil, bi rad imel možnost izbire podatka message2 (druga vrstica vsakega izpisa na sliki zgoraj) preko pop-up menuja, da bi namesto Q-ja izpisal fi oz. L. Poizkusil sem s temle a mi zamenjava ne deluje (menuji se pokažejo ob desnem kliku miške, vendar se message2 ne zamenja):
/* PODMENU IZBOR PODATKOV */
void selectData(int msg)
{
int i;
char message2new[50];

switch (msg) 
{
case 1:
for(i = 0; i<npipes; i++)
{
sprintf(message2new, "fi=%d mm", diameter[i]);
strcpy(message2,message2new);
}
break;

case 2:
for(i = 0; i<npipes; i++)
{
sprintf(message2new, "L=%.2f m", length[i]);
strcpy(message2,message2new);
}
break;
}
}


Bi mogoče prosim kdo znal pomagati. Če sem napisal nerazumljivo prosim povejte, kaj še dodam.
Hvala!
  • spremenilo: archer ()

archer ::

Pozabil sem omeniti. V OpenGL-u sem popolni začetnik. Malo si pomagam s primeri, ki jih najdem na netu. Za ta izpis podatkov sem program gradil na tem primeru: bitmap.c @ OpenGL.org

Senitel ::

Vprasanje kako dejansko renderiras, oziroma kdaj delas redraw. Ampak selectData ti sicer spremeni message2, ce pa prides za redraw nazaj v prvi del kode, ki si jo postal, potem bo ta del povozil message2.

archer ::

Aha, razumem. Hvala za odgovor!
Verjetno se res zgodi to. Tu imam sicer še main del programa:
int main(int argc, char *argv[])
{

/* BRANJE VHODNE DATOTEKE IN DODELITEV VREDNOSTI SMERNE MATRIKE */
read_input();
/* DOLŽINE CEVI */
if(verzija >= 2.0 && verzija <= 2.9)
dolzine_cevi();
/* IZPIS SISTEMA */
print_pipes();
/* IZPIS SMERNE MATRIKE */
//print_direction_matrix();
/* VNOS ZAÄŚETNIH PRETOKOV */
zacetni_pretoki();
/* KONSTANTE N K CEVI */
calculate_n_k_pipe(0, 16.0, 0.1*0.1, 230.0, 10.0*0.1);
calculate_n_k_pipe(1, 32.0, 0.1*0.1, 400.0, 7.0*0.1);
calculate_n_k_pipe(2, 65.0, 0.1*0.1, 365.0, 2.0*0.1);
/* KONSTANTE N K VENTILI */
calculate_n_k_valve(0, 0.01*3600, 5.5, 0.031*3600, 50.0);
calculate_n_k_valve(1, 0.01*3600, 1.2, 0.062*3600, 50.0);
calculate_n_k_valve(2, 0.01*3600, 1.0, 0.08*3600, 50.0);
calculate_n_k_valve(3, 0.017*3600, 1.0, 0.11*3600, 50.0);
calculate_n_k_valve(4, 0.025*3600, 1.0, 0.17*3600, 50.0);
calculate_n_k_valve(5, 0.029*3600, 1.0, 0.195*3600, 50.0);
calculate_n_k_valve(6, 0.031*3600, 1.0, 0.215*3600, 50.0);
/* TLAK ÄŚRPALKE */
calculate_pump_c();
/* POSTAVITEV SISTEMA */
postavitev_sistema();
/* ZAPIS MATRIKE m IN VEKTORJA b */
matrika_vektor();
/* IZPIS MATRIKE m */
//print_matrix_m();
/* IZPIS VEKTORJA b */
//print_vector_b();
/* REĹ EVANJE SISTEMA */
resevanje();
/* Matrika m in vektor b po konÄŤanih iteracijah */
//print_matrix_m();
//print_vector_b();
/* PODATKI IZRAÄŚUN */
podatki_izracun();
printf("\n");

/* IZRIS GRAFIKE */
if(verzija >= 2.0 && verzija <= 2.9)
{
/* RAZDALJA MED CEVMI */
dcevi();
printf("\n##  MENU POMOÄŚ: Pritisni H.  ##\n\n");
/* MAKSIMALEN PRETOK */
FindMaxQ();
/* MINIMALEN PRETOK */
FindMinQ();
/* MAKSIMALNE KOORDINATE SOB */
FindMaxCoor();
/* MINIMALNE KOORDINATE SOB */
FindMinCoor();

glutInit(&argc, argv);
trackball(cur, 0.0, 0.0, 0.0, 0.0);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
glutInitWindowSize(700, 700);
glutInitWindowPosition(700, 80);
glutCreateWindow("Izgled napeljave talnega gretja");
/* REDRAW */
glutDisplayFunc(redraw);
/* MOUSE */
glutMouseFunc(mouse);
/* MOTION */
glutMotionFunc(motion);
/* MOUSEWHEEL */
glutMouseWheelFunc(mouseWheel);
/* RESHAPE */
glutReshapeFunc(reshape);
/* KEYBOARD */
glutKeyboardFunc(keyboard);
/* TICK */
glutIdleFunc(tick);
/* PODMENU IZBOR PODATKOV */
int data_submenu;
data_submenu = glutCreateMenu(selectData);
glutAddMenuEntry("Premer cevi", 1);
glutAddMenuEntry("Dolzina cevi", 2);
/* GLAVNI MENU */
glutCreateMenu(selection);
glutAddSubMenu("Izracunani podatki", data_submenu);
glutAddMenuEntry("Help", 0);
glutAddMenuEntry("Izhod", 1);
glutAttachMenu(GLUT_RIGHT_BUTTON);

glutMainLoop();
}
return EXIT_SUCCESS;
}


Obstaja kakšna enostavna možnost, da tole popravim, da bo delovalo??

Senitel ::

Ja kodo moras popravit tako, da bos pred print3D spravil pravo stvar v message2... As simple as that.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[ACCESS] Pomoč

Oddelek: Programiranje
81681 (1478) Stewie
»

Sms ni prišel do naslovnika?

Oddelek: Mobilne tehnologije
4013804 (12330) kunigunda
»

[PHP] Uporaba ReCaptcha

Oddelek: Programiranje
152487 (2142) Blisk
»

T-2 telefonija krši zasebnost uporabnikov ?! In pravni vidik ?

Oddelek: Omrežja in internet
426917 (5521) ales85
»

Kako pobrat podatke iz datoteke

Oddelek: Programiranje
71186 (925) Trancedeejay

Več podobnih tem