[C++] poligoni e strutture

cooper1

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
vict85
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 è:
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;
}

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"!!

cooper1
ancora grazie per l'aiuto.
"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
"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.

apatriarca
Esiste un metodo particolare per iterare sui lati di un poligono partendo dall'ultimo e poi seguendo tutti gli altri:
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.