Рисунок оставляет за собой черный след - PascalABC.NET

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

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

Привет всем, как сделать, чтобы рисунок перемещался но не оставлял за собой черный след? Слышал про такую команду как ClearWindow, но если ее поставить в код то все становится черным и мерцает. Вот сам код.

Решение задачи: «Рисунок оставляет за собой черный след»

textual
Листинг программы
uses
  graphABC;
 
procedure OutBug(x, y : Integer);
begin
  setBrushColor(clblack); 
  setpenwidth(2);
 
  var u : array of Point; SetLength(u, 5);
 
  u[0] := New Point(130+x, 170+y);
  u[1] := New Point(115+x, 170+y);
  u[2] := New Point(121+x, 160+y);
  u[3] := New Point(123+x, 170+y);
  u[4] := New Point(115+x, 170+y);
  DrawPolygon(u); FillPolygon(u);
  
  u[0] := New Point(130+x, 180+y);
  u[1] := New Point(115+x, 180+y);
  u[2] := New Point(121+x, 190+y);
  u[3] := New Point(123+x, 180+y);
  u[4] := New Point(115+x, 180+y);
  DrawPolygon(u); FillPolygon(u);
  
  setpenwidth(0);
  ellipse(300+x, 215+y, 130+x, 135+y); //голова 170
  setBrushColor(clwhite); 
  ellipse(320+x, 240+y, 160+x, 110+y); //тело
  line(160+x, 175+y, 319+x, 175+y); 
  setBrushColor(clblack);
  ellipse(200+x, 145+y, 170+x, 165+y);//1-ая половина
  ellipse(235+x, 115+y, 205+x, 135+y);
  ellipse(250+x, 155+y, 220+x, 175+y);
  ellipse(280+x, 125+y, 250+x, 145+y);
  ellipse(317+x, 148+y, 287+x, 168+y);
  ellipse(210+x, 180+y, 180+x, 200+y);//2-ая половина
  ellipse(210+x, 180+y, 180+x, 200+y);
 
  SetPenColor(clwhite);
  setBrushColor(clBeige); 
  ellipse(205+x, 210+y, 175+x, 230+y); // рисуем полную точку каким-нибудь малозаметным цветом
 
  SetPenColor(clblack); 
  DrawEllipse(320+x, 240+y, 160+x, 110+y); // перерисовываем тело,чтобы прочертить линию по точке
  
  FloodFill(190+x, 228+y, clwhite); // и закрашиваем все,что снаружи от линии - белым
  FloodFill(190+x, 220+y, clBlack); // а все,что внутри - черным
  setBrushColor(clblack); 
 
  ellipse(300+x, 180+y, 270+x, 200+y);
  ellipse(250+x, 210+y, 220+x, 230+y);
  SetPenColor(clwhite);
  setBrushColor(clBeige); 
  ellipse(300+x, 210+y, 270+x, 230+y);
  SetPenColor(clblack); 
  DrawEllipse(320+x, 240+y, 160+x, 110+y); // перерисовываем тело,чтобы прочертить линию по точке
  FloodFill(294+x, 224+y, clwhite); // и закрашиваем все,что снаружи от линии - белым
  FloodFill(280+x, 220+y, clBlack); // а все,что внутри - черным
end;
 
begin
  Randomize;
  var x := 0; var y := 0;
  LockDrawing;
  while True do
    begin
      Window.Clear;
      x += Random(-2, +2); y += Random(-2, +2);
      OutBug(x, y);
      Redraw;
    end;
end.

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

В данном коде используется язык программирования PascalABC.Net. Процедура OutBug(x, y:) используется для отрисовки следа от точки.

  1. Задаются координаты начальной точки следа (x, y) и вычисляются координаты следующих точек следа.
  2. Задается цвет и ширина линии для рисования следа.
  3. Создается массив u типа array of Point, и в него записываются координаты пяти последовательных точек следа.
  4. Рисуется многоугольник из этих пяти точек с помощью процедуры DrawPolygon(u).
  5. Заполняется пространство между точками следа с помощью процедуры FillPolygon(u).
  6. Координаты следующей группы точек следа вычисляются так, чтобы они были смещены относительно предыдущих точек.
  7. Рисуется вторая половина следа, которая является отражением первой половины относительно вертикальной оси.
  8. Рисуется тело следа с помощью процедуры DrawEllipse(320+x, 240+y, 160+x, 110+y).
  9. Закрашивается пространство внутри следа белым цветом с помощью процедуры FloodFill(190+x, 228+y, clwhite).
  10. Закрашивается пространство вне следа черным цветом с помощью процедуры FloodFill(190+x, 220+y, clBlack).
  11. Рисуется голова следа с помощью процедуры DrawEllipse(300+x, 180+y, 270+x, 200+y).
  12. Рисуется хвост следа с помощью процедуры DrawEllipse(250+x, 210+y, 220+x, 230+y).
  13. Перерисовывается тело следа с помощью процедуры DrawEllipse(320+x, 240+y, 160+x, 110+y).
  14. Закрашивается пространство внутри следа белым цветом с помощью процедуры FloodFill(294+x, 224+y, clwhite).
  15. Закрашивается пространство вне следа черным цветом с помощью процедуры FloodFill(280+x, 220+y, clBlack). В основной части программы используется цикл while True, который непрерывно запускает процедуру OutBug(x, y) с новыми случайными координатами (x, y) и обновляет окно с помощью Redraw.

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


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

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

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