Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Algoritmo di simulazione coordinate
Forum - C/C++ - Algoritmo di simulazione coordinate

Avatar
ht-never (Member)
Rookie


Messaggi: 49
Iscritto: 24/09/2011

Segnala al moderatore
Postato alle 21:34
Lunedì, 26/12/2011
Salve popolo di pierotofy. sto lavorando a un algoritmo per rilasciare una nuova versione di NeverPH. dovete ragionare in termini di utenti di Neverball. l'algoritmo serve per creare una fila di monete colorate distanziate l'una dall'altra di 40 punti. l'utente inserisce tre numeri rappresentanti le ccordinate dell'inizio della fila, e tre numeri rappresentanti le coordinate della fine. tramite questo algoritmo, attraverso vari cicli, dovremmo avere una linea perfetta di monete. purtroppo il codice non funziona sempre, perchè quando la differenza fra le X è più grande della differenza fra le Y, va in obliquo per un po' e poi nell'ultimo pezzo va dritto. anche viceversa.
considerate che dlight(int,int,int,int) crea una singola moneta.

Codice sorgente - presumibilmente C++

  1. void tlight(int x, int y, int z, int xx, int yy, int zz, int light)
  2. {
  3.   int temp, l = light;
  4.   if(x > xx)  {
  5.     temp = x;
  6.         x = xx;
  7.         xx = temp; }
  8.   if(y > yy)  {
  9.     temp = y;
  10.         y = yy;
  11.         yy = temp; }
  12.   if(z > zz)  {
  13.     temp = z;
  14.         z = zz;
  15.         zz = temp; }
  16.   if((x == xx) && (zz == z) && (y != yy))
  17.   {
  18.     while(y <= yy)
  19.         {
  20.           dlight(x, y, z, l);
  21.           y += 40;
  22.         }
  23.   }
  24.   if((y == yy) && (zz == z) && (x != xx))
  25.   {
  26.     while(x <= xx)
  27.         {
  28.           dlight(x, y, z, l);
  29.           x += 40;
  30.         }
  31.   }
  32.   if((yy == y) && (xx == x) && (z != zz))
  33.   {
  34.     while(z <= zz)
  35.         {
  36.           dlight(x, y, z, l);
  37.           z += 40;
  38.         }
  39.   }
  40.   if((zz == z) && (yy != y) && (xx != x))
  41.   {
  42.     while(((y <= yy) || (z < zz) || (x <= xx)))
  43.         {
  44.           dlight(x, y, z, l);
  45.           if(x <= xx)
  46.             x += 40;
  47.           if(y <= yy)
  48.             y += 40;
  49.         }
  50.   }
  51.   if((zz != z) && (yy == y) && (xx != x))
  52.   {
  53.     while((y < yy) || (z <= zz) || (x <= xx))
  54.         {
  55.           dlight(x, y, z, l);
  56.           if(x <= xx)
  57.             x += 40;
  58.           if(z <= zz)
  59.             z += 40;
  60.         }
  61.   }
  62.   if((zz != z) && (yy != y) && (xx == x))
  63.   {
  64.     while((y <= yy) || (z <= zz) || (x < xx))
  65.         {
  66.           dlight(x, y, z, l);
  67.           if(z <= zz)
  68.             z += 40;
  69.           if(y <= yy)
  70.             y += 40;
  71.         }
  72.   }
  73.   if((zz != z) && (yy != y) && (xx != x))
  74.   {
  75.     while((y <= yy) || (z <= zz) || (x <= xx))
  76.         {
  77.           dlight(x, y, z, l);
  78.           if(z <= zz)
  79.             z += 40;
  80.           if(y <= yy)
  81.             y += 40;
  82.           if(x <= xx)
  83.             x += 40;
  84.         }
  85.   }
  86. }


PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 8:17
Martedì, 27/12/2011
il problema di queste cose è che le si affronta senza una vaga idea della geometria  analitica...

per risolvere il problema semplicemente va calcolata la retta che passa per il punto iniziale e per il punto finale, dopodichè si itera lungo questa retta posizionando una moneta ogni tot.

parti da qua
http://it.wikipedia.org/wiki/Retta

devi calcolare: x0, l, y0, m, z0 e n risolvendo in maniera generale il sistema di lineare di primo grado delle coordinate di input.

oppure puoi calcolare direttamente i due angoli che identificano la retta con due colpi di trigonometria.

una volta che hai gli angoli iteri lungo la retta sommando i componenti di ogni dimensione moltiplicati per seno o coseno a seconda di quale angolo si tratta.

ora non ho tempo per scrivere uno pseudocodice, ma il succo è questo.
cerca, documentati e studia :)



PM Quote
Avatar
ht-never (Member)
Rookie


Messaggi: 49
Iscritto: 24/09/2011

Segnala al moderatore
Postato alle 12:23
Martedì, 27/12/2011
grazie, era esattamente quello che cercavo. purtroppo capisco più di programmazione che di geometria ma studierò...

PM Quote