Показать сообщение отдельно
Старый 02.05.2012, 15:26   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да... забавная игрушка получилась. Правда, насчет масштаба и фазы я не очень понял, а потому ограничился фазой, причем под фазой подразумевается слагаемое, стоящее в формуле y(t) под косинусом, исходное значение коего равно 6 - вот его я и меняю. Для увеличения фазы на 1 нажимаем ↑ на клавиатуре, соответственно для уменьшения - ↓ (допускаются и отрицательные значения), а для выхода жмем клавишу "Esc".
Код:
Uses CRT, Graph;
Var
 Xc,Yc,Xmin,Ymin,Xmax,Ymax,
 StepX,StepY,N,Nt:Word;
 i,Phase:Integer;
 t,Xr,Yr,Dx,Dy,Stept,tmax:Real;
 S:String;
 Ch:Char;

Function X(tx:real):real;
begin
 X:=Sqr(Sqr(Sin(tx*2)))+Sqr(Cos(tx*4))*Cos(tx*4);
end;

Function Y(tx:real):real;
begin
 Y:=Sqr(Sqr(Cos(tx*4+Phase)))+Sqr(Sin(tx*4))*Sin(tx*4);
end;


Begin
 InitGraph(...); {Здесь сформируйте параметры самостоятельно}
 Phase:=6;
 Nt:=200;
 tmax:=4;
 Stept:=tmax/Nt;
 Xmin:=40;
 Xmax:=640;
 Ymin:=20;
 Ymax:=460;
 Repeat
  ClearDevice;
  SetFillStyle(SolidFill,GetBkColor);
  Bar(500,0,640,40);
  SetTextStyle(DefaultFont,HorizDir,2);
  SetTextJustify(RightText,TopText);
  Str(Phase,S);
  OutTextXY(640,15,'Phase = '+S);
  SetTextStyle(DefaultFont,HorizDir,1);
  SetLineStyle(SolidLn,0,ThickWidth);
  Yc:=240;
  Line(Xmin,Yc,Xmax,Yc);
  Xc:=Xmin;
  Line(Xc,Ymin,Xc,Ymax);
  StepX:=(Xmax-Xmin) div 10;
  Dx:=1.5/10;
  N:=(Xmax-Xmin) div StepX;
  SetTextJustify(CenterText,TopText);
  Yc:=240;
  For i:=0 to N do
   begin
    Xc:=Xmin+i*StepX;
    Xr:=Dx*i;
    Str(Xr:5:2,S);
    If (Xc>Xmin) and (Xc<Xmax) then
     begin
      Line(Xc,Yc,Xc,Yc-10);
      OutTextXY(Xc,Yc+5,S);
     end;
   end;
  StepY:=(Ymax-Ymin) div 10;
  Dy:=4.0/10;
  N:=(Ymax-Ymin) div StepY;
  SetTextJustify(RightText,CenterText);
  Xc:=Xmin;
  For i:=0 to N do
   begin
    Yc:=Ymin+i*StepY;
    Yr:=2.0-i*Dy;
    Str(Yr:4:1,S);
    If Yc<>240 then
     begin
      Line(Xc,Yc,Xc+10,Yc);
      OutTextXY(Xc-5,Yc,S);
     end;
   end;
  t:=0;
  Xc:=Xmin+Round(X(0)*400);
  Yc:=240-Round(Y(0)*110);
  SetLineStyle(SolidLn,0,NormWidth);
  MoveTo(Xc,Yc);
  For i:=1 to 200 do
   begin
    t:=t+Stept;
    Xc:=Xmin+Round(X(t)*400);
    Yc:=240-Round(Y(t)*110);
    LineTo(Xc,Yc);
   end;
  Ch:=Readkey;
  If Ch=#72 then Inc(Phase) else
  If Ch=#80 then Dec(Phase);
 Until Ch=#27;
 CloseGraph;
End.
Изображения
   
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070