Matematici: una sfida

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Matematici: una sfida

Messaggio da Wolfrost »

Matematici, alle armi! :asd: :asd:
Ho trovato questa gif su Internet
Immagine
Sareste capaci di riprodurre lo stesso ed identico effetto con Game Maker?

EDIT: Intanto ci provo io :mrgreen: Anche se vorrei sapere come lo fareste voi
Immagine

Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da Jak »

Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

A me non sembra così complicato farlo...
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Jak ha scritto:Praise the cube
Uddzio!!! Manco il tempo di grattarmi il culo popo! (cit.) Già fatto bello finito consegnato! :asd: Ti stimo molto
Immagine

Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Altra sfida: ricreare questa gif
Immagine
Immagine

Immagine

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

Bitch please.

CREATE

Codice: Seleziona tutto

var i;

step=0;
wave_height=20;
ellipses=ds_list_create();

for(i=0; i<30; i+=1)
{
    ds_list_add(ellipses, 0);
}
STEP

Codice: Seleziona tutto

var i;

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, 0);
}

for(i=floor(step)-5; i<floor(step)+5 && i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, wave_height*-cos(degtorad(((step-i)*180)/10)));
}

step=step+0.3;

if (step>ds_list_size(ellipses)+5)
{
    step=-5;
}
DRAW

Codice: Seleziona tutto

var i;

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    draw_ellipse(room_width/2-i*10, (room_height/2-i*3)+ds_list_find_value(ellipses, i), room_width/2+i*10, (room_height/2+i*3)+ds_list_find_value(ellipses, i), true);
}
Non ho messo la goccia, mi sembrava inutile. Inoltre con un array si possono simulare più onde.
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Bel codice Solid Snake! :rockrock: :rockrock: Anche se hai dimenticato di mettere alpha sempre di meno man mano che gli ellissi venivano disegnati :asd: Ma è facile da aggiungere
Immagine

Immagine

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

Codice migliorato:

STEP

Codice: Seleziona tutto

var i;

/*for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, 0);
}*/

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, (wave_height*-sin(degtorad(((i-(step-5))*360)/10)*(i>step-5 && i<step+5))));
}

step=step+0.2;

if (step>ds_list_size(ellipses)+5)
{
    step=-5;
}
//DRAW

Codice: Seleziona tutto

var i;

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    draw_set_alpha((ds_list_size(ellipses)-i)/ds_list_size(ellipses));
    draw_ellipse(room_width/2-i*10, (room_height/2-i*3)+ds_list_find_value(ellipses, i), room_width/2+i*10, (room_height/2+i*3)+ds_list_find_value(ellipses, i), true);
}
Adesso l'animazione è smoothata! :rockrock:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Solid Snake ha scritto:Codice migliorato:

STEP

Codice: Seleziona tutto

var i;

/*for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, 0);
}*/

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, (wave_height*-sin(degtorad(((i-(step-5))*360)/10)*(i>step-5 && i<step+5))));
}

step=step+0.2;

if (step>ds_list_size(ellipses)+5)
{
    step=-5;
}
//DRAW

Codice: Seleziona tutto

var i;

for(i=0; i<ds_list_size(ellipses); i+=1)
{
    draw_set_alpha((ds_list_size(ellipses)-i)/ds_list_size(ellipses));
    draw_ellipse(room_width/2-i*10, (room_height/2-i*3)+ds_list_find_value(ellipses, i), room_width/2+i*10, (room_height/2+i*3)+ds_list_find_value(ellipses, i), true);
}
Adesso l'animazione è smoothata! :rockrock:
Bella bella! Davvero un ottimo codice :asd: :asd: :rockrock: :rockrock:
Immagine

Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da doom13 »

Xeryan ha scritto:altre sfide, altre sfide! :)
Ahah anche Xeryan vuole partecipare, dai Wolfrost.
Sempre un'immagine da riprodurre?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Dovrete ricreare gli effetti qui proposti
Immagine
Ma non solo imitando la gif, dovete strutturare ogni effetto come se fosse un effetto di transizione da una room ad un'altra! :D
Immagine

Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da doom13 »

Siè, ragequit generale
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

A me annoiava farlo, vado nel pallone quando si tratta di angoli :asd:
Per farmi perdonare:

Ho notato che nell'effetto della goccia l'onda andava ad affievolirsi man mano che avanzava... Il mio non lo faceva quindi:

Codice: Seleziona tutto

//For nello step event
for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, ((wave_height*(1-step/(ds_list_size(ellipses)+5)))*-sin(degtorad(((i-(step-5))*360)/10)*(i>step-5 && i<step+5))));
}
Lascio a Xeryan l'onore di fare l'ultimo :asd:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Matematici: una sfida

Messaggio da Wolfrost »

Solid Snake ha scritto:A me annoiava farlo, vado nel pallone quando si tratta di angoli :asd:
Per farmi perdonare:

Ho notato che nell'effetto della goccia l'onda andava ad affievolirsi man mano che avanzava... Il mio non lo faceva quindi:

Codice: Seleziona tutto

//For nello step event
for(i=0; i<ds_list_size(ellipses); i+=1)
{
    ds_list_replace(ellipses, i, ((wave_height*(1-step/(ds_list_size(ellipses)+5)))*-sin(degtorad(((i-(step-5))*360)/10)*(i>step-5 && i<step+5))));
}
Lascio a Xeryan l'onore di fare l'ultimo :asd:
Con questo miglioramente al code definitivamente non capisco più niente di come funzioni. Dannata matematica :spat: :spat: :spat:
Immagine

Immagine

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

Praticamente modifico l'altezza di ogni cerchio formando un onda. In questo caso il sin serve per creare quest'onda:
Immagine
La funzione "sin()" funziona solo con i radianti quindi devo convertire da gradi (degrees) a radianti (radians) con la funzione "degtorad()".
Voglio che un onda sia grande dieci anelli quindi

Codice: Seleziona tutto

(10*360)/10//Non è prorpio così ma vabbe...
La posizione dell'onda è data dalla variabile step che va da -5 a 55 (ds_list_size(...)+5). Questa condizione:

Codice: Seleziona tutto

(i>step-5 && i<step+5)
Ritorna 1 quando i (ovvero l'anello) è compreso tra step-5 e step+5 (ovvero quando è all'interno dell'onda). Questo fa si che l'onda non si duplichi su tutti i cerchi (Togli la condizione e capirai subito).
Tornando a sopra, questa parte:

Codice: Seleziona tutto

(i-(step-5))
Quando i si trova dentro l'onda (l'inizio dell'onda si trova a step-5), questo calcolo vale 0, man mano che i aumenta questo calcolo andrà da 0 a 10. Quindi se trasformo il codice:

Codice: Seleziona tutto

(10*360)/10
In questo modo:

Codice: Seleziona tutto

((i-(step-5))*360)/10
Quando i si troverà dentro l'onda (se non si trova dentro entra in gioco la condizione vista in precedenza che rende 0 tutto il calcolo) questo codice andrà da 0 a 360 a passi di 36 (10 passi). (Dato che step viene incrementata da una frazione si aggiunge uno sfasamento che rende l'animazione smoothata)
Continuando:

Codice: Seleziona tutto

-sin(...)
Il meno serve ad invertire la "sine wave". Infatti se guardi l'immagine sopra, l'onda parte andando verso l'alto per poi scendere sotto e tornare di nuovo al punto di inizio (l'animazione parte quando la linea punta a destra), mentre nella gif dell'animazione puoi notare che fa il contrario partendo dal basso.
Continuando ancora:

Codice: Seleziona tutto

wave_height*[...]*-sin(...)
La funzione "sin()" ritorna un valore che va da -1 a 1. Moltiplicando questo valore l'onda diventa più alta. Man mano che step aumenta (ovvero man mano che l'onda va avanti) l'onda diminuisce di altezza. Qui entra in gioco l'ultima aggiunta, cioè:

Codice: Seleziona tutto

(1-step/(ds_list_size(ellipses))))
Abbiamo detto che "ds_list_size(ellipses)+5" è 55, e step va da -5 a 55 (da 0 a 50 ci sono gli anelli). Supponiamo che l'onda è a metà percorso, quindi 25:

Codice: Seleziona tutto

step/ds_list_size(ellipses)
Diventa:

Codice: Seleziona tutto

25/50=0.5
Quindi quando step è a 0 il calcolo fa 0, quando step è a 50 il calcolo fa 1. Se moltiplichiamo così però l'onda invece di partire alta e diventare man mano più piccola, farà l'effetto contrario ovvero partire piccola e finire alta. Per invertire la direzione mi basta sottrarre a 1 il precedente calcolo:

Codice: Seleziona tutto

1-step/ds_list_size(ellipses)
Quindi adesso è invertito, quando step è a 0 il calcolo fa 1, quando step e a 25 il calcolo fa 0.5 e quando step e 50 il calcolo fa 0.

Questo è tutto. Non so se si capisce bene ma ho fatto del mio meglio per spiegarlo :asd:
Mi sono accorto di un errore nell'ultima modifica:

Codice: Seleziona tutto

ds_list_replace(ellipses, i, ((wave_height*(1-step/ds_list_size(ellipses)))*-sin(degtorad(((i-(step-5))*360)/10)*(i>step-5 && i<step+5))));
Il "+5" in "ds_list_size(...)" era inutile. :asd:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Breston
Membro
Messaggi: 84
Iscritto il: 21/08/2014, 15:51
Specialità: Nothing
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da Breston »

Per i poligoni, si risolve facilmente con un po' di trigonometria.
Per un poligono con N lati, i vertici rispetto ad un punto P possono essere ricavati come:
[latex]P_i = P + \left( l\cos\left(\frac{2\pi}{N}i\right),l\sin\left(\frac{2\pi}{N}i\right)\right),\ N \in \mathbb{N},\ i \in \mathbb{N} = 0,1,..,N-1[/latex]
dove l è la distanza dei vertici da P. E' chiaro che una parte del problema si risolve ponendo:
[latex]U(x) := \lim_{n\to\infty}\left(\frac{1}{\pi}\arctan(x\cdot n) + 0.5 \right)[/latex]
[latex]R(x) := U(x) - U(x-1)[/latex]
[latex]l\ ' : [0,T_2] \to \mathbb{R} := R(x/T_0)\cdot f(t/T_0) + R\left[(x-T_0)/(T_1-T_0)\right]\cdot L + R\left[(x-T1)/(T_2-T_1)\right]\left[-\frac{L}{T_2-T_1}(t-T_1)\right][/latex]
[latex]l : \mathbb{R} \to \mathbb{R} : l(t - T_2) = l(t)\ \forall\ t,\ l(t) = l\ '(t)\ \forall\ t \in [0,T_2][/latex]
[latex]l(t) := \sum_{i=-\infty}^{+\infty} l\ '(t-iT_2)[/latex]
in questo modo si descrive l'andamento di l: da 0 a T0 cresce secondo f fino a raggiungere un valore massimo L, da T0 a T1 rimane costante, da T1 a T2 decresce linearmente. Per quanto riguarda f, la gif animata mostra che l cresce molto velocemente all'inizio per poi stabilizzarsi:
[latex]\frac{df}{dt}(t) := y(t)[/latex]
[latex]y(0) = v_0[/latex]
[latex]y(1) = 0[/latex]
In particolare mi sembra che la velocità iniziale venga mantenuta pressocché costante per buona parte della durata del periodo (da t = 0 a t = 1),
per questo si può usare una semplice elevazione a potenza alta a piacere fino a raggiungere l'effetto desiderato, per poi normalizzare:
Immagine
in questo caso ottengo [latex]y = v_0(-(8x)^{10}+8^{10})/8^{10}[/latex].
Un altro vincolo su f è che alla fine del periodo deve portare a L:
[latex]f(1) = L \Rightarrow L = \int_0^1y(t)dt = v_0 \frac{10}{11} \Rightarrow v_0 = L \frac{11}{10}[/latex]
e si ottiene quindi
[latex]f(t) = \int_0^t y(t)dt = L \frac{11}{10}(x-\frac{x^{11}}{11})[/latex]
Ora che abbiamo i vertici, resta la seconda parte del problema: disegnare i prolungamenti dei lati.. troppo facile.

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

Siccome dopo aver letto il post di Breston mi sento inutile :asd: completo io! Anche se non in modo matematico...
Supponendo che le posizioni dei vertici sono inserite in un array bidimensionale in cui:
  • array[0]: posizione x del punto
  • array[1]: posizione y del punto


DRAW

Codice: Seleziona tutto

var vertice, vertice_successivo;

for (i=0; i<num_vertici; i++)
{
   if (i==num_vertici-1)
   {
       vertice_successivo=0;
   }
   else
   {
       vertice_successivo=i+1;
   }

   direzione=degtorad(point_direction(array[i][0], array[i][1], array[vertice_successivo][0], array[vertice_successivo][1]))

   draw_line(array[i][0], array[i][1], array[i][0]+cos(degtorad(direzione))*lunghezza_segmento, array[i][1]+sin(degtorad(direzione))*lunghezza_segmento);
}
Non ricordo se in GM gli array si usano con [indice_1, indice_2] o con [indice_1][indice_2]. Per sicurezza uso lo standard [indice_1][indice_2].

NB: La funzione "point_direction(...)" potrebbe dare problemi quando i vertici sono nella stessa posizione (ovvero quando i vertici si chiudono).
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Breston
Membro
Messaggi: 84
Iscritto il: 21/08/2014, 15:51
Specialità: Nothing
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da Breston »

Quando i vertici collassano nell'origine (o in P, come nel mio post) non è la funzione point_direction che potrebbe dare problemi, ma proprio l'algoritmo non ha senso.

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Matematici: una sfida

Messaggio da Solid Snake »

Quale algoritmo? Il tuo o il mio?
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Matematici: una sfida

Messaggio da doom13 »

Solid Snake ha scritto:Quale algoritmo? Il tuo o il mio?
Con ogni probabilità il tuo :asd:
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 25 ospiti