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