Primo Precedente 2 di 2
  1. L'avatar di Slimmy SlimmySlimmy è offline #16
    27-06-08 13:47

    Vero... anche la tabella hash è utilizzabile.. a questo punto dipende come deve effettuare l'accesso..

    EDIT:
    ho letto ora la risposta...
    Se la lettura è sequenziale allora vada per la lista..
    Rispondi con Citazione 

  2. L'avatar di devilheart devilheartdevilheart è offline #17
    27-06-08 14:25

    Citazione TheFury88 Visualizza Messaggio
    Però da quanto ho letto, qer come le uso io le liste hanno la stessa complessità c delle tabelle, cioè 1.
    Infatti io leggerei gli elementi in ordine da 0 a n-1.
    veramente la complessità totale è n. una tabella ti serve se in un secondo momento devi riaccedere ad un particolare elemento della lista
    Rispondi con Citazione 

  3. L'avatar di TheFury88 TheFury88TheFury88 è offline #18
    28-06-08 11:34

    Il problema è che le tabelle non le abbiamo studiate, e quindi partirei in svantaggio, ho letto solo una paginetta scarsa presa da google.

    Comunque mi capita una cosa strana: quando metto i vertici nella lista nell'ordine delle facce, in modo da dover renderizzare i vertici dalla prima all'ultima posizione della lista, mi trova il numero corretto di vertici ma sono tutti 0!
    Guardate:

    Codice:
    MODELLO 
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    .....................................
    continua...
    .......................................
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    MODELLO 
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    ..............................................
    .............................................
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    Faccia: a->0.000000 0.000000 0.000000 b->0.000000 0.000000 0.000000 c-> 0.000000 0.000000 0.000000
    La cosa strana è che il numero di modelli è corretto, e il numero di facce è proprio quello che mi aspetto... (si, le ho contate una ad una)
    quindi le operazioni sulle liste le faccio al momento giusto.

    Questo è il codice, non spaventatevi se alcuni nomi sembrano ridicoli...
    Codice:
        scena S = creaScena();                    // crea la scena
        modScena mS = inizioScena(S);            // si sposta all'inizio della scena
        posizione p;                            // posizione per spostarsi tra le facce del modello
        
        // ---------------------------------
        // conta il numero di oggetti
        // ---------------------------------
        FILE *file = fopen("Livelli/liv_1_Scene.obj", "r");        // apre il file in lettura
        char fbegin[10], fend[15], ftmp1[15], ftmp2[15];
        float  x, y, z;
        while ( ! feof(file))            // loop attraverso il file
        {
            stato = fscanf(file, "%s", fbegin);
    
            // ora preleva le facce
            if(fbegin[0] == 's')
            {
                stato = fscanf(file, "%s", fbegin);
                mS->Modello = creaModello();                // crea un modello della scena
                p = inizioModello(mS->Modello);            // sposta la posizione all'inizio del modello corrente
                do
                {    
                    stato = fscanf(file, "%s %2d%*5s%2d%*5s%2d%*5s", fbegin, &a, &b, &c);
                    printf("fbegin vale :\t%s\n", fbegin);
                    printf("Faccia :\t%d\t%d\t%d\n", a, b, c);
                    nuovaFaccia(va[n_oggetti-1][a],va[n_oggetti-1][b],va[n_oggetti-1][c], &p);
                    if(fbegin[0] == 'o')
                        break;        // esce per caricare il nuovo oggetto
                }
                while((fbegin[0] == 'f') && (stato != EOF));
                printf("\n FINE MODELLO \n");
                // crea un nuovo modello vuoto per dopo.
                nuovoModello(mS->Modello, &mS);
                //printf("TOTALE DI OGGETTI contati : %d\n", n_oggetti);
    
            }
    
            // legge il nome di un oggetto, e inizia a prelevarne i dati
            if(fbegin[0] =='o' && (fbegin[1] !='f'))
            {
                // crea un nuovo modello della scena
                contaVertici = 0;
                stato = fscanf(file, "%s", fbegin);
                printf("Nome Oggetto : %s\n", fbegin);
                do
                {
                    stato = fscanf(file, "%s %f %f %f", fbegin, &x, &y, &z);
                    if ((fbegin[0] == 'v') && (fbegin[1] != 'n'))
                    {
                        // carica il vertice nel vettore dei vertici
                        va[n_oggetti][contaVertici].x = x;
                        va[n_oggetti][contaVertici].y = y;
                        va[n_oggetti][contaVertici].z = z;
                    }
                    else if (fbegin[1] == 'n')
                    {
                        // se ci sono preleva le normali
                        printf("fbegin vale %s\n", fbegin);
                        //printf("Normale %00d:\t%f\t%f\t%f\n", n_normali[n_oggetti], x, y, z);
                        n_normali[n_oggetti] ++;                // incrementa il numero di facce dell'oggetto corrente
                    }
                    contaVertici ++;                    // incrementa il contatore di vertici
                }
                while(fbegin[0] == 'v');                // conta tutti i vertici
                
    
                // controlli
                //printf("TOTALE DI OGGETTI contati : %d\n", n_oggetti);
                //printf("TOTALE DI VERTICI : %d\n", n_vertici[n_oggetti]);
                //printf("TOTALE DI NORMALI : %d\n\n\n", n_normali[n_oggetti]);
                
                n_oggetti ++;            // incrementa il contatore di oggetti nella scena.
            }
    
        }
        fclose(file);                        // chiude il file
    
    // successione di controlli
            mS = inizioScena(S);        // si sposta all'inizio della scena
            while(! fineScena(mS, S))
            {
                printf("MODELLO \n");
                p = inizioModello(mS->Modello);        // si posiziona alla prima faccia del modello corrrente
                while( ! fineModello(p, mS->Modello))
                {
                    printf("Faccia: a->%f %f %f b->%f %f %f c-> %f %f %f\n", p->a.x, p->a.y, p->a.z,
                                                                             p->b.x, p->b.y, p->b.z,
                                                                             p->c.x, p->c.y, p->c.z);
                    p = facciaDopo(p);
                }
                mS = modelloDopo(mS);            // èassa al modello successivo
                //printf("FACCIA: %f,%f,%f||%f,%f,%f||%f,%f,%f\n", mS->Modello->a.x,mS->Modello->a.y,mS->Modello->a.z,mS->Modello->b.x,mS->Modello->b.y,mS->Modello->b.z);
            }

    Le strutture sono definite cosi:
    Codice:
    struct VERTICE
    {
        float x,y,z;
    };
    typedef VERTICE verts;
    
    // definisce i tipi di dato che fanno uso della struttura FACCIA
    typedef struct FACCIA * modello;
    typedef struct FACCIA * posizione;
    
    // struttura per la faccia di un poligono
    struct FACCIA
    {
        posizione prima;            // faccia precedinte da disagnare
        verts a, b, c;
        posizione dopo;                // faccia successiva da disegnare
    };
    
    typedef struct SCENA * modScena;        // pr spostarsi tra un modello e l'altro
    typedef struct SCENA * scena;
    
    // struttura per una scena formata da più modelli
    struct SCENA
    {
        modScena precedente;            // modello precedente della scena
        modello Modello;                // istanza della struttura che contiene un modello
        modScena successivo;            // modello successivo della scena
    };
    Mi potete spiegare perchè tutti i miei vertici valgono 0, nonostante evidentemente percorra tutte le facce e li inserisca correttamente?
    Rispondi con Citazione 

 
Primo Precedente 2 di 2