Oppure

Loading
26/12/11 20:34
ht-never
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.

void tlight(int x, int y, int z, int xx, int yy, int zz, int light)
{
  int temp, l = light;
  if(x > xx)  {
    temp = x;
	x = xx;
	xx = temp; }
  if(y > yy)  {
    temp = y;
	y = yy;
	yy = temp; }
  if(z > zz)  {
    temp = z;
	z = zz;
	zz = temp; }
  if((x == xx) && (zz == z) && (y != yy))
  {
    while(y <= yy)
	{
	  dlight(x, y, z, l);
	  y += 40;
	}
  }
  if((y == yy) && (zz == z) && (x != xx))
  {
    while(x <= xx)
	{
	  dlight(x, y, z, l);
	  x += 40;
	}
  }
  if((yy == y) && (xx == x) && (z != zz))
  {
    while(z <= zz)
	{
	  dlight(x, y, z, l);
	  z += 40;
	}
  }
  if((zz == z) && (yy != y) && (xx != x))
  {
    while(((y <= yy) || (z < zz) || (x <= xx)))
	{
	  dlight(x, y, z, l);
	  if(x <= xx)
	    x += 40;
	  if(y <= yy)
	    y += 40;
	}
  }
  if((zz != z) && (yy == y) && (xx != x))
  {
    while((y < yy) || (z <= zz) || (x <= xx))
	{
	  dlight(x, y, z, l);
	  if(x <= xx)
	    x += 40;
	  if(z <= zz)
	    z += 40; 
	}
  }
  if((zz != z) && (yy != y) && (xx == x))
  {
    while((y <= yy) || (z <= zz) || (x < xx))
	{
	  dlight(x, y, z, l);
	  if(z <= zz)
	    z += 40;
	  if(y <= yy)
	    y += 40;
	}
  }
  if((zz != z) && (yy != y) && (xx != x))
  {
    while((y <= yy) || (z <= zz) || (x <= xx))
	{
	  dlight(x, y, z, l);
	  if(z <= zz)
	    z += 40;
	  if(y <= yy)
	    y += 40;
	  if(x <= xx)
	    x += 40;
	}
  }
}
aaa
27/12/11 7:17
HeDo
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
it.wikipedia.org/wiki/…

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 :)


aaa
27/12/11 11:23
ht-never
grazie, era esattamente quello che cercavo. purtroppo capisco più di programmazione che di geometria ma studierò...
aaa