Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] funzioni di controllo spaziale

    In pratica io ho il programma seguente (scusate ma non so come si scrive con i TAG) che deve prendere le dimensioni di un container, il numero di pacchi contenuti e le dimensioni dei pacchi contenuti e verificare se sbordano, se non si compenetrano e se sono stabili.
    Il problema è che mi da sempre errore di compenetrazione anche quando non c'è.
    Allego il file e alcuni esempi:

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_PACCHI 100
    #define MAX_VOL 100

    struct coordinate
    {
    double x;
    double y;
    double z;
    };

    struct Pacco
    {
    struct coordinate posizione;
    struct coordinate dimensioni;
    }pacchi[MAX_PACCHI];

    int WrongPosition (struct coordinate posizione, struct coordinate dimensioni, struct coordinate container);
    int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni);
    int Stabilita (struct coordinate posizione, struct coordinate dimensioni);

    int main(int argc, char *argv[])
    {

    long int TotalVolume=0;
    long int i,j, numpacchi;
    FILE *fp;
    struct coordinate container;

    if (argc!=2)
    {
    printf("\ne' necessario allegare 1 file.\n");
    exit (EXIT_FAILURE);
    }

    if ((fp=fopen(argv[1],"r"))==NULL)
    {
    printf("\nil file non è stato trovato.\n");
    exit (EXIT_FAILURE);
    }
    fscanf(fp,"%lf %lf %lf", &container.x, &container.y, &container.z);
    fscanf(fp,"%ld", &numpacchi);
    //Verifica che il volume totale non superi quello del container
    for(i=0; i<numpacchi; i++)
    {
    fscanf(fp,"%lf %lf %lf", &pacchi[i].posizione.x, &pacchi[i].posizione.y, &pacchi[i].posizione.z);
    fscanf(fp,"%lf %lf %lf", &pacchi[i].dimensioni.x, &pacchi[i].dimensioni.y, &pacchi[i].dimensioni.z);
    TotalVolume += pacchi[i].dimensioni.x * pacchi[i].dimensioni.y * pacchi[i].dimensioni.z;

    if (TotalVolume >= (container.x * container.y * container.z))
    {
    printf ("Container sottodimensionato.\n");
    return -1;
    }
    ;
    if (WrongPosition(pacchi[i].posizione, pacchi[i].dimensioni, container))
    {
    printf ("Il pacco #%ld e' in posizione scorretta.\n", i);
    return -1;
    }

    for (j=i+1; j<numpacchi; j++)
    {
    if (Compenetrazione(pacchi[MAX_PACCHI].posizione, pacchi[MAX_PACCHI].dimensioni))
    {
    printf ("Compenetrazione tra pacchi.\n");
    return -1;
    }
    if (Stabilita(pacchi[MAX_PACCHI].posizione, pacchi[MAX_PACCHI].dimensioni))
    {
    printf ("Mancata stabilità tra pacchi.\n");
    return -1;
    }
    }
    }
    return 0;
    }

    int WrongPosition (struct coordinate posizione, struct coordinate dimensioni, struct coordinate container)
    {
    if ((posizione.x + dimensioni.x > container.x) ||
    (posizione.y + dimensioni.y > container.y) ||
    (posizione.z + dimensioni.z > container.z))
    {
    return 1;
    }
    return 0;
    }

    int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni)
    {
    int i = 0,j = 1;


    if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) && (pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
    {
    return 1;
    }

    if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) && (pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)))
    {
    return 1;
    }

    if ((pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)) && (pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
    {
    return 1;
    }
    return 0;
    }

    int Stabilita (struct coordinate posizione, struct coordinate dimensioni)
    {
    long int i,j;

    if ((pacchi[j].posizione.y == (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
    {
    if ((pacchi[j].dimensioni.z) * (pacchi[j].dimensioni.x) > (pacchi[i].dimensioni.z) * (pacchi[i].dimensioni.x))
    {
    return 1;
    }
    }
    return 0;
    }

    ESEMPIO 1) 150.0 200.0 160.0

    8

    0.0 0.0 0.0
    22.0 25.0 20.0

    22.0 25.0 20.0
    20.0 20.0 18.0

    42.0 45.0 38.0
    18.0 18.0 17.0

    60.0 63.0 55.0
    17.0 15.0 15.0

    77.0 78.0 70.0
    13.0 13.0 13.0

    90.0 91.0 83.0
    10.0 9.0 8.0

    100.0 100.0 91.0
    8.0 7.0 7.0

    108.0 107.0 98.0
    5.0 5.0 3.0
    dovrebbe risuòtare una configurazione corretta, invece...

    ESEMPIO 2) 100.0 90.0 50.0

    5

    0.0 0.0 0.0
    22.0 14.0 20.0

    22.0 14.0 20.0
    18.0 13.0 12.0

    40.0 27.0 32.0
    17.0 12.0 11.0

    57.0 39.0 43.0
    16.0 10.0 9.0

    73.0 49.0 52.0
    15.0 8.0 7.0
    l'ultimo pacco sborda

  2. #2
    oddio così è troppo illeggibile
    usa i tag [.code.] [./code.] levando i punti da dentro le parentesi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.