Niezalogowany (Zaloguj się)
WItaj Gościu! Możesz się teraz zalogować lub poprosić o członkowstwo na Forum Turbo Pascal Web Pag
    • CommentAuthoradamp359
    • CommentTime12 May 2008
     
    Witam wszystkich mam taki problem ponieważ mam do napisania program który będzie przestawiał obieg ziemi wokół słońca w książce A. Marciniaka znalazłem coś takiego ale chciałbym jeszcze sie dopytać jak zrobić na stałe zeby była wpisana juz ta elipsa po której ma krążyć ziemia i żeby zrobić jakąś żółtą kulkę w środku tego układu jak to zrobić a to jest program: bardzo proszę o pomoc program ziemia; uses Crt, Graph; var dx, sterownik, tryb, x1, x2, y1, y2 :Integer; a, a2, b, b2, d, k, kappa, p, r, x0, y0, xs, ys :Real; {procedura egavga} procedure EGAVGAInit; var blad, sterownik, tryb : Integer; begin Detectgraph (sterownik, tryb); if (sterownik<>EGA) and (sterownik<>VGA) then begin Writeln ('komputer ma inna karte niz EGA lub VGA'); Halt end; InitGraph (sterownik, tryb, 'C:\TP\BGI'); blad:=GraphResult; if blad<>0 then begin Writeln ('Blad podczas inicjowania trybu'); Write ('kod bledu :',blad); Halt end; if sterownik=VGA then k:=48/35 else k:=1 end {EGAVGAInit}; begin DetectGraph (sterownik, tryb); if sterownik=EGA then kappa:=31/40 else kappa:=1; EGAVGAInit; RestoreCrtMode; ClrScr; Writeln ('Okresl elipse:'); repeat Write ('- polos wielka (40<=a<=',GetMaxX-39,') a = '); Readln (a) until (a>=40) and (a<=GetMaxX-36); repeat Write ('- polos mala (60<=b<=', GetMaxX-59,') b ='); Readln (b) until (b>=60) and (b<=GetMaxY-59); Writeln('- wspolrzedne srodka elipsy (w ukladzie wspolrzednych'); Writeln('o srodku w srodku ekranu i osi y skierowanej w gore'); repeat Write ('x0 = '); Readln (x0) until Abs(x0)<a; repeat Write ('y0 = '); Readln (x0) until Abs(x0)<b; repeat Write ('dlugosc odcinka d (d<='); if a<b then Write (a:5:1) else Write (b:5:1); Write (') ='); Readln (d) until (d>0) and (d<=b) and (d<=a); x0:=x0+(GetMaxX div 2); y0:=y0+(GetMaxY div 2)/kappa; SetGraphMode (tryb); SetColor (Red); Ellipse (Round(x0),Round(kappa*y0),0,360,Round(a-2),Round(kappa*(b-2))); xs:=x0; ys:=y0-b; dx:=-2; a2:=a*a; b2:=b*b; repeat p:=Sqrt(Sqr(a2*(ys-y0))+Sqr(b2*(xs-x0))); r:=d*a2*(ys-y0)/p; x1:=Round(xs-r); x2:=Round(xs+r); r:=d*b2*(xs-x0)/p; y1:=Round(kappa*(ys+r)); ys:=Round(kappa*(ys-r)); SetColor (Yellow); Line (x1, y1, x2, y2); if((dx<0) and (xs+dx<x0-a)) or ((dx>0) and (xs+dx>x0+a)) then dx:=-dx; Delay (50); SetColor (Black); Line (x1, y1, x2, y2); xs:=xs+dx; ys:=y0+Abs(dx)*b*Sqrt(1-Sqr((xs-x0)/a))/dx; until KeyPressed; CloseGraph end. w tym programie na początku są zapytania jaka ma być elipsa i takie tam inne pierdoły ja bym chciał się tego pozbyć żeby było już na stałe wpisane te dane a i jeszcze jedno jak zrobić żeby program jeszcze zliczał ilość obiegów wokół słońca z góry dziękuje za pomoc.
    • CommentAuthorsteficzek
    • CommentTime12 May 2008
     

    zamiast repeat Write ('- polos wielka (40<=a<=',GetMaxX-39,') a = '); Readln (a) until (a>=40) and (a<=GetMaxX-36);
    stosujesz funckję przypisana np.: a:=300;
    czyli to co przed znakiem ':=' przyjmuje wartość tego co za znakiem

    Tak między nami Marciniak to według mnie pomyłka jeśli chodzi o ludzi zaczynających bawić się Turbo Pascalem

    Pozdrawiam Stefan Pruszkiewicz
    • CommentAuthoradamp359
    • CommentTime12 May 2008 zmieniony
     
    no fajnie to mi za działało to co podałeś
    • teraz jak zrobić na środku tej elipsy żółtą kulkę ? imitującą słońce
    • a jak zamiast tej kreski która lata w koło to żeby była niebieska kulka ?
    • a i jeszcze żeby jakiś licznik do robić do tego żeby zliczało obroty ziemi wokół słońca jak to zrobić ?
    teraz kod wygląda tak program ziemia; uses Crt, Graph; var dx, sterownik, tryb, x1, x2, y1, y2 :Integer; a, a2, b, b2, d, k, kappa, p, r, x0, y0, xs, ys :Real; {procedura egavga} procedure EGAVGAInit; var blad, sterownik, tryb : Integer; begin Detectgraph (sterownik, tryb); if (sterownik<>EGA) and (sterownik<>VGA) then begin Writeln ('komputer ma inna karte niz EGA lub VGA'); Halt end; InitGraph (sterownik, tryb, 'C:\TP\BGI'); blad:=GraphResult; if blad<>0 then begin Writeln ('Blad podczas inicjowania trybu'); Write ('kod bledu :',blad); Halt end; if sterownik=VGA then k:=48/35 else k:=1 end {EGAVGAInit}; begin DetectGraph (sterownik, tryb); if sterownik=EGA then kappa:=31/40 else kappa:=1; EGAVGAInit; RestoreCrtMode; ClrScr; {okreslanie eleipsy} a:=200; {szerokosc elipsy} b:=50; {wysokosc elipsy} x0:=1; y0:=2; d:=1; x0:=x0+(GetMaxX div 2); y0:=y0+(GetMaxY div 2)/kappa; SetGraphMode (tryb); SetColor (blue); Ellipse (Round(x0),Round(kappa*y0),0,360,Round(a-2),Round(kappa*(b-2))); xs:=x0; ys:=y0-b; dx:=-2; a2:=a*a; b2:=b*b; repeat p:=Sqrt(Sqr(a2*(ys-y0))+Sqr(b2*(xs-x0))); r:=d*a2*(ys-y0)/p; x1:=Round(xs-r); x2:=Round(xs+r); r:=d*b2*(xs-x0)/p; y1:=Round(kappa*(ys+r)); ys:=Round(kappa*(ys-r)); SetColor (Yellow); Line (x1, y1, x2, y2); if((dx<0) and (xs+dx<x0-a)) or ((dx>0) and (xs+dx>x0+a)) then dx:=-dx; Delay (50); SetColor (black); Line (x1, y1, x2, y2); xs:=xs+dx; ys:=y0+Abs(dx)*b*Sqrt(1-Sqr((xs-x0)/a))/dx; until KeyPressed; CloseGraph end.
    • CommentAuthorsteficzek
    • CommentTime12 May 2008 zmieniony
     

    Widze że się meczysz strasznie - jak już mówiłem zapomnij o Marciniaku. Jak poogladasz sobie ten kod zrozumiesz wiecej niż po przeczytaniu 300 stron żółtej cegiełki.
    Tu masz gotowca. Popróbuj sobie w nim pogrzebać na zdrowie Ci to wyjdzie. Uses Crt,Graph; function Deg2Rad(Kat : Real) : Real; begin; Deg2Rad:=Kat*Pi/180 end;{Zamiena Stopnii na Radiany} procedure Slonce; begin SetColor(Yellow); SetFillStyle(SolidFill,Yellow); Circle(320,240,20); FloodFill(320,240,Yellow) end;{Rysuje slonce} procedure Ziemia(x,y : Integer;Kolor : Word); begin SetColor(Kolor); SetFillStyle(SolidFill,Kolor); Circle(x,y,10); FloodFill(x,y,Kolor) end;{Rysuje Ziemie} Const PromienX = 200; PromienY = 100; x0 = 320; y0 = 240; Licznik : Integer = 0; Var Sterownik,Tryb,Kat : Integer; x,y : Real; s : string; Begin InitGraph(Sterownik,Tryb,'c:\tp\bgi'); {Inicjuje grafike} SetTextJustify(CenterText,CenterText); {Wyrownanie tekstu w poz. i pion.} Slonce; {Rysuje slonce} repeat {powtarzaj} if Kat<360 then Inc(Kat) {jesli kat<360 zwiekszaj kat} else begin {w przeciwnym razie} Kat:=0; {wyzeruj kat} Inc(Licznik); {zwieksz licznik okrazen o jeden} end; x:=x0+Sin(Deg2Rad(Kat))*PromienX; {Obliczenie nowych wsp. x Ziemi} y:=y0+Cos(Deg2Rad(Kat))*PromienY; {Obliczenie nowych wsp. y Ziemi} Ziemia(Round(x),Round(y),LightBlue); {Rysuje Ziemie} SetColor(White); {Ustawia kolor na Bialy} Str(Licznik,s); {Zamiana Liczby na ciag znakow} OutTextXy(Round(x),Round(y),s); {Pisze liczbe} Delay(100); {Czeka 1/10 sekundy} Ziemia(Round(x),Round(y),Black) {Wymazuje Ziemie} until KeyPressed; {dopóki} CloseGraph {Zamknij tryb graficzny} End.

    Pozdrawiam Stefan Pruszkiewicz
    • CommentAuthoradamp359
    • CommentTime13 May 2008
     
    Dziękuje bardzo ale mam jeszcze prośbę jak byś mógł mi opisać co się dzieje w tym fragmencie kodu bo tam niżej jest wszytko opisane a tu nie Uses Crt,Graph; function Deg2Rad(Kat : Real) : Real; begin; Deg2Rad:=Kat*Pi/180 end;{Zamiena Stopnii na Radiany} procedure Slonce; begin SetColor(Yellow); SetFillStyle(SolidFill,Yellow); Circle(320,240,20); FloodFill(320,240,Yellow) end;{Rysuje slonce} procedure Ziemia(x,y : Integer;Kolor : Word); begin SetColor(Kolor); SetFillStyle(SolidFill,Kolor); Circle(x,y,10); FloodFill(x,y,Kolor) end;{Rysuje Ziemie} Const PromienX = 200; PromienY = 100; x0 = 320; y0 = 240; Licznik : Integer = 0; Var Sterownik,Tryb,Kat : Integer; x,y : Real; s : string; i jak mam Ci się odwdzięczyć za to, że napisałeś mi program ?
    • CommentAuthorsteficzek
    • CommentTime13 May 2008 zmieniony
     
    function Deg2Rad(Kat : Real) : Real; {Funkcja podobnie jak zmienna moze przybrac jakas wartosc} begin; {Jak wiadomo katy mozna przedstawiac poprzez Stopnie lub Radiany} Deg2Rad:=Kat*Pi/180 {Przypisanie wartosci katowej dla funkcji } end; {Funkcja zamienia Stopnie na Radiany, bo pascal obsuguje radiany} procedure Slonce; begin SetColor(Yellow); {Ustawia kolor rysowania na zolty} SetFillStyle(SolidFill,Yellow); {Ustawia kolor wypelnienia na zolty} Circle(320,240,20); {Rysuje okrag} FloodFill(320,240,Yellow) {Wylewa farbe w srodku okregu} end;{Rysuje slonce} procedure Ziemia(x,y : Integer;Kolor : Word); begin SetColor(Kolor); {Kolor rysowania jak w parametrze } SetFillStyle(SolidFill,Kolor); {Ustawia kolor wypelnienia na wybrany kolor} Circle(x,y,10); {Rysuje okrag} FloodFill(x,y,Kolor) {Wylewa farbe w srodku okregu} end;{Rysuje Ziemie} Const PromienX = 200; {Stala - Pierwszy promien elipsy} PromienY = 100; {Stala - Drugi promien elipsy} x0 = 320; {Stala - wspolrzedna srodka elipsy X} y0 = 240; {Stala - wspolrzedna srodka elipsy Y} Licznik : Integer = 0; {Stala z wartoscia poczatkowa - Licznik obrotow} Var Sterownik,Tryb,Kat : Integer; {zmienne } x,y : Real; s : string; Begin

    Odwdzięczać się nie musisz.
    Pomożesz kiedyś komuś na forum i starczy.
    • CommentAuthoradamp359
    • CommentTime13 May 2008
     
    Nie wiem czy mi sie uda dojść do takiego poziomu w programowaniu żeby umieć komuś pomóc. Jeszcze raz bardzo dziękuję za pomoc. Napisałem tą samą prośbę na trzech różnych forach i tylko na tym otrzymałem szybką i bardzo dobrą odpowiedz. Dzięki Acha jeżeli to jest Twoje forum to wyślij mi kod linka to umieszczę link albo baner na swojej stronie trochę może podnieść jeszcze pozycję w google :)
    • CommentAuthorrachwal
    • CommentTime13 May 2008
     
    HTML'a tez ni w zab ? :P
    <a href="http://pascal.netax.pl" title="turbo pascal">turbo pascal</a>

    :)
    • CommentAuthoradamp359
    • CommentTime13 May 2008
     
    nie w HTML to jestem dobry i trochę sie znam na pozycjonowaniu stron i wiem ze są ważne słowa kluczowe w linkach wiec pytam o kod ;) link już jest zamieszczony
    • CommentAuthorrachwal
    • CommentTime13 May 2008
     
    dzieki.
    • CommentAuthoradamp359
    • CommentTime8 Jun 2008
     
    Witam ponownie :) otóż teraz jest problem bo chciałem zrobić wszystkie planety z układu słonecznego żeby krążyły wokół słońca ale to coś mi nie idzie myslałem ze wystarczy skopiować co nieco a tu jednak nie takie proste zrobiłem ze dwie planety latają wkoło ale to nie jest jeszcze to co bym chciał o to kod co ja tam próbowałem zrobić :P Uses Crt,Graph; function Deg2Rad(Kat : Real) : Real; {Funkcja podobnie jak zmienna moze przybrac jakas wartosc} begin; {Jak wiadomo katy mozna przedstawiac poprzez Stopnie lub Radiany} Deg2Rad:=Kat*Pi/180 {Przypisanie wartosci katowej dla funkcji } end; {Funkcja zamienia Stopnie na Radiany, bo pascal obsuguje radiany} procedure Slonce; begin SetColor(Yellow); {Ustawia kolor rysowania na zolty} SetFillStyle(SolidFill,Yellow); {Ustawia kolor wypelnienia na zolty} Circle(320,240,20); {Rysuje okrag} FloodFill(320,240,Yellow) {Wylewa farbe w srodku okregu} end;{Rysuje slonce} procedure Ziemia(x,y : Integer;Kolor : Word); begin SetColor(Kolor); {Kolor rysowania jak w parametrze } SetFillStyle(SolidFill,Kolor); {Ustawia kolor wypelnienia na wybrany kolor} Circle(x,y,10); {Rysuje okrag} FloodFill(x,y,Kolor) {Wylewa farbe w srodku okregu} end;{Rysuje Ziemie} procedure mars(a,b : Integer;Kolor : Word); begin SetColor(Kolor); {Kolor rysowania jak w parametrze } SetFillStyle(SolidFill,Kolor); {Ustawia kolor wypelnienia na wybrany kolor} Circle(a,b,6); {Rysuje okrag} FloodFill(a,b,Kolor) {Wylewa farbe w srodku okregu} end; Const PromienA = 70; {Stala - Pierwszy promien elipsy} PromienB = 95; {Stala - Drugi promien elipsy} a0 = 320; {Stala - wspolzedna srodka elipsy X} b0 = 240; {Stala - wspolzedna srodka elipsy Y} Licznik : Integer = 0; {Stala z wartoscia poczatkowa - Licznik obrotow} Const PromienX = 50; PromienY = 80; x0 = 320; y0 = 240; Var Sterownik,Tryb,Kat : Integer; {zmienne } x,y,a,b : Real; s : string; Begin InitGraph(Sterownik,Tryb,'c:\tp\bgi'); {Inicjuje grafike} SetTextJustify(CenterText,CenterText); {Wyrownanie tekstu w poz. i pion.} Slonce; {Rysuje slonce} repeat {powtarzaj} if Kat<360 then Inc(Kat) {jesli kat>360 zwiekszaj kat} else begin {w przeciwnym razie} Kat:=0; {wyzeruj kat} Inc(Licznik); {zwieksz licznik okrazen o jeden} end; x:=x0+Sin(Deg2Rad(Kat))*PromienX; {Obliczenie nowych wsp. x Ziemi} y:=y0+Cos(Deg2Rad(Kat))*PromienY; {Obliczenie nowych wsp. y Ziemi} Ziemia(Round(x),Round(y),LightBlue); {Rysuje Ziemie} SetColor(White); {Ustawia kolor na Bialy} Str(Licznik,s); {Zamiana Liczby na ciag znakow} OutTextXy(Round(x),Round(y),s); {Pisze liczbe} Delay(10); {Czeka 1/10 sekundy szykosc} Ziemia(Round(x),Round(y),Black); {Wymazuje Ziemie} a:=a0+Sin(Deg2Rad(Kat))*PromienA; b:=b0+Cos(Deg2Rad(Kat))*PromienB; mars(Round(a),Round(b),White); Ziemia(Round(a),Round(b),Black) {Wymazuje Ziemie} until KeyPressed; {dopóki} CloseGraph {Zamknij tryb graficzny} End. no chyba ze łatwiej jest zrobić żeby księżyc krążył wokół ziemi ale wolał bym zrobić cały układ bo będzie bardziej profesjonalny :) ktoś coś podpowie jak to i co tu zrobić zeby było dobrze bo ja to nie bardzo wiem jak za to się zabrać widać co zrobiłem ale to źle 'lata' ze tak powiem :) jak zrobić jeszcze to zeby jedna planeta startowała z pozycji zero a druga była w tym czasie na górze elipsy no i jeszcze żeby można było ustawić prędkość każdej planety z osobna próbowałem coś takiego zrobić ale to nie działa ziemia(Delay(10)); a z tym przesunięciem planety to coś jest związane to na pewno a:=a0+Sin(Deg2Rad(Kat))*PromienA; b:=b0+Cos(Deg2Rad(Kat))*PromienB; chciałem zrobić +20 ale to też tak nie działa już głupi jestem siedzę od wczoraj nad tym i już tracę nadzieje ze to się uda