[C] Calcolo distanza (centroide di reticolo)

di il
2 risposte

[C] Calcolo distanza (centroide di reticolo)

Buongiorno, sto facendo un progetto per un esame e non riesco a calcolare la distanza di un punto da un altro. In pratica il programma ha lo scopo di calcolare su di una scacchiera 30x30 il centroide ( sulla scacchiera ci sono 50 oggetti immessi con una srand), e di calcolare e visualizzare la distanza di ogni punto dal centroide.. La formula la conosco però non riesco a implementarla..
/*
Si vuole sviluppare un algoritmo di calcolo del centroide. L’algoritmo considera una scacchiera di 30x30 caselle e dispone
a caso (usando la function rand) 50 oggetti (la posizione è una coppia di numeri interi). L’algoritmo deve visualizzare la scacchiera,
mostrando un ‘ ’,per le caselle non occupate e mostrando una ‘X’ per le caselle occupate dagli oggetti.
L’algoritmo determina il centroide dell’insieme dei 50 oggetti: il centroide è un punto della scacchiera che ha per ascissa
l’intero più vicino alla media delle ascisse di tutti gli oggetti e per ordinata l’intero più vicino alla media
delle ordinate di tutti gli oggetti. L’algoritmo deve visualizzare di nuovo la scacchiera, indicando,
oltre alle caselle vuote e a quelle occupate, anche la posizione del centroide (indicandola con la lettera ‘C’).
Infine, l’algoritmo calcola e visualizza la distanza di ognuno degli oggetti dal centroide, e determina e visualizza sia la
minima distanza (indicando anche la posizione dell’oggetto a minima distanza) sia la massima distanza
(indicando anche la posizione dell’oggetto a massima distanza).
*/

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main () {

    //DICHIARAZIONE VARIABILI

    int dim=30;              //DIMENSIONE SCACCHIERA - PUO' ESSERE MODIFICATO
    int numOggetti=50;       //NUMERO MASSIMO DI OGGETTI - PUO' ESSERE MODIFICATO
    int scacchiera[dim][dim];
    int i;
    int j;
    srand(rand()+clock()+time(NULL));

    //RIEMPIMENTO SCACCHIERA

    int maxOggetti=numOggetti;
    for(i=0;i<dim;i++)
        for(j=0;j<dim;j++)
            scacchiera[i][j]=0;
    while(maxOggetti>0)
        {
        for(i=0;i<dim;i++)
            for(j=0;j<dim;j++)
                if((scacchiera[i][j]!=1) && (maxOggetti>0) && (rand()%1000==0))
                {
                        scacchiera[i][j]=1;
                        maxOggetti=maxOggetti-1;
                }
        }

    //CALCOLO IL CENTROIDE

    int xC=0;
    int yC=0;
    for(i=0;i<dim;i++)
        for(j=0;j<dim;j++)
            if(scacchiera[i][j])
                {
                xC+=j;
                yC+=i;
                }
    xC=xC/numOggetti;
    yC=yC/numOggetti;

    //VISUALIZZAZIONE DELLA SCACCHIERA

    char onBox='X';          //CASELLA OCCUPATA - PUO' ESSERE MODIFICATO
    char offBox=' ';         //CASELLA LIBERA - PUO' ESSERE MODIFICATO
    char centroide='C';      //CENTROIDE - PUO' ESSERE MODIFICATO
    printf("%c",201);         //-------------------------
    for(i=0;i<dim;i++)  //                        -
        printf("%c",205);     //DISEGNA BORDO SUPERIORE -
    printf("%c",187);         //                        -
    printf("\n");              //-------------------------
    for(i=0;i<dim;i++)
        {
        printf("%c",186);     //DISEGNA BORDO LATERALE SINISTRO
        for(j=0;j<dim;j++)
        {
            if((j==xC) && (i==yC))
                printf("%c",centroide);
            else {
                if(scacchiera[i][j])
                    printf("%c",onBox);
                else
                    printf("%c",offBox);
                 }
        }
        printf("%c",186);     //DISEGNA BORDO LATERALE DESTRO
        printf("\n");
    }
    printf("%c",200);         //-------------------------
    for (i=0;i<dim;i++)  //                        -
        printf("%c",205);     //DISEGNA BORDO INFERIORE -
    printf("%c",188);         //                        -
    printf("\n");             //-------------------------

    //VISUALIZZAZIONE DISTANZE

    int distanza;             //FORMULA DISTANZA=SQRT(POW((xC-i),2)+POW((yC-j),2))
    
    
    
    
    
    
    
}
Questo è il codice funzionante, se potete darmi un indicazione o qualche esempio per poter capire il funzionamento..

2 Risposte

  • Re: [C] Calcolo distanza (centroide di reticolo)

    Devi nuovamente iterare sulla orizzontale e verticale, un esempio potrebbe essere
    
        //VISUALIZZAZIONE DISTANZE
    
        
        for ( int i = 0; i < dim; ++i)
    		for ( int j = 0; j < dim; ++j ) {
    			int distanza = sqrt( pow( ( xC - i ), 2 ) + pow ( ( yC - j), 2) );
    			printf("%i", distanza); 
    			printf("\n"); 
    		}
    
  • Re: [C] Calcolo distanza (centroide di reticolo)

    sebaldar ha scritto:


    Devi nuovamente iterare sulla orizzontale e verticale, un esempio potrebbe essere
    
        //VISUALIZZAZIONE DISTANZE
    
        
        for ( int i = 0; i < dim; ++i)
    		for ( int j = 0; j < dim; ++j ) {
    			int distanza = sqrt( pow( ( xC - i ), 2 ) + pow ( ( yC - j), 2) );
    			printf("%i", distanza); 
    			printf("\n"); 
    		}
    
    Buongiorno, grazie per l'aiuto, sono riuscito a completare l'esercizio però non funziona una cosa ( una banalità ); quando stampo la distanza massima/minima dei 50 oggetti, devo stampare anche la loro posizione, per farti capire : [esempio]

    distanza massima = 30, di posizione 15 - distanza minima = 2, di posizione 24

    guardando l'esercizio capirai meglio... In pratica stampa delle posizioni errate che non rispecchiano le reali poszioni, puoi accorgertene semplicemente controllando la distanza massima e minima a quale oggetto corrispondono quando li stampo prima di calcolare la massima e minima distanza. ECCO IL CODICE :
    /*
    Si vuole sviluppare un algoritmo di calcolo del centroide. L’algoritmo considera una scacchiera di 30x30 caselle e dispone
    a caso (usando la function rand) 50 oggetti (la posizione è una coppia di numeri interi). L’algoritmo deve visualizzare la scacchiera,
    mostrando un ‘ ’,per le caselle non occupate e mostrando una ‘X’ per le caselle occupate dagli oggetti.
    L’algoritmo determina il centroide dell’insieme dei 50 oggetti: il centroide è un punto della scacchiera che ha per ascissa
    l’intero più vicino alla media delle ascisse di tutti gli oggetti e per ordinata l’intero più vicino alla media
    delle ordinate di tutti gli oggetti. L’algoritmo deve visualizzare di nuovo la scacchiera, indicando,
    oltre alle caselle vuote e a quelle occupate, anche la posizione del centroide (indicandola con la lettera ‘C’).
    Infine, l’algoritmo calcola e visualizza la distanza di ognuno degli oggetti dal centroide, e determina e visualizza sia la
    minima distanza (indicando anche la posizione dell’oggetto a minima distanza) sia la massima distanza
    (indicando anche la posizione dell’oggetto a massima distanza).
    */
    
    /*
    struct auto_S{int prova,float f, char c} automobile;
    
    int funzioneprfjborit(automobile variabile[90]){
    
        scanf("%d",&variabile[0].prova);
        scanf("%c",&variabile[0].c);
    }
    
    */
    
    
    #include <math.h>   //LIBRERIA CONTENENTE LA FUNZIONE POW
    #include <stdio.h>  //LIBRERIA CONTENETE LE FUNZIONI PRINTF/SCANF
    #include <stdlib.h> //LIBRERIA CONTENETE LA FUNZIONE RAND
    #include <time.h>   //CONTIENE LA FUNZIONE CLOCK
    void distanze(int dim,int scacchiera[dim][dim],int xC,int yC,double dist[]);
    
    int main () {
    
       //DICHIARAZIONE VARIABILI
    
       int dim=30;              //DIMENSIONE SCACCHIERA - PUO' ESSERE MODIFICATO
       int numOggetti=50;       //NUMERO MASSIMO DI OGGETTI - PUO' ESSERE MODIFICATO
       int scacchiera[dim][dim];//MATRICE CON UNA DIMENSIONE PRECEDENTEMENTE DEFINITA
       int i;                   //INDICE RIGA
       int j;                   //INDICE COLONNA
       double dist[numOggetti];  //VARIABILE PER LA DISTANZA DEGLI OGGETTI DAL CENTROIDE
       float maxdist=0;         //VARIABILE CONTENENTE LA DISTANZA MASSIMA
       int imax,jmax;           //INDICI PER LA POSIZIONE DELL'OGGETTO CON DISTANZA MASSIMA
       float mindist=dim;       //VARIBILE CONTENENTE LA DISTANZA MINIMA
       int imin,jmin;           //INDICI PER LA POSIZIONE DELL'OGGETTO CON DISTANZA MINIMA
       int cont=0;                //CONTA IL NUMERO DI OGGETTI
       int maxOggetti=numOggetti; //VARIABILE USATA PER IL RIEMPIMENTO DELLA MATRICE
       int xC=0;                //ORDINATA DEL CENTROIDE
       int yC=0;                //ASCISSA DEL CENTROIDE
       char onBox='X';          //CASELLA OCCUPATA - PUO' ESSERE MODIFICATO
       char offBox=' ';         //CASELLA LIBERA - PUO' ESSERE MODIFICATO
       char centroide='C';      //CENTROIDE - PUO' ESSERE MODIFICATO
       float call;
       srand(rand()+clock()+time(NULL)); //FUNZIONE PER LA GENERAZIONE DI OGGETTI CASUALI NELLA SCACCHIERA CON
    
       //RIEMPIMENTO SCACCHIERA
    
       for(i=0;i<dim;i++)
           for(j=0;j<dim;j++)
               scacchiera[i][j]=0;
       while(maxOggetti>0)
           {
           for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                   if((scacchiera[i][j]!=1) && (maxOggetti>0) && (rand()%1000==0))
                   {
                           scacchiera[i][j]=1;
                           maxOggetti=maxOggetti-1;
                   }
           }
    
       //CALCOLO IL CENTROIDE
    
       for(i=0;i<dim;i++)
           for(j=0;j<dim;j++)
               if(scacchiera[i][j])
                   {
                   xC+=j;
                   yC+=i;
                   }
       xC=xC/numOggetti;
       yC=yC/numOggetti;
    
       //VISUALIZZAZIONE DELLA SCACCHIERA SENZA IL CENTROIDE
    
       printf("  Scacchiera senza il centroide\n");
    
       printf("%c",201);         //-------------------------
       for(i=0;i<dim;i++)       //                        -
            printf("%c",205);     //DISEGNA BORDO SUPERIORE -
            printf("%c",187);         //                        -
            printf("\n");             //-------------------------
       for(i=0;i<dim;i++)
           {
           printf("%c",186);     //DISEGNA BORDO LATERALE SINISTRO
           for(j=0;j<dim;j++)
           {
    
                   if(scacchiera[i][j])
                       printf("%c",onBox);
                   else
                       printf("%c",offBox);
            }
           printf("%c",186);     //DISEGNA BORDO LATERALE DESTRO
           printf("\n");
        }
       printf("%c",200);         //-------------------------
       for (i=0;i<dim;i++)  //                        -
           printf("%c",205);     //DISEGNA BORDO INFERIORE -
           printf("%c",188);         //                        -
           printf("\n");             //-------------------------
    
       //VISUALIZZAZIONE DELLA SCACCHIERA CON IL CENTROIDE
    
       printf("\n  Scacchiera con il centroide\n");
    
       printf("%c",201);         //-------------------------
       for(i=0;i<dim;i++)       //                        -
            printf("%c",205);     //DISEGNA BORDO SUPERIORE -
            printf("%c",187);         //                        -
            printf("\n");             //-------------------------
       for(i=0;i<dim;i++)
           {
           printf("%c",186);     //DISEGNA BORDO LATERALE SINISTRO
           for(j=0;j<dim;j++)
           {
               if((j==xC) && (i==yC))
                   printf("%c",centroide);
               else {
                   if(scacchiera[i][j])
                       printf("%c",onBox);
                   else
                       printf("%c",offBox);
                    }
           }
           printf("%c",186);     //DISEGNA BORDO LATERALE DESTRO
           printf("\n");
       }
       printf("%c",200);         //-------------------------
       for (i=0;i<dim;i++)  //                        -
           printf("%c",205);     //DISEGNA BORDO INFERIORE -
           printf("%c",188);         //                        -
           printf("\n");             //-------------------------
    
       //VISUALIZZAZIONE DISTANZE
    
        distanze(dim,scacchiera,xC,yC,dist);
    
        for(i=0;i<numOggetti;i++)
        {
    
           for(j=0;j<numOggetti;j++)
           {
    
            if(dist[i]>maxdist)
                {
                        maxdist=dist[i];
                        imax=i; jmax=j;
                }
            else if(dist[i]<mindist)
                {
                        mindist=dist[i];
                        imin=i; jmin=j;
                }
            }
        }
                printf("\n\nDistanza massima/minima : %.2f[posizione %d,%d]/%.2f[posizione %d,%d]\n",maxdist,imax,jmax,mindist,imin,jmin);
    }
    
     void distanze(int dim,int scacchiera[dim][dim],int xC,int yC,double dist[])
    {
        int cont=0;
        int i,j;
        //VISUALIZZAZIONE DISTANZE
        for(i=0;i<dim;i++)
        {
            for(j=0;j<dim;j++)
            {
                if(scacchiera[i][j])
                {
                    dist[cont]=sqrt(pow((xC-i),2)+pow((yC-j),2)); //FORMULA DISTANZA DAL CENTROIDE
                    cont++;
    
                    //printf("\nOggetto n%d di posizione %d,%d distanza : %lf",cont,i,j,dist[cont]);
                    printf("Oggetto N%c %d di posizione %d,%d distanza = %.2lf\n",248,cont,i,j,dist[cont-1]);
                }
            }
        }
        return;
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte