Мелькание окружностей - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Есть код. Но при отрисовке анимации часто мелькают какие то черные окружности по бокам окна. Что это? И как это исправить?

Решение задачи: «Мелькание окружностей»

textual
Листинг программы
uses GraphABC;
const
  Size = 60; // размер квадрата
  Shift = 10; // отступ от квадрата
  MinSize = 10; // минимальный размер квадрата
  MaxSize = 48; // максимальный размер квадрата
  MinR = 10;// минимальный радиус окружности
  MaxR = 70; // максимальный радиус окружности
  PercentR = 30; // количество процентов от радиуса
  MaxH = 200; // высота треугольника
  LCount = 8; // количество линий
  LineW = 8;// ширина кисти для рисования линии
  IncP = 2;
  PercentBorder = 30;// количество процентов от удаления черных линий, отводимых на изменение размера квадрата
 
var
  StepH: real := MaxH / LCount;
  StepDelta: real := StepH / 2;
  HalfSize: real := Size / 2;
  MinHalf: real := MinSize / 2;
  DHalf: real := MaxSize / 2 - MinHalf;
  DR: real := MaxR - MinR;
  TwoPercentR: real := PercentR * 2 / 100;
  P: integer;
  IsUp: boolean := true;
 
function Interpolation(a, b, p: real) := a + (b - a) * p;
 
procedure RLine(x, y, x1, y1: real) := Line(Round(x), Round(y), Round(x1), Round(y1));
 
procedure DrawTriangle(angle: integer; percent: byte);
begin
  SetCoordinateAngle(angle);
  SetPenColor(clWhite);
  SetPenWidth(LineW);
  for var i := 0 to LCount - 1 do
  begin
    var y := HalfSize + Shift + StepH * i + StepDelta;
    var x := HalfSize - HalfSize * (y - HalfSize - Shift) / MaxH;
    RLine(-x, y, x, y);
  end;
  
  SetPenColor(clBlack);
  var p := percent / 100;
  var y := HalfSize + Shift + MaxH * p;
  var x := HalfSize - HalfSize * (y - HalfSize - Shift) / MaxH;
  RLine(-x, y, x, y);
end;
 
procedure Draw(angle: integer; percent: byte);
begin
  for var i := 0 to 3 do
    DrawTriangle(i * 90 + angle, percent);
  
  SetCoordinateAngle(angle);
  SetPenWidth(2);
  if P < PercentBorder then
  begin
    var pnt := 1.0 - P / PercentBorder;
    var x := DHalf * pnt;
    var xp := Round(x + MinHalf);
    var xm := -xp;
    DrawRectangle(xm, xm, xp, xp);
  end
  else
  begin
    var r := MinR + DR * (P - PercentBorder) / PercentBorder;
    var circleR := Round(r * TwoPercentR / 2);
    for var i := 0 to 3 do
    begin
      var ang := DegToRad(i * 90 + 45);
      DrawCircle(Round(r * Cos(ang)), Round(r * Sin(ang)), circleR);
    end;
    DrawCircle(0, 0, circleR);
  end;
end;
 
begin
  SetWindowIsFixedSize(true);
  SetCoordinateOrigin(Window.Width div 2, Window.Height div 2);
  
  LockDrawing();
  while true do
    for var i := 0 to 359 do
    begin
      ClearWindow(clDarkSlateBlue);
      Draw(i, P);
      Redraw();
      if (P > 100) or (P < 0) then IsUp := not IsUp;
      if IsUp then Inc(P, IncP) else Dec(P, IncP);
      Sleep(10);
    end;
end.

Объяснение кода листинга программы

  1. Объявлены константы: размер квадрата (Size), отступ от квадрата (Shift), минимальный размер квадрата (MinSize), максимальный размер квадрата (MaxSize), минимальный радиус окружности (MinR), максимальный радиус окружности (MaxR), процент радиуса (PercentR), высота треугольника (MaxH), количество линий (LCount), ширина кисти для рисования линии (LineW), шаг изменения размера квадрата (IncP), процент черных линий, отводимых на изменение размера квадрата (PercentBorder).
  2. Задана функция Interpolation для линейной интерполяции между двумя значениями.
  3. Определена процедура RLine для рисования прямой линии с использованием функции Interpolation.
  4. Определена процедура DrawTriangle для рисования треугольника с заданным углом и процентом.
  5. Определена процедура Draw для поочередного вызова процедуры DrawTriangle для каждого из 4 треугольников и рисования окружностей при достижении или превышении 30% на каждом из них.
  6. Задана начальная точка (x, y) в середине окна.
  7. Задано значение P, которое изменяется от 0 до 100.
  8. В основном цикле программы поочередно отображаются все 4 треугольника с разными углами и процентами, а также окружности при достижении или превышении 30% на каждом из них.
  9. Если значение P выходит за пределы от 0 до 100, то значение переменной IsUp инвертируется, и значение P уменьшается или увеличивается на 10% от текущего значения (IncP).
  10. В цикле используется задержка в 10 миллисекунд для обновления изображения.
  11. Размер окна установлен в фиксированный размер.
  12. Ось координат установлена в центр окна.
  13. В бесконечном цикле выполняется основной цикл программы.
  14. Перед выводом на экран каждого треугольника и окружности значение P инкрементируется или декрементируется на 10% от текущего значения (IncP).
  15. Значение P изменяется от 0 до 100 и обратно.
  16. Если значение P выходит за пределы от 0 до 100, то значение переменной IsUp инвертируется, и значение P уменьшается или увеличивается на 10% от текущего значения (IncP).
  17. В бесконечном цикле используется задержка в 10 миллисекунд для обновления изображения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы