Мелькание окружностей - 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.
Объяснение кода листинга программы
- Объявлены константы: размер квадрата (Size), отступ от квадрата (Shift), минимальный размер квадрата (MinSize), максимальный размер квадрата (MaxSize), минимальный радиус окружности (MinR), максимальный радиус окружности (MaxR), процент радиуса (PercentR), высота треугольника (MaxH), количество линий (LCount), ширина кисти для рисования линии (LineW), шаг изменения размера квадрата (IncP), процент черных линий, отводимых на изменение размера квадрата (PercentBorder).
- Задана функция Interpolation для линейной интерполяции между двумя значениями.
- Определена процедура RLine для рисования прямой линии с использованием функции Interpolation.
- Определена процедура DrawTriangle для рисования треугольника с заданным углом и процентом.
- Определена процедура Draw для поочередного вызова процедуры DrawTriangle для каждого из 4 треугольников и рисования окружностей при достижении или превышении 30% на каждом из них.
- Задана начальная точка (x, y) в середине окна.
- Задано значение P, которое изменяется от 0 до 100.
- В основном цикле программы поочередно отображаются все 4 треугольника с разными углами и процентами, а также окружности при достижении или превышении 30% на каждом из них.
- Если значение P выходит за пределы от 0 до 100, то значение переменной IsUp инвертируется, и значение P уменьшается или увеличивается на 10% от текущего значения (IncP).
- В цикле используется задержка в 10 миллисекунд для обновления изображения.
- Размер окна установлен в фиксированный размер.
- Ось координат установлена в центр окна.
- В бесконечном цикле выполняется основной цикл программы.
- Перед выводом на экран каждого треугольника и окружности значение P инкрементируется или декрементируется на 10% от текущего значения (IncP).
- Значение P изменяется от 0 до 100 и обратно.
- Если значение P выходит за пределы от 0 до 100, то значение переменной IsUp инвертируется, и значение P уменьшается или увеличивается на 10% от текущего значения (IncP).
- В бесконечном цикле используется задержка в 10 миллисекунд для обновления изображения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д