Napisz program w Pascalu (FreePascalu), który animuje ruch słońca po nieboskłonie.
Proszę aby program był jak najkrótszy, jak najprostszy napisany na podstawie , w stylu i na takiej zasadzie jak programy w załączniku.
Proszę o nieużywanie trudnych i zaawansowanych informatycznie komend, a tych, które są w przykładach.
Dziękuję
" Life is not a problem to be solved but a reality to be experienced! "
© Copyright 2013 - 2024 KUDO.TIPS - All rights reserved.
Uff... 2 godziny życia mniej - te wzory by mnie dobiły...
Uwaga: nie testowałem go jakoś wybitnie, ale dla danych testowych działa, więc obstawiam, że dla innych także powinien.
Link do kodu: http://pastebin.com/YG1Eecx8
Kod:
{$APPTYPE GUI}
{$MODE OBJFPC}{$H+}
Uses WinGraph, SysUtils, Math, Windows;
Const MAX_FPS = 70;
Phi = 50.067;
Day = 150;
TimeInc = 0.05;
Var Time: Extended = 0;
Procedure Init;
Var GD, GM: SmallInt;
Begin
GD := NoPalette;
GM := m800x600;
InitGraph(GD, GM, '');
UpdateGraph(UpdateOff);
End;
Procedure Draw(LastFPS: Integer);
Var Latitude, T, Declination, Altitude, Azimuth: Extended;
X, Y : Integer;
Begin
ClearDevice;
SetColor(LightGreen);
OutTextXY(3, 0, 'FPS: '+IntToStr(LastFPS));
{ https://sites.google.com/site/michalgodowski2/solartracker }
Latitude := 2*Pi*Phi/180;
T := 2*Pi*(Day-1)/365;
Declination := ((0.322003-22.971*cos(T)-0.357898*cos(2*T)-0.14398*cos(3*T)+3.94638*sin(T)+0.019334*sin(2*T)+0.05928*sin(3*T)))*Pi/180;
Altitude := arcsin(sin(Declination) * sin(latitude) + cos(Declination) * cos(latitude) * cos((15 *(time - 12)) * (Pi / 180)));
Azimuth := (arccos((cos(latitude) * sin(Declination) - cos(Declination) * sin(latitude) * cos((15 *(time - 12)) * (Pi / 180))) / cos(Altitude)));;
SetColor(White);
OutTextXY(3, 5+1*12, 'Latitude = '+FloatToStr(Latitude));
OutTextXY(3, 5+2*12, 'T = '+FloatToStr(T));
OutTextXY(3, 5+3*12, 'Declination = '+FloatToStr(Declination));
OutTextXY(3, 5+4*12, 'Altitude = '+FloatToStr(Altitude));
OutTextXY(3, 5+5*12, 'Azimuth = '+FloatToStr(Azimuth));
OutTextXY(3, 5+6*12, 'Time = '+FloatToStr(Time));
X := Round(Azimuth*100);
Y := 100+Round(1000*Declination*Altitude);
if (Time >= 12) Then
X := 400+230-X;
SetColor(Yellow);
Circle(X+20, Y, 20);
Time += TimeInc;
if (Time > 24) Then
Time := 0;
UpdateGraph(UpdateNow);
End;
Var LastFPS, FPSCounter, FPSTime, TTime, Estimated, RenderTime: Integer;
Begin
DecimalSeparator := '.';
Init;
FPSTime := GetTickCount;
FPSCounter := 0;
LastFPS := 0;
While (not CloseGraphRequest) Do
Begin
TTime := GetTickCount-FPSTime;
Inc(FPSCounter);
RenderTime := GetTickCount;
Draw(LastFPS);
RenderTime := GetTickCount-RenderTime;
if (RenderTime = 0) Then
RenderTime := 1;
if (TTime >= 1000) Then
Begin
LastFPS := FPSCounter;
FPSTime := GetTickCount;
FPSCounter := 0;
End;
Estimated := abs(Round((1000-TTime)/((FPSCounter*RenderTime)-(MAX_FPS*RenderTime)))); { Taka forma v-sync'u; tj.aby obraz nie był zbyt szybki (np.200 FPS) }
Sleep(Estimated);
End;
End.