Matematici: una sfida
- 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
Matematici, alle armi!
Ho trovato questa gif su Internet
Sareste capaci di riprodurre lo stesso ed identico effetto con Game Maker?
EDIT: Intanto ci provo io Anche se vorrei sapere come lo fareste voi
Ho trovato questa gif su Internet
Sareste capaci di riprodurre lo stesso ed identico effetto con Game Maker?
EDIT: Intanto ci provo io Anche se vorrei sapere come lo fareste voi
-
- Admin
- Messaggi: 12355
- Iscritto il: 19/08/2009, 16:20
- Specialità: Programmazione 3D
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
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
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
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
- 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
Uddzio!!! Manco il tempo di grattarmi il culo popo! (cit.) Già fatto bello finito consegnato! Ti stimo moltoJak ha scritto:Praise the cube
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
Re: Matematici: una sfida
Bitch please.
CREATE
STEP
DRAW
Non ho messo la goccia, mi sembrava inutile. Inoltre con un array si possono simulare più onde.
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);
}
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;
}
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);
}
♥♥♥♥♥♥
♥♥♥♥♥♥
♥♥♥♥♥♥
Spoiler
- 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
Bel codice Solid Snake! Anche se hai dimenticato di mettere alpha sempre di meno man mano che gli ellissi venivano disegnati Ma è facile da aggiungere
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
Re: Matematici: una sfida
Codice migliorato:
STEP
//DRAW
Adesso l'animazione è smoothata!
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;
}
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);
}
♥♥♥♥♥♥
♥♥♥♥♥♥
♥♥♥♥♥♥
Spoiler
- 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
Bella bella! Davvero un ottimo codiceSolid Snake ha scritto:Codice migliorato:
STEP//DRAWCodice: 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; }
Adesso l'animazione è smoothata!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); }
- doom13
- Moderatore
- Messaggi: 2093
- Iscritto il: 31/08/2012, 15:40
- Specialità: Programmazione
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
Ahah anche Xeryan vuole partecipare, dai Wolfrost.Xeryan ha scritto:altre sfide, altre sfide!
Sempre un'immagine da riprodurre?
Spoiler
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"
- 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
Dovrete ricreare gli effetti qui proposti
Ma non solo imitando la gif, dovete strutturare ogni effetto come se fosse un effetto di transizione da una room ad un'altra!
Ma non solo imitando la gif, dovete strutturare ogni effetto come se fosse un effetto di transizione da una room ad un'altra!
- doom13
- Moderatore
- Messaggi: 2093
- Iscritto il: 31/08/2012, 15:40
- Specialità: Programmazione
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
Siè, ragequit generale
Spoiler
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
Re: Matematici: una sfida
A me annoiava farlo, vado nel pallone quando si tratta di angoli
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:
Lascio a Xeryan l'onore di fare l'ultimo
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))));
}
♥♥♥♥♥♥
♥♥♥♥♥♥
♥♥♥♥♥♥
Spoiler
- 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
Con questo miglioramente al code definitivamente non capisco più niente di come funzioni. Dannata matematicaSolid Snake ha scritto:A me annoiava farlo, vado nel pallone quando si tratta di angoli
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:Lascio a Xeryan l'onore di fare l'ultimoCodice: 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)))); }
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
Re: Matematici: una sfida
Praticamente modifico l'altezza di ogni cerchio formando un onda. In questo caso il sin serve per creare quest'onda:
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 quindiLa posizione dell'onda è data dalla variabile step che va da -5 a 55 (ds_list_size(...)+5). Questa condizione:
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: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:
In questo modo:
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: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: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è:
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:
Diventa:
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:
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
Mi sono accorto di un errore nell'ultima modifica:Il "+5" in "ds_list_size(...)" era inutile.
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...
Codice: Seleziona tutto
(i>step-5 && i<step+5)
Tornando a sopra, questa parte:
Codice: Seleziona tutto
(i-(step-5))
Codice: Seleziona tutto
(10*360)/10
Codice: Seleziona tutto
((i-(step-5))*360)/10
Continuando:
Codice: Seleziona tutto
-sin(...)
Continuando ancora:
Codice: Seleziona tutto
wave_height*[...]*-sin(...)
Codice: Seleziona tutto
(1-step/(ds_list_size(ellipses))))
Codice: Seleziona tutto
step/ds_list_size(ellipses)
Codice: Seleziona tutto
25/50=0.5
Codice: Seleziona tutto
1-step/ds_list_size(ellipses)
Questo è tutto. Non so se si capisce bene ma ho fatto del mio meglio per spiegarlo
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))));
♥♥♥♥♥♥
♥♥♥♥♥♥
♥♥♥♥♥♥
Spoiler
- Breston
- Membro
- Messaggi: 84
- Iscritto il: 21/08/2014, 15:51
- Specialità: Nothing
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
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:
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.
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:
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.
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
Re: Matematici: una sfida
Siccome dopo aver letto il post di Breston mi sento inutile completo io! Anche se non in modo matematico...
Supponendo che le posizioni dei vertici sono inserite in un array bidimensionale in cui:
DRAW
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).
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);
}
NB: La funzione "point_direction(...)" potrebbe dare problemi quando i vertici sono nella stessa posizione (ovvero quando i vertici si chiudono).
♥♥♥♥♥♥
♥♥♥♥♥♥
♥♥♥♥♥♥
Spoiler
- Breston
- Membro
- Messaggi: 84
- Iscritto il: 21/08/2014, 15:51
- Specialità: Nothing
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
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.
-
- GMI Advanced
- Messaggi: 2093
- Iscritto il: 19/12/2010, 16:17
- Specialità: Programmazione
- Uso: GM:Studio 1.4 Standard
- Contatta:
- doom13
- Moderatore
- Messaggi: 2093
- Iscritto il: 31/08/2012, 15:40
- Specialità: Programmazione
- Uso: GM:Studio 2
- Contatta:
Re: Matematici: una sfida
Con ogni probabilità il tuoSolid Snake ha scritto:Quale algoritmo? Il tuo o il mio?
Spoiler
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"
Chi c’è in linea
Visitano il forum: Nessuno e 38 ospiti