|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] Come creare una lista di oggetti ricorsiva?
Salve a tutti,
sono un pò arrugginito in merito agli array con gli oggetti, e quindi vi chiedo aiuto su questo mio problema. Devo creare una classe Cubo, definita da 8 punti e un puntatore a vettore di cubi, che altro non è che una lista di 8 oggetti cubo (se stessa in pratica). Ogni oggetto cubo è identificato da un vettore di 8 oggetti punto, dove punto è una struct fatta così: struct punto{ double x; double y; double z; bool V; }; Ora, la classe deve essere caratterizzata da due funzioni: 1) Inizializza: che prende in ingresso x,y,z double ed un intero div (che indica la divisione) ed instanzia un numero di cubi iniziale in base a quanto ho diviso lo spazio di partenza con div. Esempio: viene dato 2000,2000,2000 e 4, inizializza divide le misure di questo spazio in 4 e quindi ne vengono fuori 64 cubi. Deve restiture in output il vettore di cubi. 2) verifica: che prende in ingresso un vettore di cubi e verifica con una funzione di retroproiezione su un'immagine se scartare o meno i vari cubi del vettore. Se non va bene, il cubo viene eliminato dalla vettore (vengono contrassegnati i punti come non buoni), altrimenti viene richiamata ricorsivamente su tutti i cubi buoni dopo che sono stati "esplosi" (cioè divisi in altri 8) con la funzione esplodi. 3) La funzione esplodi: prende in ingresso un cubo e lo divide in 8 (dividendo in due le tre misure) e restituisce in output il vettore di 8 sottocubi. In pratica, immagino un grande cubo da 8 punti iniziali che rappresenta lo spazio in cui effettuo la foto dell'oggetto (dalla quale ottengo l'immagine binaria) e me li ricavo dalle dimensioni fornite in input (x,y,z) dopo di che: 1 - lancio inizializza, che mi restituisce un vettore di tot cubi in base a quanto è stato scelto di dividere; 2 - su tali cubi, lancio verifica, che mi indicherà quali cubi sono buoni e su cui lanciare "esplodi"; ripeto il punto 2 sui cubi usciti da esplodi. Il discorso in schema è il seguente: ![]() Dove con P indico i punti, con "C" i cubi di partenza e con "SC" i sottocubi. In pratica è sempre l'oggetto cubo che viene "diviso" in altri 8 cubi più piccoli o cancellato dalla lista di partenza. Quello che dovrò ottenere alla fine è un vettore di cubi con i relativi punti selezionato man mano fino ad un limite fissato in partenza. Come posso fare questa cosa?? Potete aiutarmi per favore???:muro
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 12-11-2013 alle 10:32. |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Codice:
class Cube { private: array<unique_ptr<Cube>, 8> innerCubeList; }; |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
così va impostata? Ed è possibile poi nidificarla?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Ok...allora faccio delle prove, nel caso posso postarti un pò di codice quando ho fatto? Per avere un parere?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Non c'è bisogno di chiedere permessi: tu posta, al massimo nessuno ti risponde
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Il problema è il seguente:
La classe cubo deve essere fatta di 8 punti (dove punto è x,y,z) e un puntatore ad una lista di 8 sottocubi, cioè una lista di 8 oggetti classe cubo. Il puntatore a sottocubo va attivato solo se uno degli 8 punti della classe (quindi dell'oggetto cubo) sono di interesse, in tal caso, attivo il vettore di sotto-oggetti cubo, creando 8 oggetti cubo, che avranno a loro volta 8 punti a testa e il puntatore al proprio sotto-oggetto. Al di là di come verificare se di interesse o meno, come si fa per attivare il sotto-oggetto assegnandogli gli 8 punti? (che ovviamente saranno diversi da sottocubo a sottocubo) Come si fa ad instanziare questo tipo di gerarchia di oggetti? Alla fine non è una questione di classi derivate o meno, ma di oggetti negli oggetti, sempre dello stesso tipo però. Sapete dirmi come si fa questa cosa??
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
for (i = 1; i < 8) innerCubeList[i].reset(new Cube{ x1, x2, x3 }); // semi-pseudo codice |
|
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
In tal caso sarebbe for (i=0;i<7;i++){ inneCubeList[i].reset(new Cube{x[i],y[i],z[i]} ??
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
reset quindi equivale a: delete innerCubeList[i]; innerCubeList[i] = new Cube{ x[i], y[i], z[i] }; E assegni un valore non ad ogni cubo, ma ad ogni puntatore a cubo! |
|
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
![]()
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Direttive inner? innerCubeList è solo un nome di variabile. Mi sa che ti mancano parecchie basi prima di poter affrontare questo problema. L'inizializzazione di una classe la si fa tramite generalmente tramite il costruttore, quello che serve a te è costruire una classe Cube nel momento in cui sai che ti serve e associarla all'elenco di oggetti Cube del parent. Più che attivato userei il termine inizializzato |
|
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Prego i moderatori di eliminare questo thread perchè ne ho aperto un altro più chiaro e conciso. Grazie.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 12-11-2013 alle 10:47. Motivo: eliminazione thread |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:58.