CLASSI

di il
10 risposte

CLASSI

Ciao a tutti dovrei creare un programma che utilizzi due classi: la classe rettangolo e la classe punto. quindi inserendo i 4 punti del rettangolo, il programma mi crea il rettangolo solo se è davvero un rettangolo, il quale può essere anche storto rispetto agli assi x e y. grazie mille in anticipo.

10 Risposte

  • Re: CLASSI

    Ciao, qual è il problema precisamente? L'argomento CLASSI oppure verificare se i 4 punti costituiscono i vertici di un rettangolo?
  • Re: CLASSI

    Nippolo ha scritto:


    Ciao, qual è il problema precisamente? L'argomento CLASSI oppure verificare se i 4 punti costituiscono i vertici di un rettangolo?
    il problema è più per l'argomento classi, non so bene come far interagire le due classe e dove eseguire il controllo del rettangolo
  • Re: CLASSI

    Inizia col postare le definizioni delle 2 classi.
  • Re: CLASSI

    Nippolo ha scritto:


    Inizia col postare le definizioni delle 2 classi.
    Io ho fatto molto velocemente questo, mancano molte cose e altre penso si possano fare decisamente meglio
    #include <iostream>
    
    class punto{
    private:
        float x,y;
    
    public:
        punto(){
            x=0;
            y=0;
        }
        
        void setx(float a){
            x=a;
        }
        
        void sety(float a){
            y=a;
        }
        
        float getx(){
            return x;
        }
        
        float gety(){
            return y;
        }
    };
    
    class rettangolo{
    private:
        punto p1;
        punto p2;
        punto p3;
        punto p4;
    public:
        void setcordinate(){
            p1.getx();
            p1.gety();
            p2.getx();
            p2.gety();
            p3.getx();
            p3.gety();
            p4.getx();
            p4.gety();
        }
        
    };
    
    
    int main(int argc, const char * argv[]) {
    
    
        return 0;
    }
    
  • Re: CLASSI

    Sistema la nomenclatura:

    In questo caso è preferibile chiamare le classi con la prima lettera maiuscola; es. Punto, Rettangolo
    O utilizzi set/get+_+nomeVariabile; es. get_x, set_y
    O utilizzi set/get+NomeVariabile; es. getX, setY

    Per il resto va bene. Dichiara un costruttore che accetta due parametri float e utilizza member initializer lists per inizializzare x e y. getX e getY possono essere funzioni const. Se la traccia non richiede esplicitamente una classe, per Punto puoi utilizzare una struttura.
  • Re: CLASSI

    _Achille ha scritto:


    Se la traccia non richiede esplicitamente una classe, per Punto puoi utilizzare una struttura.
    Al di là degli specificatori di accesso di default, nel C++ classi e strutture non sono uguali?

    @gianni555
    Il punto adesso è implementare un algoritmo per verificare se i 4 punti considerati costituiscono i vertici di un rettangolo.
    Inoltre cosa intendi con "il programma mi crea il rettangolo solo se..."?
  • Re: CLASSI

    Nippolo ha scritto:


    _Achille ha scritto:


    Se la traccia non richiede esplicitamente una classe, per Punto puoi utilizzare una struttura.
    Al di là degli specificatori di accesso di default, nel C++ classi e strutture non sono uguali?

    @gianni555
    Il punto adesso è implementare un algoritmo per verificare se i 4 punti considerati costituiscono i vertici di un rettangolo.
    Inoltre cosa intendi con "il programma mi crea il rettangolo solo se..."?
    nel senso che ovviamente se i 4 punti non formino un rettangolo il programma ritorna un errore o comunque ti avvisi.
    l'algoritmo per verificare cio' l'avrei anche pensato, ma non so di preciso dove vada scritto in una classe
  • Re: CLASSI

    Non esiste un modo univoco in cui farlo, il tutto dipende da come si vuole strutturare la classe.

    Detto questo, lascerei perdere per il momento la questione classe e mi soffermerei sul suddetto algoritmo. Banalmente potresti completare la seguente funzione:
    bool verifica_rettangolo(punto A, punto B, punto C, punto D);
    che ritorna vero se i 4 punti possono essere i vertici di un rettangolo e falso altrimenti.
    A tal proposito bisogna anche specificare se i 4 punti sono "consecutivi" o meno!
  • Re: CLASSI

    Nippolo ha scritto:


    Non esiste un modo univoco in cui farlo, il tutto dipende da come si vuole strutturare la classe.

    Detto questo, lascerei perdere per il momento la questione classe e mi soffermerei sul suddetto algoritmo. Banalmente potresti completare la seguente funzione:
    bool verifica_rettangolo(punto A, punto B, punto C, punto D);
    che ritorna vero se i 4 punti possono essere i vertici di un rettangolo e falso altrimenti.
    A tal proposito bisogna anche specificare se i 4 punti sono "consecutivi" o meno!
    per l'algoritmo in realtà basta prendere un punto come riferimento, trovare il più lontano da esso in modo da trovare la diagonale e controllare se con quella diagonale e gli altri lati si formano triangoli rettangoli con il teorema di Pitagola.
  • Re: CLASSI

    Se ho ben interpretato la tua idea, credo che non sia sufficiente...
    Considera la seguente figura:
    11.jpg
    11.jpg

    preso come riferimento il punto A, troviamo che la probabile diagonale è data da AC. A questo punto constatiamo che i triangoli ABC e ADC sono rettangoli rispettivamente in B e D, ma la figura evidentemente non è un rettangolo.

    Altri approcci, per esempio, possono essere quelli di verificare la perpendicolarità di 3 angoli (il quarto lo sarà di conseguenza) o ancora meglio (per sganciarci dall'ordine in cui sono dati i punti) potresti trovare il baricentro (che coincide col centro della circonferenza circoscritta all'eventuale rettangolo) del sistema costituito dai 4 punti, e verificare che la loro distanza dal centro di massa è uguale.

    In ogni caso, vista l'intrinseca difficoltà nel confrontare valori in virgola mobile, ti consiglio di utilizzare il tipo intero per le coordinate dei punti e per tutti i successivi calcoli.
Devi accedere o registrarti per scrivere nel forum
10 risposte