Oppure

Loading
18/11/11 21:13
luca95
Ciao a tutti stavo pensando di fare un programma con tanto di grafica che rappresenti un moto armonico, mi spiego meglio: a scuola abbiamo studiato che il moto armonico è la proiezione di un punto che gira in una circonferenza su un diametro e se il tutto viene illuminato con dei proiettori e l'ombra va su una pellicola si formerà una sinusoide... volevo provare a farlo in pascal ma non ho la più pallida idea di come poter fare a farlo... qualcuno che mi possa dare un idea?
se non avete capito il pezzo sopra ecco un immagine:
fisicaondemusica.unimore.it/…
un esempio di quello che vorrei fare si vede in questa immagine (intendo con anche il movimento): fisicaondemusica.unimore.it/…
Ultima modifica effettuata da luca95 18/11/11 21:13
aaa
18/11/11 22:05
Poggi Marco
Ciao!

In Pascal, è possibile disegnare semplici grafici.
In questo sito c' è un esempio: pierotofy.it/pages/guide/Guida_Pascal/Appendice_8_La_grafica/
Da principio comincia semplicemente ad aprire e chiudere la modalità grafica.
aaa
19/11/11 17:29
luca95
con la grafica ci so già lavorare è che volevo provare a fare qualcosa di più complesso... e questa mi sembrava una bella cosa tutto qui :)
aaa
19/11/11 17:46
Poggi Marco
Vuoi dare l' illusione del movimento?
In questo caso disegna una figura, sovrascrivila usando lo stesso colore dello sfondo, ed infine la ridisegni in un' altra posizione.
aaa
19/11/11 22:13
lorenzoscarrone
nn so se ho capito la domanda, ti mando il programma che ho fatto e mi dici se è di questo tipo, poi fammi tutte le domande del caso:
uses graph,wincrt;
const r= 100;
var a,b:smallint;
i,x1,y1,k1:REAL;
k,yr,xr,nk,u,ang:INTEGER;
n:string;
c_1,c_2,delta_x,delta_y,delta,xp,yp,coef_1,coef_2:real;
x,y:array[0..10]of real;
procedure negativa;
begin
c_1:=(-coef_1*x[0]+y[0]);
c_2:=(-coef_2*x[0]+y[0]+r*sqrt(coef_2*coef_2+1));
delta:=(coef_2-coef_1);
delta_x:=(c_1-c_2);
delta_y:=(coef_2*c_1)-(coef_1*c_2);
xp:=delta_x/delta;
yp:=delta_y/delta;
setcolor(blue);
//line(trunc(x[0]),trunc(y[0]),trunc(xp),trunc(yp));
setcolor(trunc(k1));
//setfillstyle(1,trunc(k1));
fillellipse(trunc(xp),trunc(yp),trunc(k1)div 3,trunc(k1)div 2);
delay(50);
end;
procedure positiva;
begin
setcolor(blue);
c_1:=(-coef_1*x[0]+y[0]);
c_2:=(-coef_2*x[0]+y[0]-r*sqrt(coef_2*coef_2+1));
delta:=(coef_2-coef_1);
delta_x:=(c_1-c_2);
delta_y:=(coef_2*c_1)-(coef_1*c_2);
xp:=delta_x/delta;
yp:=delta_y/delta;
//line(trunc(x[0]),trunc(y[0]),trunc(xp),trunc(yp));
setcolor(trunc(k1));
//setfillstyle(1,trunc(k1));
fillellipse(trunc(xp),trunc(yp),trunc(k1)div 3,trunc(k1)div 2);
delay(50);
end;
begin
a:=detect;
initgraph(a,b,'');
xr:=(getmaxx div 2);
yr:=(getmaxy div 2);
x[0]:=(getmaxx div 2);
y[0]:=(getmaxy div 2);
i:=0;
//circle(trunc(x[0]),trunc(y[0]),r);
i:=2;
repeat
//circle(trunc(x[0]),trunc(y[0]),r);
if i>=14.4 then begin i:=2;x[1]:=0;y[1]:=0;xp:=0;yp:=0;end;
i:=(i+0.2); writeln(i);
k1:=k1+0.2;
setcolor(white);
x[1]:= ((x[0])*cos(i)-y[0]*sin(i));
y[1]:= ((x[0])*sin(i)+y[0]*cos(i));
coef_1:= (y[0]-y[1])/(x[0]-x[1]);
coef_2:=-1*(x[0]-x[1])/(y[0]-y[1]);
if(i<=8.6)then negativa;
if(i>8.6) then positiva;
if(trunc(k1)>=260)then k1:=0;
until keypressed;
closegraph;
end.
probabilmente ci saranno un po di variabili che nn sono state usate ma nn ci fare caso.
aaa
20/11/11 15:57
luca95
devo dire che è un bel programma però forse mi sono spiegato io ma non è proprio quello di cui avevo bisogno... a me servirebbe una circonferenza di fondo su cui farci girare un'altro tondino più piccolo come hai fatto tu ma senza far ingrandire ogni volta la dimensione del tondino e senza far rimanere tutti i tondini disegnati ma deve vedersene uno solo... sostanzialmente il mio serio problema è come trovare i punti della circonferenza sui quali impostare il centro dei tondini più piccoli... probabilmente nel programma che mi hai postato lo hai fatto perché giravano in cerchio ma non capisco quale sia la parte :)
aaa
20/11/11 22:45
lorenzoscarrone
il mio programma funziona come quello che vuoi fare tu, solo che l'ho modificato per renderlo + bello.
comunque il procedimento che ho seguito è quello che devi applicare tu per risolvere il programma:

1) determini il centro della circonferenza x,y e lo fai ruotare utilizzando il seno e il coseno:
 x_ruotato:=x*cos(ang)-y*sin(ang); y_ruotato:=x*sin(ang)+y*cos(ang);


2) a questo punto ti calcoli le rette passanti per il punto ruotato P(x_ruotato,y_ruotato); e per il centro della circonferenza(x,y); dopo fai passare una retta perpendicolare a quella ruotata per il centro(x,y)

3) a questo devi cercare una retta parallela alla perpendicolare appena trovata con uguale ddistanza dal raggio utilizzando la formula della distanza punto retta
Attenzione! perchè applicando questa formula trovi 2 rette.

4) trovate le due rette eqidistanti dal centro le intersechi con la retta perpendicolare loro passante per il centro. per risolvere il sistema ti consiglio di usare Cramer.

Ovviamente ti basta trovare i coefficenti angolari delle rette per implementare tutti i calcoli nel programma. Probabilmente non sono ancora stato abbastanza chiaro così domani ti posto un foglio in cui spiego passo a passo cosa ho fatto nel programma!
aaa
21/11/11 20:07
luca95
allora aspetto il tuo foglio :) grazie mille per l'aiuto che mi stai dando :)
aaa