[pascal] skalowanie

0

Musze zrobic na informatyke program, ktory ma liczyc zasieg w rzucie ukosnym z kata i predkosci a nastepnie rysowac wykres. Zrobilem wszystko a problem zaczyna sie gdy zasieg jest wiekszy jak 640 bo wykres "ucieka" za monitor jak to wyskalowac? kompinowalem cos z procedura "if" ale nic sensownego mi nie wychodzilo :(

uses Crt, Graph;
var v,h,kat,rad,z,a,tg:real;
ster,tryb,y,x:integer;
zz:string;

procedure wczytaj_predkosc;

begin
repeat{procedura wczytaj predkosc}
WriteLn('Podaj predkosc paczatkowa Vo w m/s');
Readln(v);
until v>0;
end;


procedure podaj_kat;

begin
repeat{procedura podaj kat}
Writeln('Podaj kat w stopniach');
Readln(kat);
until (kat>0) and (kat<90);
end;


procedure zamien_na_radiany;

begin
rad:=kat*pi/180;{procedura zamien na radiany}
writeln('miara tego kata w radianach wynosi ',  rad:2:3);
end;


procedure oblicz_zasieg;

begin
z:=(sqr(v)/9.81)*sin(2*rad);{procedura oblicz zasieg}
WriteLn('zasieg wynosi ', z:3:3);
Readln;
end;

procedure init_graph;

begin
ster:=9; tryb:=2;{procedura init graph}
initgraph(ster,tryb,'D:\tp7\tp7\BGI');
Setaspectratio(10000,10000);
end;


procedure rysuj_uklad;

begin
setcolor(red);{procedura rysuj uklad}
line(2,0,2,480);                     {os oy}
line(0, getmaxY, getmaxX, getmaxY);  {os ox}
end;


procedure rysuj_wykres;

begin
    a:=9.81/(2*sqr(v*cos(rad)));{procedura rysuj wykres}
    tg:=-sin(rad)/cos(rad);

    x:=0;
    y:=getmaxY-1;
    putpixel(x,y,white);
    repeat
    delay(5000);
    putpixel(x,y,blue);
    x:=x+1;
    y:=getmaxY-1+round((a*x+tg)*x);
    putpixel(x,y,yellow);
    until (x>=getmaxX) or (y>=getmaxY-1);
end;

BEGIN

Clrscr;

wczytaj_predkosc;
podaj_kat;
zamien_na_radiany;
oblicz_zasieg;
init_graph;
rysuj_uklad;
rysuj_wykres;

repeat until keypressed;
closegraph;
end.
0

Skalowanie to nic innego jak przemnożenie wszystkich współżędnych punktów przez współczynnik skalowania. Przykład: Masz kwadrat o boku a = 5, a chcesz mieć mniejszy o 30%, czyli a1 := a*0.7

Współczynnik skalowania możesz obliczyć mając maximum zbioru danych:

Max = 1280;
ScreenRes = 640;
Wsp = ScreenRes / Max.

0

a moglbys mi napisac kod? bylbym bardzo wdzieczny :) mecze sie juz z tym od jakiegos czasu bez rezultatu :/

0

prosze

0

Hmmmm doszlem do czegos takiego ale to dziala hmm powiedzmyze "srednio", gdzie mam blad?

uses Crt, Graph;
var v,h,kat,rad,z,a,tg,skala:real;
ster,tryb,y,x:integer;
zz:string;

procedure wczytaj_predkosc;

begin
repeat{procedura wczytaj predkosc}
WriteLn('Podaj predkosc paczatkowa Vo w m/s');
Readln(v);
until v>0;
end;


procedure podaj_kat;

begin
repeat{procedura podaj kat}
Writeln('Podaj kat w stopniach');
Readln(kat);
until (kat>0) and (kat<90);
end;


procedure zamien_na_radiany;

begin
rad:=kat*pi/180;{procedura zamien na radiany}
writeln('miara tego kata w radianach wynosi ',  rad:2:3);
end;


procedure oblicz_zasieg;

begin
z:=(sqr(v)/9.81)*sin(2*rad);{procedura oblicz zasieg}
WriteLn('zasieg wynosi ', z:3:3);
Readln;
end;


procedure oblicz_skale;

begin
skala:=z/640;{procedura oblicz skale}
WriteLn('skala wynosi ', skala:3:3);
Readln;
end;


procedure init_graph;

begin
ster:=9; tryb:=2;{procedura init graph}
initgraph(ster,tryb,'D:\tp7\tp7\BGI');
Setaspectratio(10000,10000);
end;


procedure rysuj_uklad;

begin
setcolor(red);{procedura rysuj uklad}
line(2,0,2,480);                     {os oy}
line(0, getmaxY, getmaxX, getmaxY);  {os ox}
end;


procedure rysuj_wykres;

begin
    a:=9.81/(2*sqr(v*cos(rad)));{procedura rysuj wykres}
    tg:=-sin(rad)/cos(rad);

    x:=0;
    y:=getmaxY-1;
    putpixel(x,y,white);
    repeat
    delay(5000);
     if skala>1 then
    putpixel(round(x/skala),round(y/skala),blue)
    else
    putpixel(x,y,blue);
    x:=(x+1);
    y:=getmaxY-1+round((a*x+tg)*x);
    putpixel(x,y,yellow);
    until (x>=getmaxX) or (y>=getmaxY-1);
    
end;

BEGIN

Clrscr;

wczytaj_predkosc;
podaj_kat;
zamien_na_radiany;
oblicz_zasieg;
oblicz_skale;
init_graph;
rysuj_uklad;
rysuj_wykres;

repeat until keypressed;
closegraph;
end.
0

Hmmmm doszlem do czegos takiego ale to dziala hmm powiedzmyze "srednio", gdzie mam blad?

uses Crt, Graph;
var v,h,kat,rad,z,a,tg,skala:real;
ster,tryb,y,x:integer;
zz:string;

procedure wczytaj_predkosc;

begin
repeat{procedura wczytaj predkosc}
WriteLn('Podaj predkosc paczatkowa Vo w m/s');
Readln(v);
until v>0;
end;


procedure podaj_kat;

begin
repeat{procedura podaj kat}
Writeln('Podaj kat w stopniach');
Readln(kat);
until (kat>0) and (kat<90);
end;


procedure zamien_na_radiany;

begin
rad:=kat*pi/180;{procedura zamien na radiany}
writeln('miara tego kata w radianach wynosi ',  rad:2:3);
end;


procedure oblicz_zasieg;

begin
z:=(sqr(v)/9.81)*sin(2*rad);{procedura oblicz zasieg}
WriteLn('zasieg wynosi ', z:3:3);
Readln;
end;


procedure oblicz_skale;

begin
skala:=z/640;{procedura oblicz skale}
WriteLn('skala wynosi ', skala:3:3);
Readln;
end;


procedure init_graph;

begin
ster:=9; tryb:=2;{procedura init graph}
initgraph(ster,tryb,'D:\tp7\tp7\BGI');
Setaspectratio(10000,10000);
end;


procedure rysuj_uklad;

begin
setcolor(red);{procedura rysuj uklad}
line(2,0,2,480);                     {os oy}
line(0, getmaxY, getmaxX, getmaxY);  {os ox}
end;


procedure rysuj_wykres;

begin
    a:=9.81/(2*sqr(v*cos(rad)));{procedura rysuj wykres}
    tg:=-sin(rad)/cos(rad);

    x:=0;
    y:=getmaxY-1;
    putpixel(x,y,white);
    repeat
    delay(5000);
     if skala>1 then
    putpixel(round(x/skala),round(y/skala),blue)
    else
    putpixel(x,y,blue);
    x:=(x+1);
    y:=getmaxY-1+round((a*x+tg)*x);
    putpixel(x,y,yellow);
    until (x>=getmaxX) or (y>=getmaxY-1);
    
end;

BEGIN

Clrscr;

wczytaj_predkosc;
podaj_kat;
zamien_na_radiany;
oblicz_zasieg;
oblicz_skale;
init_graph;
rysuj_uklad;
rysuj_wykres;

repeat until keypressed;
closegraph;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1