Jump to content



Βοήθεια για opengl!


mhche

Recommended Posts

Σε ευχαριστώ ειλικρινά για την βοήθεια σου,όμως δεν δείχνουν κάτι παραπάνω.Μάλλον καλύτερα δεν εξηγούν απ'άυτά που ξέρω.

Αν βρω άκρη, μακάρι! ,θα ενημερώσω. Αν υπάρχει κάποιος να βοηθήσει,θα μαι ευγνώμων γιατί είναι μεγάλη ανάγκη.

Το OpenGL είναι δύσκολο γενικά και έχει πολλά μαθηματικά. Αυτό δεν θα αλλάξει γιατί όλα τα σχήματα στον σχεδιάζονται από σημεία στον χώρο και όλες οι κινήσεις πραγματοποιούνται με μετασχηματισμούς. Έχεις πολύ θεωρία από πίσω και όπως ανέφεραν ήδη αρκετά μαθηματικά.

Γνώμη μου έιναι να αρχίσεις από κάτι απλό όπως ένα τρίγωνο σε 2 διαστάσεις και αγότερα να περάσεις σε 3 για να καταλαβεις τι παίζει. Αν θυμάμαι καλά (έχουν περάσει και 10 χρόνια από τότε) για να κουνήσεις ένα αντικείμενο πρέπει:

- Να πάρεις όλα τα σημεία του αντικειμένου και να υπολογίσεις στο buffer το νέο σημείο

- Να σχηματίσεις το αντικείμενο στο buffer

- Να αντιστρέψεις το master και το background buffer

(Συγνώμη για την ορολογία, πραγματικά δεν το θυμάμαι πως λέγονται)

Πιθανών μετά από τόσα χρόνια κάτι άλλο να έχει βγει για να σοθ κάνει τη ζωή πιο εύκολη.

Επίσης νομίζω ότι μπορείς να σχεδιάσεις με κάποιο άλλο πρόγραμμα το αντικείμενο και μετά να το κάνεις import, διαβασε σχετικά για 'importing 3d objects to openGL' στο internet

Ένα βασικό tutorial για OpenGL που φαντάζομαι το ξέρεις είναι: NeHe Productions - Everything OpenGL

Εγώ από εκεί έμαθα και έκανα κάτι απλό γενικά (όχι αεροπλάνο) :D

Υ.Γ.: Υπάρχουν και wrappers / libraries που σου δίνουν εύκολα εργαλεία που πατάνε πάνω στην OpenGL. Απλά δεν τα είχα χρησιμοποιήσει τότε (ίσως και να μην υπήρχαν)

Link to comment
Share on other sites

Εγώ(όντας προφανώ άσχετος από opengl) θα ήθελα να θέσω ένα τελείως αρχάριο ερώτημα:

είναι δουλέψουμε opengl σε dev c++?

Αν ναι,τι απαιτείται(ποιες βιβλιοθήκες κλπ) και πως τις κατεβάζουμε? :suicide2:

Link to comment
Share on other sites

Καλά, δίγουρα δεν κάνει πλέον ούτε για εκπαιδευτικούς σκοπούς, είναι πολύ αδύναμο, ειδικά ο compiler του είναι ότι χειρότερο. Μάλλον codeblocks θα συμβεί

Link to comment
Share on other sites

Λοιπόν,μετά απο διάβασμα κατανόησα κάποια και κάποια άλλα όχι βέβαια :p

Βρήκα έναν πολύ ενδιαφέρον κώδικα απο ένα ρολόι,τον οποίο κατάλαβα μερικώς.Μήπως υπάρχει κάποιος να μου εξηγήσει μερικά πράγματα; Είναι σε c++ .

Δεν τον ποστάρω γιατί δεν ξέρω αν γίνεται κάτι με δικαιώματα κλπ.

Link to comment
Share on other sites

Ωραία,παραθέτω τον κώδικα και τις απορίες μου.Ο κώδικας ξαναλέω δεν είναι δικός μου,είναι σχεδόν αυτούσιος εκτός απο μία συνάρτηση μενού που δεν πρόκειτε να χρησιμοποιήσω και την έχω βγάλει.

Συγχωρήστε με εκ των προτέρων αν είναι ολίγον τι "χαζές" οι απορίες μου.Τις έχω βάλει σε σχόλια δίπλα σε κάθε γραμμή που δεν καταλαβαίνω.

Ευχαριστώ.


#include <GL/glut.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> //προσπερνάμε τα include

// define glu objects
int about_int=0; //ποια η χρησιμότητα αυτής της μεταβλητής;

GLUquadricObj *Cylinder; //ορίζουμε ένα σχήμα κυλίνδρου
GLUquadricObj *Disk; //ορίζουμε ένα σχήμα δίσκου

struct tm *newtime; //απ'ότι ξέρω με αυτόν τον τρόπο ορίζουμε τελεστή για την ώρα
time_t ltime; //

int M_TWOPI=0; //μια μεταβλητή που χρησιμοποιείται μόνο μια φορά στη συνάρτηση TimeEvent και δεν καταλαβαίνω την χρησιμότητα της και γιατί δεν βάζουμε κατευθίαν =0

GLfloat rx, ry, rz, angle;

// lighting
/*GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightPosition[]= { 5.0f, 25.0f, 15.0f, 1.0f };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; */ ορίζουμε τους φωτισμούς

static int light_state = 1; // light on = 1, light off = 0 μεταβλητή κατάστασης φωτισμού
static int view_state = 1; // Ortho view = 1, Perspective = 0 μεταβλητή κατάστασης προβολής

void Sprint( float x, float y, char *st) //αυτή η συνάρτηση απ'οτι έχω καταλάβει βάζει κείμενο στην οθόνη μας
{
int l,i;

l=strlen( st );
glRasterPos3f( x, y, -1);
for( i=0; i < l; i++) //εδώ γιατί χρησιμοποιούμε την for αφού είναι για μία φορά;
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st[i]);
}

}

static void TimeEvent(int te) //εδώ δεν έχω καταλάβει πολλά πράγματα
{

rx = 30 * cos( angle ); //τι ακριβώς κάνουν αυτές οι μεταβλητές;
ry = 30 * sin( angle ); //
rz = 30 * cos( angle ); //
angle += 0.01; //γιατί προσθέτουμε 0.01 στην γωνία;
if (angle > M_TWOPI) angle = 0; //ποιος ο λόγος της M_TWOPI; και δεν βάζουμε κατευθίαν =0;

glutPostRedisplay();
glutTimerFunc( 100, TimeEvent, 1);
}

void init(void) //εδώ ορίζουμε φωτισμούς και σχήματα
{


glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
// Lighting is added to scene
glLightfv(GL_LIGHT1 ,GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1 ,GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1 ,GL_POSITION, LightPosition);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);


Cylinder = gluNewQuadric();
gluQuadricDrawStyle( Cylinder, GLU_FILL);
gluQuadricNormals( Cylinder, GLU_SMOOTH);
gluQuadricOrientation( Cylinder, GLU_OUTSIDE);
gluQuadricTexture( Cylinder, GL_TRUE);

Disk = gluNewQuadric();
gluQuadricDrawStyle( Disk, GLU_FILL);
gluQuadricNormals( Disk, GLU_SMOOTH);
gluQuadricOrientation( Disk, GLU_OUTSIDE);
gluQuadricTexture( Disk, GL_TRUE);


}

void Draw_gear( void ) //εδώ σχεδιάζει ένα γρανάζι,αλλά γιατί το κάνουμε αυτο;
{

int i;
glPushMatrix();
gluCylinder(Cylinder, 2.5, 2.5, 1, 16, 16);
gluDisk(Disk, 0, 2.5, 32, 16);
glTranslatef(0,0,1);
gluDisk(Disk, 0, 2.5, 32, 16);
glPopMatrix();
for( i = 0; i < 8; i++)
{
glPushMatrix();
glTranslatef( 0.0, 0.0, 0.50);
glRotatef( (360/8) * i, 0.0, 0.0, 1.0);
glTranslatef( 3.0, 0.0, 0.0);
glutSolidCube( 1.0 );
glPopMatrix();
}


}

void Draw_clock( GLfloat cx, GLfloat cy, GLfloat cz ) //εδώ σχεδιάζουμε το ρολοι
{

int hour_ticks , sec_ticks;
glPushMatrix();
glTranslatef(cx,cy,cz);
glRotatef( 180, 1.0, 0.0, 0.0);

/*glPushMatrix(); // Draw large wire cube (outside of disk clock)
glColor3f(1.0, 1.0, 1.0);
glTranslatef( 0.0, 0.0, 6.0);
glutWireCube(14.0);
glPopMatrix();*/

glPushMatrix(); // Draw clock face
glTranslatef( 0, 0, 1.0);
gluDisk(Disk, 0, 6.75, 32, 16);
glPopMatrix();

glPushMatrix();// Draw hour hand
glColor3f(1.0, 0.5, 0.5);
glTranslatef( 0, 0, 0.0);
glRotatef( (360/12) * newtime->tm_hour + (360/60) * (60 / (newtime->tm_min+1)), 0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef(0.0, 0.0, 2.0);
Draw_gear();
glPopMatrix();
glRotatef( 90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.75, 0, 4, 16, 16);
glPopMatrix();

glPushMatrix();// Draw minute hand
glColor3f(1.0, 0.5, 1.0);
glTranslatef( 0, 0, 0.0);
glRotatef( (360/60) * newtime->tm_min, 0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef(0.0, 0.0, 3.0);
glScalef(0.5, 0.5, 1.0);
Draw_gear();
glPopMatrix();
glRotatef( 90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.5, 0, 6, 16, 16);
glPopMatrix();

glPushMatrix();// Draw second hand
glColor3f(1.0, 0.0, 0.5);
glTranslatef( 0, 0, -0.0);
glRotatef( (360/60) * newtime->tm_sec, 0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef(0.0, 0.0, 4.0);
glScalef(0.25, 0.25, 1.0);
Draw_gear();
glPopMatrix();
glRotatef( 90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.25, 0, 6, 16, 16);
glPopMatrix();


for(hour_ticks = 0; hour_ticks < 12; hour_ticks++) //δεν νομίζω να δουλεύει γιατί οι δείκτες δεν γυρνάνε
{
glPushMatrix();// Draw next arm axis.
glColor3f(0.0, 1.0, 1.0); // give it a color
glTranslatef(0.0, 0.0, 0.0);
glRotatef( (360/12) * hour_ticks, 0.0, 0.0, 1.0);
glTranslatef( 6.0, 0.0, 0.0);
glutSolidCube(1.0);

glPopMatrix();
}

for(sec_ticks = 0; sec_ticks < 60; sec_ticks++) //ομοίως δεν νομίζω να δουλεύει γιατί οι δείκτες δεν γυρνάνε
{
glPushMatrix();
glTranslatef(0.0, 0.0, 0.0);
glRotatef( (360/60) * sec_ticks, 0.0, 0.0, 1.0);
glTranslatef(6.0, 0.0, 0.0);
glutSolidCube(0.25);
glPopMatrix();
}


glPopMatrix();

}

void num() //εδώ βάζουμε νούμερα στο ρολόι μας
{
if(view_state == 1)
{
glColor3f( 0.0, 0.0, 1.0);
Sprint(-6.2,-0.2,"9"); //counting from center
Sprint(-0.2,-6.2,"6");
Sprint(-0.4,5.7,"12");
Sprint(5.8,-0.2,"3");
}
}

void about() //πληροφορίες για το ρολόι μας
{
//glClear(GL_COLOR_BUFFER_BIT);
glColor3f( 1.0, 1.0, 1.0);
Sprint(-5,-2,"This project implements the clock");
Sprint(-5,-2.8," Both Wall clock and digit clock");
Sprint(-5,-3.6," is displayed");
Sprint(-5,-4.4," Clock shows the local time");
Sprint(-5,-5.2," fetching from computer");
//glFlush();
}

void display_clock() //απεικόνιση του ρολογιού
{
time(&ltime); // Get time
newtime = localtime(&ltime); // Convert to local time

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// easy way to put text on the screen.
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(-8.0, 8.0, -8.0, 8.0, 1.0, 60.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);

// Put view state on screen
glColor3f( 1.0, 1.0, 1.0);
if (view_state == 0 && about_int==0)
{
Sprint(-3, -4, "Perspective view");
}
else if (view_state != 0 && about_int==0)
{
Sprint(-2, -4, "Ortho view");
}
else
{
about();
}


Sprint(-4,-7.7, asctime(newtime));

// Turn Perspective mode on/off
if (view_state == 0)
{
glMatrixMode (GL_PROJECTION);
glLoadIdentity();

gluPerspective(60.0, 1, 1.0, 60.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( rx, 0.0, rz, 0.0, 0.0, -14.0, 0, 1, 0);
}

if (light_state == 1)
{
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL); // Enable for lighing
}else
{
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL); // Disable for no lighing
}

Draw_clock( 0.0, 0.0, -14.0);
num();
glutSwapBuffers();
}


void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
display_clock();
glFlush();
}

void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (50, 50);
glutCreateWindow (argv[0]);
glutSetWindowTitle("GLclock");
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc( 10, TimeEvent, 1);
glutMainLoop();
return 0;
}

Link to comment
Share on other sites

wall of text incomingggg!!!!

void Sprint( float x, float y, char *st) //αυτή η συνάρτηση απ'οτι έχω καταλάβει βάζει κείμενο στην οθόνη μας

{

int l,i;

l=strlen( st );

glRasterPos3f( x, y, -1);

for( i=0; i < l; i++) //εδώ γιατί χρησιμοποιούμε την for αφού είναι για μία φορά;

{

glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st);

}

Κάνει for για να πάρει όλους τους χαρακτήρες του string st.Δέχεται σαν όρισμα σε float (δεκαδικός) τις συντεταγμένες x και y και το string st.Το δείχνει με το for χαρακτήρα χαρακτρήρα όμως.

Το Μ_ΤWOPI φαίνεται να είναι από εδώ

Old Nabble - Graphviz - Interest - need help producing a circular graph with twopi or dot

twopi is its own layout program. It is a radial layout. That is, one

node is placed in the center; the nodes connected to the center node

are placed on a circle around it; any remaining nodes connected to those

nodes are placed on the next circle,; and so on.

It can be a very effective layout in certain contexts. It is very fast,

and can be used on large graphs.

The main problem with the algorithm is that it is very sensitive to the

choice of the center node. Choosing one node for the

center will produce a beautiful layout. Choosing another node will

create a mess.

The program uses the same rendering parameters as the rest of Graphviz.

The attributes specific to twopi, which affect the layout,

can be found by looking for "twopi" in

Node, Edge and Graph Attributes

ΤimeEvent

glutTimerFunc

void glutTimerFunc(unsigned int msecs, void (*func)(int value), value);

Eσένα την καλεί ως εξής glutTimerFunc( 10, TimeEvent, 1);

στην ουσία κάθε 10 msec καλείται η TimeEvent με όρισμα 1

Η timevent υποθέτω ότι είναι για να δει αν πρέπει να αλλάξει τον χρόνο (Δηλαδή να κάνει redraw) επίσης τα rx,ry,rz μου φέρνουν σαν πολικές συντεταγμένες.Από wikipedia

Η σχέση μεταξύ πολικών (r,θ) και καρτεσιανών (x,y) συντεταγμένων στο επίπεδο δίνεται από τις παρακάτω σχέσεις μετατροπής:

84cbdfcd9c72e3c78e08c867b49f614f.png

r = 30 θ = angle.Το ρολοί είναι 2d για αυτό χρησιμοποιεί πολικές.Έχεις μια ακτίνα υποθέτω 30 και το angle (γωνία) από ένα σταθερό "δείκτη" πχ από το κέντρο του ρολογιού και στις 12 η ώρα.Το opengl είναι 3d άρα x,y,z.

Link to comment
Share on other sites

Για τα αστέρια αν είναι στατικά βρες ένα απλό texture και βάλτο σαν "background" στην σκηνή σου.Αν οχι τα προσθέτεις οπως τους πλανήτες αλλά με μικρότερο scale.

Για τα orbits απο οτι λέει στο δεύτερο παράδειγμα η

void generateCircle() function is doing that...

Δεν τα δείχνει καθόλου ή τα βγάζει σε λάθος σημείο?Από οτι βλέπω προσθέτει για 3 μόνο πλανήτες.Για όλους θα πρέπει να βάλεις το loop όσες φορές λείπει.

Link to comment
Share on other sites

Έψαξα πολύ περισσότερο και τελικά βρήκα κάτι πολύ κοντά σ'αυτό που θέλω, καμία σχέση ηλαδή με το κοινό μας παράδειγμα.

Τα αστέρια τα έβαλα σαν απλά GL_POINTS και τις τροχιές κανονικά orbits, με μόνη διαφορά ότι φτιάχνω κάθε φορά καινούριο κύκλο κι αυτό είναι κάπως κουραστικό. Έπρεπε να χρησιμοποιήσω struct, αλλά έχω τελειώσει σχεδόν του 6/8 πλανήτες.

Το θέμα είναι πως θα βάλω bitmap textures :wall:

Link to comment
Share on other sites

To πρώτο πράδειγμα απο το ποστ #32 λέει πως.

 LoadGLTextures();               // Load the textures
glEnable(GL_TEXTURE_2D);

GLvoid LoadGLTextures(GLvoid) {
// Stores the texture
Image *imagesun;
Image *image[9];
int i;
// Allocate space for texture
imagesun = (Image *) malloc(sizeof(Image));
for(i=0;i<9;i++)
image[i] = (Image *) malloc(sizeof(Image));

if (imagesun==NULL || image[1] == NULL || image[2] == NULL || image[3] == NULL ||image[4] == NULL||image[5] == NULL||image[6] == NULL||image[7] == NULL||image[8] == NULL) { //checking for error while allocating space
printf("Error allocating space for image");
exit(0);
}

if (!ImageLoad("sun.bmp", imagesun)) { //loading images(sun,planets,moons)
exit(1);
}

if (!ImageLoad("mercury.bmp", image[1])) {
exit(1);
}
if (!ImageLoad("venus.bmp", image[2])) {
exit(1);
}
if (!ImageLoad("earth.bmp", image[3])) {
exit(1);
}
if (!ImageLoad("mars.bmp", image[4])) {
exit(1);
}
if (!ImageLoad("jupiter.bmp", image[5])) {
exit(1);
}
if (!ImageLoad("saturn.bmp", image[6])) {
exit(1);
}
if (!ImageLoad("uranus.bmp", image[7])) {
exit(1);
}
if (!ImageLoad("neptune.bmp", image[8])) {
exit(1);
}

glGenTextures(3, &texture[0]); // create Texture

glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // cheap scaling when image bigger than texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // cheap scaling when image smalled than texture

// 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image,
glTexImage2D(GL_TEXTURE_2D, 0, 3, imagesun->sizeX, imagesun->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, imagesun->data); // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
for(i=1;i<9;i++)
{
glGenTextures(3, &texture[i]); // texture 2 (linear scaling)
glBindTexture(GL_TEXTURE_2D, texture[i]); // 2d texture (x and y size)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, image[i]->sizeX, image[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image[i]->data); // texture 3 (mipmapped scaling)
}
}

int ImageLoad(char *filename, Image *image) {
FILE *file;
unsigned long size; // size of the image in bytes.
unsigned long i; // standard counter.
unsigned short int planes; // number of planes in image (must be 1)
unsigned short int bpp; // number of bits per pixel (must be 24)
char temp; // used to convert bgr to rgb color.
// Checkin for the file exists
if ((file = fopen(filename, "rb"))==NULL)
{
printf("File Not Found : %s\n",filename);
return 0;
}
// Skip to bmp header
fseek(file,18, SEEK_CUR);
// read width
if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
printf("Error reading width from %s.\n", filename);
return 0;
}
printf("Width of %s: %lu\n",filename, image->sizeX);
//read the height
if ((i = fread(&image->sizeY,4,1,file)) != 1) {
printf("Error reading height from %s.\n", filename);
return 0;
}
printf("Height of %s: %lu\n", filename, image->sizeY);
size = image->sizeX * image->sizeY * 3;
// read the planes
if ((fread(&planes, 2, 1, file)) != 1) {
printf("Error reading planes from %s. \n", filename);
return 0;
}
if (planes != 1) {
printf("Planes from %s is not 1: %u\n", filename, planes);
return 0;
}
// read the bpp
if ((i = fread(&bpp, 2, 1, file)) != 1) {
printf("Error reading bpp from %s. \n", filename);
return 0;
}
if (bpp != 24) {
printf("Bpp from %s is not 24: %u\n", filename, bpp);
return 0;
}
// seek past the rest of the bitmap header
fseek(file, 24, SEEK_CUR);
// Read the data
image->data = (char *) malloc(size);
if (image->data == NULL) {
printf("Error allocating memory for colour-corrected image data");
return 0;
}

if ((i = fread(image->data,size,1,file)) != 1) {
printf("Error reading image data from %s.\n", filename);
return 0;
}

// reverse all of the colours bgr => rgb)
for (i=0;i<size;i+=3) {
temp = image->data[i];
image->data[i] = image->data[i+2];
image->data[i+2] = temp;
}
return 1;
}

Link to comment
Share on other sites

[MENTION=1215]nucleus[/MENTION] σε ευχαριστώ πολύ.

Μήπως μπορείς και να μου εξηγήσεις γιατί κάνουμε το angle += 0.01; Η angle θα είναι πάντα 0;

Καμία ιδέα γιατί δεν γυρνάν οι δείκτες;

Η βοηθειά σου είναι πολύτιμη και πάλι σε ευχαριστώ.

Link to comment
Share on other sites

To angle δεν είναι πάντα 0.Η angle καθορίζει την κίνηση των δεικτών.προσθέτει το +0.01 για να δείξει την κίνηση των δευτερολέπτων υποθέτω.Γιατί δεν γυρνάνε οι δείκτες?


void display_clock() //απεικόνιση του ρολογιού
{
time(&ltime); // Get time
newtime = localtime(&ltime); // Convert to local time

Εδώ παίρνει την ώρα του συστήματος και την δείχνει σίγουρα το κάνει σωστά αυτό?ίσως να χρειάζεται αλλαγές εδώ (δεν έχω ιδέα ποιές συναρτήσεις στην C παίρνουν ώρα συστήματος)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.