| | |
| Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
Autor | Správa |
---|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 Bydlisko: BA - WESTSIDE | Napísal p360t: 21.05.2007 12:28 | |
|
Tak, pred nejakým časom som na IRC oznamoval tvorbu Goniometrického gulášu, dnes ho predstavujem svetu.
Je to veľmi jednoduchá pascaloidná aplikácia, ktorá na požiadanie zobrazí grafy funkcií sínus, kosínus, tangens, kotangens, sekans, kosekans a arkustangens. Zobrazuje ich buď jednotlivo, alebo ako Guláš. Dá sa nastavovať "priblíženie", tj. ako keby vzdialenosť od stredu súradnicovej sústavy. Človek tak má možnosť prehľadnejšie vidieť priebeh funkcie (bohužiaľ, horizontálny ani vertikálny posun nie je možný, to až nabudúce ). Vodorovné prerušované čiary majú y-hodnotu +1 a -1 a zvislé sú vždy celočíselné násobky pi/2.
Určite to nie je úplne ideálne, funkcie to pri veľkom priblížení nezobrazuje spojito, ale skôr ako postupnosti a na príkazy reaguje až po druhom stlačení, ale pohrať sa s tým dá. Možno to niekomu pomôže pri zapamätaní si grafov tých funkcií.
Tu je môj Guláš. Enjoy.
Ak by niekto chcel, tu je zdroják (ak sa vám niečo nezdá, kľudne ma poučte o mojich chybách):
Kód: Program GoniometrickyGulas; Uses Graph, Crt; Var Gd, Gm: integer; i, x, Bulhar: longint; Procedure Menu; Var i:integer; Begin ClrScr; Writeln; Writeln; Writeln; For i:= 1 To 19 Do Write(' '); Write(Chr(457)); For i:= 1 To 40 Do Write(Chr(461)); Write(Chr(443)); Writeln;
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); For i:= 1 To 40 Do Write(' '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' Goniometricky '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' Gulas '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); For i:= 1 To 40 Do Write(' '); Writeln(Chr(442)); For i:= 1 To 19 Do Write(' '); Write(Chr(442)); For i:= 1 To 40 Do Write(' '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' [S]inus [K]osinus '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' [T]angens K[o]tangens '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' S[e]cant Kose[c]ant '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' A[r]custangens [G]ulas!!! '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' [ESC] - Koniec [N]astavenia '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); For i:= 1 To 40 Do Write(' '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); Write(' (c) Peter Kovac, 2007 '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(442)); For i:= 1 To 40 Do Write(' '); Writeln(Chr(442));
For i:= 1 To 19 Do Write(' '); Write(Chr(456)); For i:= 1 To 40 Do Write(Chr(461)); Write(Chr(444)); End;
Procedure Nastavenia; Begin ClrScr; Repeat Write('Nastav zvacsenie (rozsah 10-999, optimalne okolo 50): '); Readln(Bulhar); Until (Bulhar > 9) And (Bulhar < 1000); Menu; End;
Procedure Inicializacia; Var Gd, Gm, i, B: Integer; Begin Gd:= 0; Gm:= 0; InitGraph(Gd, Gm, 'C:\TP7\BGI\'); ClearDevice; SetColor(White); If GraphResult <> 0 Then Halt; Line(320, 0, 320, 480); Line(0, 240, 640, 240); SetColor(7); SetLineStyle(DottedLn, 0, NormWidth); Line(0, 240-Bulhar, 640, 240-Bulhar); Line(0, 240+Bulhar, 640, 240+Bulhar); SetColor(8); For i:= -10 To 10 Do Begin If i <> 0 Then Begin B:= Trunc(i*Pi*Bulhar/2); Line(320+B, 0, 320+B, 480); End; End; End;
Procedure Sinus; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Sin(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 11); End; ReadKey; CloseGraph; Menu; End;
Procedure KoSinus; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Cos(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 12); End; ReadKey; CloseGraph; Menu; End;
Procedure Tangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Sin(i*Pi/180)/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 10); End; End; ReadKey; CloseGraph; Menu; End;
Procedure KoTangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Cos(i*Pi/180)/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 4); End; End; ReadKey; CloseGraph; Menu; End;
Procedure Secant; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(1/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 9); End; End; ReadKey; CloseGraph; Menu; End;
Procedure KoSecant; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(1/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 14); End; End; ReadKey; CloseGraph; Menu; End;
Procedure ArcTangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(ArcTan(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 6); End; End; ReadKey; CloseGraph; Menu; End;
Procedure Vsetky; Var i, x, y:integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); {sinus} y := Trunc(Sin(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 11); {kosinus} y := Trunc(Cos (i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 12);
If i mod 90 <> 0 Then Begin {tangens} y := Trunc(Sin(i*Pi/180)/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 10); {kotangens} y := Trunc(Cos(i*Pi/180)/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 4); {sekans} y := Trunc(1/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 9); {kosekans} y := Trunc(1/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 14); {arctangens} y := Trunc(ArcTan(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 6); End; End; ReadKey; CloseGraph; Menu; End;
Begin {zaciatok samotneho programu} Bulhar := 50; Repeat Menu; Case Ord(Readkey) Of 83, 115: Sinus; 75, 107: KoSinus; 84, 116: Tangens; 79, 111: KoTangens; 69, 101: Secant; 67, 99: KoSecant; 82, 114: ArcTangens; 71, 103: Vsetky; 78, 110: Nastavenia; End; Until Ord(Readkey) = 27; End.
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 28.04.07 Prihlásený: 03.11.09 Príspevky: 133 Témy: 1 | Napísal imcold: 21.05.2007 18:14 | |
|
Úpravy:
-procedúra Menu sa dá podstatne zostručniť použitím proc. GotoXY(x, y: byte), ktorá nastavuje pozíciu kurzora
-Menu stačí volať v slučke, v ktorej sa spracúva vstup, aj to nie v každom prechode slučkou (a navyše stačí jedno ReadKey() )
-odstránené nepotrebné globálne premenné a cesta k BGI fontom pri InitGraph() (runtime error ak cesta neexistuje, afaik);
-Chr() má mať parameter s rozsahom typu byte (berie iba 'najspodnejší' bajt): Chr(442) -> Chr( (442 - 256) )
-skompilované pod freepascalom
ggx.exe
Kód: Program GoniometrickyGulas; Uses crt, graph; Var Bulhar: longint; znak: char; prekresli_menu: boolean;
Procedure Menu; const m_sirka = 40; m_vyska = 13; nc = 60; Var i:byte; Begin ClrScr;
//vypis text gotoxy(1,5); Writeln(' Goniometricky ':nc); Writeln(' Gulas ':nc); Writeln(); writeln(); Writeln(' [S]inus [K]osinus ':nc); Writeln(' [T]angens K[o]tangens ':nc); Writeln(' S[e]cant Kose[c]ant ':nc); Writeln(' A[r]custangens [G]ulas!!! ':nc); Writeln(' [ESC] - Koniec [N]astavenia ':nc); Writeln(); Writeln(' (c) Peter Kovac, 2007 ':nc); //nakresli ram //horiz for i:= 1 to m_sirka do begin gotoxy(i+20, 4); write(Chr(205)); gotoxy(i+20, 4+m_vyska); write(Chr(205)); end; //vert for i := 5 to 4+m_vyska do begin gotoxy(20, i); write(Chr(186)); gotoxy(20+m_sirka, i); write(Chr(186)); end; //decor gotoxy(20, 4); //lt Write(Chr(201)); gotoxy(20+m_sirka, 4); //rt Write(Chr(187)); gotoxy(20, 4+m_vyska); //ld Write(Chr(200)); gotoxy(20+m_sirka, 4+m_vyska); //rd Write(Chr(188)); End;
Procedure Nastavenia; Begin ClrScr; Repeat Write('Nastav zvacsenie (rozsah 10-999, optimalne okolo 50): '); Readln(Bulhar); Until (Bulhar > 9) And (Bulhar < 1000); End;
Procedure Inicializacia; Var Gd, Gm: smallint; i, B: Integer; Begin Gd:= 0; Gm:= 0; InitGraph(Gd, Gm, ''); ClearDevice; SetColor(White); If GraphResult <> 0 Then Halt; Line(320, 0, 320, 480); Line(0, 240, 640, 240); SetColor(7); SetLineStyle(DottedLn, 0, NormWidth); Line(0, 240-Bulhar, 640, 240-Bulhar); Line(0, 240+Bulhar, 640, 240+Bulhar); SetColor(8); For i:= -10 To 10 Do Begin If i <> 0 Then Begin B:= Trunc(i*Pi*Bulhar/2); Line(320+B, 0, 320+B, 480); End; End; End;
Procedure Sinus; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Sin(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 11); End; ReadKey; CloseGraph; End;
Procedure KoSinus; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Cos(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 12); End; ReadKey; CloseGraph; End;
Procedure Tangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Sin(i*Pi/180)/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 10); End; End; ReadKey; CloseGraph; End;
Procedure KoTangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(Cos(i*Pi/180)/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 4); End; End; ReadKey; CloseGraph; End;
Procedure Secant; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(1/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 9); End; End; ReadKey; CloseGraph; End;
Procedure KoSecant; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(1/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 14); End; End; ReadKey; CloseGraph; End;
Procedure ArcTangens; Var i, x, y: Integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin If i mod 90 <> 0 Then Begin x := Trunc(i*(Bulhar*Pi/180)+320); y := Trunc(ArcTan(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 6); End; End; ReadKey; CloseGraph; End;
Procedure Vsetky; Var i, x, y:integer; Begin Inicializacia; For i:= -1080 To 1080 Do Begin x := Trunc(i*(Bulhar*Pi/180)+320); {sinus} y := Trunc(Sin(i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 11); {kosinus} y := Trunc(Cos (i*Pi/180+Pi)*Bulhar+240); PutPixel(x, y, 12);
If i mod 90 <> 0 Then Begin {tangens} y := Trunc(Sin(i*Pi/180)/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 10); {kotangens} y := Trunc(Cos(i*Pi/180)/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 4); {sekans} y := Trunc(1/Cos(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 9); {kosekans} y := Trunc(1/Sin(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 14); {arctangens} y := Trunc(ArcTan(i*Pi/180)*Bulhar-240)*(-1); PutPixel(x, y, 6); End; End; ReadKey; CloseGraph; End;
Begin {zaciatok samotneho programu} Bulhar := 50; Menu; Repeat prekresli_menu := true; znak := Readkey; Case Ord(znak) Of 83, 115: Sinus; 75, 107: KoSinus; 84, 116: Tangens; 79, 111: KoTangens; 69, 101: Secant; 67, 99: KoSecant; 82, 114: ArcTangens; 71, 103: Vsetky; 78, 110: Nastavenia; else prekresli_menu := false End; if prekresli_menu then Menu; Until Ord(znak) = 27; End.
|
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | Napísal juho: 21.05.2007 19:34 | |
|
imcold píše: Úpravy: ty si mu uplne donicil jeho program. to je proti pravidlam slusneho programovania.... Sak to mal dobre. ale v pohode inak ked mas readkey a stlacis nejaku funkcnu klavesu tak najprv nabehne #0 az na druhykrat sa vyhodnoti. a ten char si myslim ze to skor robi (x mod 256) nez (x-256) ale sak aj tak by sa to dalo, v tomto pripade.
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 |
preboha, babrať sa s grafiou v pascale? že vás to ešte baví..
btw: načo je ti tam procedúra všetky? stačí lepšie poriešiť inicializáciu a bude to efektivnejsie
|
|
Registrovaný: 28.04.07 Prihlásený: 03.11.09 Príspevky: 133 Témy: 1 | Napísal imcold: 23.05.2007 16:25 | |
|
juho:
Citácia: ty si mu uplne donicil jeho program. lol. ktorú časť som úplne doničil? Skrátenie a podľa môjho názoru sprehladnenie procedúry Menu a odstránenie jej volania na miestach, kde to de facto nemá žiaden efekt? Odstránenie deklarácie nepoužívaných premenných, alebo absolútnej cesty k BGI fontom? O jedno volanie ReadKey menej (odstranuje jedno zbytočné stlačenie klávesy, ak chce človek vidieť inú funkciu)? Podstatné je podľa mňa práve to vykreslovanie, ktorého som sa ani nedotkol Cieľom môjho príspevku bolo navrhnúť zostručnenie tých menej podstatných vecí naokolo, a nie kompletný prepis - okrem menu zhruba 15 riadkov zmenených/odstránených. Citácia: to je proti pravidlam slusneho programovania.... Nepoznám tvoje pravidlá slušného programovania. Citácia: Sak to mal dobre. Skutočne? Citácia: -Chr() má mať parameter s rozsahom typu byte (berie iba 'najspodnejší' bajt): Chr(442) -> Chr( (442 - 256) ) Citácia: a ten char si myslim ze to skor robi (x mod 256) nez (x-256) ale sak aj tak by sa to dalo, v tomto pripade. Mal som sa vyjadriť presnejšie: pri kompilovaní počas vyhodnocovania konštanty nastane "range check error" (keďže parameter procedúry je menšieho typu, aký je potrebný pre predanie konštanty procedúre), a namiesto celej konštanty sa do programu zapíše iba časť zodpovedajúceho rozsahu (viď generovaný kód) - to som myslel tým 'najspodnejším' bajtom. Tým Chr(442) -> Chr( (442 - 256) ) som myslel, že všetky hodnoty má posunuté o 256 - imho divné ;-) Takže žiadne mínus ani mod. Btw. použitie Chr v skutočnosti negeneruje volanie funkcie. audiotrack píše: btw: načo je ti tam procedúra všetky? stačí lepšie poriešiť inicializáciu a bude to efektivnejsie
Ak sa pod efektivitu počíta zostručnenie a odstránenie duplicitného kódu, tak podľa môjho odhadu sa to dá zapísať pod 200 riadkov (oproti cca.300). Avšak to by už bol dosť velký zásah do programu, alebo skôr kompletný prepis, a to by asi p360t nebol rád .
|
|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 Bydlisko: BA - WESTSIDE | Napísal autor témy p360t: 23.05.2007 16:39 | |
|
Heh, zaujímavá diskusia. Akékoľvek zmeny v tom programe sú podľa vášho gusta, veď preto som aj ukázal celý kód. Som rád, imcold, že si nejaké moje chyby odhalil a opravil.
K tej ceste ku BGI - bez nej mi to nefungovalo, bolo mi jasné, že to môže robiť problémy, ale pri výrobe toho programu mi nešlo až tak o výsledný produkt ako o vlastné zdokonalenie, takže podobné "chybičky krásy" (podobne ako s tým menu, kde ma neposlúchalo GoToXY) som ignoroval.
Hovorím, išlo mi hlavne o vlastné precvičenie sa, asi to nebol ideálny pokus, ale pokiaľ človek nejde so svojou kožou na trh, nič nové sa nedozvie.
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 28.04.07 Prihlásený: 03.11.09 Príspevky: 133 Témy: 1 | Napísal imcold: 29.05.2007 13:57 | |
|
S tou cestou ani s gotoxy ti neporadím, na taký problém som ešte nenarazil.
Citácia: Hovorím, išlo mi hlavne o vlastné precvičenie sa, asi to nebol ideálny pokus, ale pokiaľ človek nejde so svojou kožou na trh, nič nové sa nedozvie.
tak potom moja verzia ggx + ggx.pas + graph_scrnshot.pas - narýchlo zostavený unit pre uloženie obrazovky z graph-u - ukážka toho, ako sa dá získať screenshot cez GetImage, keby si niekedy použil freepascal + graph. Taktiež nič ideálne, len som zvolil iný prístup: vykresľuje sa len v jednej funkcii, ostatné slúžia iba na výpočet y súradnice.
|
|
Registrovaný: 19.09.06 Prihlásený: 21.04.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... |
Nechapem tej procedure menu, nebolo by jednoduchsie
procedure menu;
begin
clrscr;
writeln(' ╔════════════════════════════╗');
writeln(' ║ Goniometricky
writeln(' ║ Gulas
writeln(' ║.........
atd. az do konca tabulky.
end;
|
|
| Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|