Построить график функции y=Sin(X) + COS(X / 2) — Pascal(Паскаль)

Program UniversalGraph;

Uses Graph;

Type
  Fun = Function(X: Real): Real;

Procedure Graphic(F: Fun; XBeg, XEnd: Real);
Var
  Max, Min, { Экстремальные точки функции в пределах диапазона }
  I, { Переменная цикла }
  Step, { Расчитываемый шаг }
  GradX, { Приращение функции на один шаг по X }
  GradY: Real; { Приращение функции на один шаг по Y }
  GraphicX, { Координата по X }
  GraphicY: Integer; { Координата по Y }
  Flag: Boolean; { Флаг - перемещена первая точка }

  Procedure Coord(CoordYBeg, CoordYEnd, CoordHMin, CoordHMax: Real);
  Var
    GradX, GradYX: Real;
    X, Y: Integer;
    Color: Word;
  Begin
    Color := GetColor;
    SetColor(7);
    GradX := GetMaxX / (CoordYEnd - CoordYBeg);
    GradYX := GetMaxY / (CoordHMax - CoordHMin);
    If (CoordYEnd > 0) And (CoordYBeg < 0) Then
      Y := Round(GradX * (0 - CoordYBeg));
    If CoordYEnd < 0 Then
      Y := GetMaxY;
    If CoordYBeg > 0 Then
      Y := 1;
    If (CoordHMin < 0) And (CoordHMax > 0) Then
      X := Round(GradYX * (CoordHMax));
    If CoordHMin > 0 Then
      X := GetMaxY;
    If CoordHMax < 0 Then
      X := 1;
    Line(1, X, GetMaxX, X); { Горизонтальная линия }
    Line(GetMaxX - 4, X + 5, GetMaxX, X); { Стрелочка }
    Line(GetMaxX - 4, X - 5, GetMaxX, X); { Стрелочка }
    Line(Y, 1, Y, GetMaxY); { Вертикальная линия }
    Line(Y - 5, 5, Y, 1); { Стрелочка }
    Line(Y + 5, 5, Y, 1); { Стрелочка }
    SetColor(Color);
  End;

Begin
  Step := (XEnd - XBeg) / (GetMaxY - 40);
  I := XBeg;
  Max := F(XBeg);
  Min := F(XBeg);
  While I <= (XEnd + Step) Do
  Begin
    If Max < F(I) Then
      Max := F(I);
    If Min > F(I) Then
      Min := F(I);
    I := I + Step;
  End;
  GradX := GetMaxX / (XEnd - XBeg);
  GradY := GetMaxY / (Max - Min);
  Coord(XBeg, XEnd, Min, Max);

  Flag := True;
  I := XBeg;
  While I <= (XEnd + Step) Do
  Begin
    GraphicX := Round(GradX * (I - XBeg));
    GraphicY := Round(GradY * (Max - F(I)));
    If Flag Then
      MoveTo(GraphicX, GraphicY);
    { PutPixel(GraphicX,GraphicY,15); }
    LineTo(GraphicX, GraphicY);
    I := I + Step;
    Flag := False;
  End;

End;

{$F+} { Ключи ассемблирования }

Function F1(X: Real): Real;
Begin
  F1 := Sin(X) + COS(X / 2);
End;

Procedure GraphicIni;
Var
  Mode, DriverDet: Integer;
Begin
  Mode := 0;
  DriverDet := Detect;
  InitGraph(Mode, DriverDet, 'c:\BP\BGI');
  SetColor(15);
End;

{$F-} { Ключи ассемблирования }

Begin
  GraphicIni;
  Graphic(F1, -10, 10);
  ReadLn;
  CloseGraph;

End.

Leave a Comment

8 + 2 =