[C++] poligoni e strutture
Descrivere una struttura idonea a rappresentare un poligono nel piano attraverso:
• Il numero di vertici;
• Il vettore delle ascisse dei vertici;
• Il vettore delle corrispondenti ordinate;
Definire un array dinamico A destinato a rappresentare N poligoni come richiesto
nell’esercizio precedente.
Come descrivo:
a. Il punto medio del terzo lato?
b. L’indirizzo dell’ascissa dell’ultimo lato?
ho pensato in realtà a due strutture, una per un punto in $RR^2$ ed una per il poligono vero e proprio
struct puntoR2{ float x; float y; } struct poligono{ puntoR2* vertici; unsigned int n_vertici; }
quindi il vettore di strutture sarebbe [inline]poligono A[N][/inline]. non so però gestire le richieste. come mi muovo tra i vertici?
qualche idea?
Risposte
Le tue strutture rispondono alle richieste del problema, anche se nel C++ si userebbe una classe con costruttore e cose simili.
Le richieste non hanno molto senso logico. Insomma, un poligono rimane lo stesso poligono se si ruotano i vertici. Detto questo cosa intendi con "muovere tra i vertici"? Insomma una volta allocato dinamicamente l'insieme dei vertici, il punto medio del terzo lato è:
Le richieste non hanno molto senso logico. Insomma, un poligono rimane lo stesso poligono se si ruotano i vertici. Detto questo cosa intendi con "muovere tra i vertici"? Insomma una volta allocato dinamicamente l'insieme dei vertici, il punto medio del terzo lato è:
struct puntoR2 { float x, y; }; struct poligono { puntoR2 * vertici; unsigned int n_vertici; }; puntoR2 punto_medio_terzo_lato(const poligono & p) { puntoR2 punto = {0.0, 0.0}; if (p.n_vertici > 3 && p.vertici) { punto.x = (p.vertici[3].x + p.vertici[2].x) * 0.5; punto.y = (p.vertici[3].y + p.vertici[2].y) * 0.5; } return punto; }
Premesso che risulta fondamentale che i vertici siano "consecutivi", è necessario stabilire delle convenzioni:
- dal momento che i vertici sono salvati in un array, direi di identificare il singolo vertice con il corrispettivo indice (che andrà da 0 a n_vertici-1);
- per quanto riguarda gli n_vertici lati, identificherei l'i-esimo lato come il lato che ha come estremi il vertice i e quello consecutivo (ossia 0 se i=n_vertici-1 o i+1 altrimenti).
Il punto a) quindi è fatto. Per quanto riguarda il punto b) non so aiutarti, perché non so cosa si intende con "ascissa di un lato"!!
- dal momento che i vertici sono salvati in un array, direi di identificare il singolo vertice con il corrispettivo indice (che andrà da 0 a n_vertici-1);
- per quanto riguarda gli n_vertici lati, identificherei l'i-esimo lato come il lato che ha come estremi il vertice i e quello consecutivo (ossia 0 se i=n_vertici-1 o i+1 altrimenti).
Il punto a) quindi è fatto. Per quanto riguarda il punto b) non so aiutarti, perché non so cosa si intende con "ascissa di un lato"!!
ancora grazie per l'aiuto.
esatto ed è quello che mi lasciava perplesso.
intendevo che faticavo a capire come indicizzare i vertici e considerare le loro ascisse. la tua risoluzione comunque ha chiarito le idee, grazie!
grazie anche a te per l'intervento.
"vict85":
Le richieste non hanno molto senso logico. Insomma, un poligono rimane lo stesso poligono se si ruotano i vertici.
esatto ed è quello che mi lasciava perplesso.
"vict85":
cosa intendi con "muovere tra i vertici"
intendevo che faticavo a capire come indicizzare i vertici e considerare le loro ascisse. la tua risoluzione comunque ha chiarito le idee, grazie!
"Super Squirrel":
Premesso che risulta fondamentale che i vertici siano "consecutivi", è necessario stabilire delle convenzioni:
- dal momento che i vertici sono salvati in un array, direi di identificare il singolo vertice con il corrispettivo indice (che andrà da 0 a n_vertici-1);
- per quanto riguarda gli n_vertici lati, identificherei l'i-esimo lato come il lato che ha come estremi il vertice i e quello consecutivo (ossia 0 se i=n_vertici-1 o i+1 altrimenti).
Il punto a) quindi è fatto. Per quanto riguarda il punto b) non so aiutarti, perché non so cosa si intende con "ascissa di un lato"!!
grazie anche a te per l'intervento.
"Super Squirrel":
- per quanto riguarda gli n_vertici lati, identificherei l'i-esimo lato come il lato che ha come estremi il vertice i e quello consecutivo (ossia 0 se i=n_vertici-1 o i+1 altrimenti).
Volendo evitare l'if si può anche scrivere che l''i_esimo lato avrà come vertici i e (i+1)%n_vertici.
Esiste un metodo particolare per iterare sui lati di un poligono partendo dall'ultimo e poi seguendo tutti gli altri:
Non fa uso di if o %. La principale ragione per mostrare questo codice è che si trova spesso in codici e algoritmi di geometria computazionale e può comunque tornare utile in altre situazioni simili.
for (end = 0, begin = n; end < n; begin = end, ++end) { // Codice per lavorare sul lato formato dai vertici begin --> end }
Non fa uso di if o %. La principale ragione per mostrare questo codice è che si trova spesso in codici e algoritmi di geometria computazionale e può comunque tornare utile in altre situazioni simili.