Codice:
program sinussoide;
uses crt,graph;
type vettore=array[1..1000] of real;
var scheda,modulo,f,a,b,c,d,cx,cy:integer;
ics,ips:vettore;
function lenvettore(arrei:vettore):integer; (*per non dovre passare tutte le volte il numero di dati, mi dice la lunghezza di un array*)
var i,num:integer;
begin
num:=0;
for i:=1 to 1000 do
begin
if not(arrei[i]=0) then
num:=i;
end;
lenvettore:=num;
end;
function max(numeri:vettore):real;
var i,n:integer;
macs:real;
begin
n:=lenvettore(numeri);
macs:=numeri[1];
for i:=1 to n do
begin
if numeri[i]>macs then
macs:=numeri[i];
end;
max:=macs;
end;
function rad(gradi:real):real;
begin
rad:=(pi*gradi)/180;
end;
function tg(angolo:real):real;
begin
if not(cos(angolo)=0) then
tg:=sin(angolo)/cos(angolo)
else tg:=0;
end;
procedure assi(tipologia:integer;var xc,yc:integer);
begin
if tipologia=1 then
begin
xc:=0;
yc:=getmaxy;
end
else
begin
xc:=round(getmaxx/2);
yc:=round(getmaxy/2);
end;
line(xc,0,xc,getmaxy);
line(0,yc,getmaxx,yc);
end;
procedure goniometrica(tipo:integer;aa,bi,ci,di:real;var lex,ley:vettore);
var i:integer;
begin
for i:=round(-(getmaxx/2)) to round(getmaxx/2) do
begin
lex[i+round(getmaxx/2)]:=rad(i);
case tipo of
1:ley[i]:=(aa*(sin((bi*lex[i])+ci)))+di;
2:ley[i]:=(aa*(cos((bi*lex[i])+ci)))+di;
3:ley[i]:=(aa*(tg((bi*lex[i])+ci)))+di;
end;
end;
end;
procedure disegnacurva(curvax,curvay:vettore;xc,yc,disegno:integer);
var i,nx,ny,x,y:integer;
ux,uy,xf,yf:real;
begin
ux:=(getmaxx-xc)/max(curvax);
uy:=yc/max(curvay);
nx:=lenvettore(curvax);
ny:=lenvettore(curvay);
while ny<nx do
ny:=ny+1;
if nx=ny then
begin
for i:=1 to nx do
begin
xf:=(curvax[i]*ux)+xc;
yf:=-(curvay[i]*uy)+yc;
if ((xf<32000) and (yf<32000)) then
begin
x:=round(xf);
y:=round(yf);
if (not(x<0) and not(y<0)) then
begin
putpixel(x,y,white);
if not(disegno=0) then
delay(20);
end;
end;
end;
end;
end;
begin
clrscr;
write('Cosa vuoi disegnare? Digita 1 per una sinusoide, 2 per una cosinusoide e 3 per una tangentoide: ');
readln(f);
writeln('Inserisci i coefficenti della funzione del tipo: y=a*fn(bx+c)+d');
write('Inserisci a: ');
readln(a);
write('Inserisci b: ');
readln(b);
write('Inserisci c: ');
readln(c);
write('Inserisci d: ');
readln(d);
scheda:=detect;
initgraph(scheda,modulo,'C:\TP\BGI\');
assi(2,cx,cy);
goniometrica(f,a,b,c,d,ics,ips);
disegnacurva(ics,ips,cx,cy,0);
readln;
closegraph;
end.
la procedura che non va è 'disegnacurva' le altre servono solo per arrivare a quel risultato