Помощь - Поиск - Пользователи - Календарь
Полная версия: Анимация(((
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
yakudza_m
доброго времени суток!!
привет вам из далекой (или не далекой) Беларуси!
у меня проблема: нужно написать на зачет по информатике 2 графические задачи((((

помогите чем сможете...

1. сектор вращается против часовой стрелки и меняет цвета (7 цветов). внутренний угол 30 градусов

2. фигура, состоящая из 2-х кругов с диаметрами D=40 и d=18, движется по горизонтальной поверхности длиной L=180. При достижении стенок на концах поверхности направление движения фигуры меняется...

помогите пожалуйста, не то у меня отберут стипендию(((
Ozzя
1. вращение диска - похожая задача.

2. Супер бильярд - похожая задача.
yakudza_m
круто!!

а как сделать так чтоб сектор менял цвет??
volvo
Цитата
а как сделать так чтоб сектор менял цвет??
Когда-то я делал программу "Поле чудес", так вот чуть-чуть подкорректированный код вращения барабана. По-моему, то, что тебе нужно...
uses crt,graph;

var
  gm, gd, x, y: Integer;
  ac: ArcCoordsType;

const
  numSectors = 12;
  EverySector = 360 div numSectors;

  Colors: array[1 .. numSectors] of integer =
    (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var
  pass, p, T: Integer;

begin
  gd := Detect;
  InitGraph(gd, gm, '');
  if GraphResult <> grOk then begin
    WriteLn('Error'); Halt(100)
  end;

  x := 200; y := 200;
  Ellipse(x, y, 0, 360, 103, 103);

  repeat

    for p := 1 to numSectors do begin
      SetColor(DarkGray);
      Ellipse(x, y,
        Pred(p) * EverySector, p * EverySector, 100, 100);

      GetArcCoords(ac);
      with ac do begin
        Line(x, y, xStart, yStart);
        Line(x, y, xEnd, yEnd);

        SetFillStyle(SolidFill, colors[p]);

        if colors[p] > 0 then begin
          inc(colors[p]); if colors[p] > LightGray then colors[p] := 1;
        end;

        FloodFill( (xStart+xEnd) div 2,
                   (yStart+yEnd) div 2, DarkGray);
      end;
    end;
    T := colors[numSectors];
    move(colors[1], colors[2], pred(numSectors)*sizeof(integer));
    Colors[1] := T;

    delay(25000);

  until keypressed;

  ReadLn;
  CloseGraph
end.
yakudza_m
клёво!!
но у меня почему-то рисует только 1 сектор синим, а остальные чёрным...
volvo
Цитата
у меня почему-то рисует только 1 сектор синим, а остальные чёрным...
И что потом происходит? Должно начаться вращение цветного сектора с одновременной сменой его цвета. Я проверял у себя, все нормально работает. Чем компилируешь, уточни. Это будет работать только с использованием Турбо Паскаля.
yakudza_m
у меня Free Pascal IDE ...я посмотрел, всё работает, но только оч медленно...как бы мне поменять время задержки???

я еще посмотрел у вас на форуме прогу для любого графика, и хочу спросить, где бы мне вставить функцию SETLINESTYLE и чтоб на картинке были видны координаты на осях?
renesko1
delay(время в милисекундах);
1000 = 1 сек
volvo
Цитата
у меня Free Pascal IDE
Ах, вот оно что... В FreePascal-е очень медленная реализация FloodFill, это не дает программе выполняться так же быстро, как в Турбо Паскале. Все, что могу предложить - это вот такой вот трюк:
uses crt,graph;

var
  gm, gd, x, y: Integer;
  ac: ArcCoordsType;

const
  numSectors = 12;
  EverySector = 360 div numSectors;

  Colors: array[1 .. numSectors] of integer =
    (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var
  pass, p, T: Integer;

begin
  gd := d4bit; // уменьшаем число цветов
  gm := m640x480; // и размер до обычных размеров VGA

  InitGraph(gd, gm, '');
  if GraphResult <> grOk then begin
    WriteLn('Error'); Halt(100)
  end;

  x := 200; y := 200;
  repeat
    setfillstyle(solidfill, black); // затираем прежнее изображение
    bar(x - 100, y - 100, x + 100, y + 100);

    SetColor(White);
    Ellipse(x, y, 0, 360, 103, 103);

    for p := 1 to numSectors do begin
      SetColor(DarkGray);
      Ellipse(x, y,
        Pred(p) * EverySector, p * EverySector, 100, 100);

      GetArcCoords(ac);
      with ac do begin
        Line(x, y, xStart, yStart);
        Line(x, y, xEnd, yEnd);

        if colors[p] > 0 then begin
          SetFillStyle(SolidFill, colors[p]); // и рисуем новый цветной сектор
          inc(colors[p]); if colors[p] > LightGray then colors[p] := 1;
          FloodFill( (xStart+xEnd) div 2,
                     (yStart+yEnd) div 2, DarkGray);
        end;
      end;
      delay(50);
    end;
    T := colors[numSectors];
    move(colors[1], colors[2], pred(numSectors)*sizeof(integer));
    Colors[1] := T;

    delay(15);

  until keypressed;

  ReadLn;
  CloseGraph
end.
За счет того, что FloodFill вызывается один раз вместо 12-ти, получается 12-ти кратное ускорение. Но все равно, видно процесс заливки...
yakudza_m
аааааа, жжош, вольво!!!! СПАСИБО БОЛЬШОЕ!!!

прога как ломанулась!!!

а у тя есть какие-нибудь советы по поводу второй проги??
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.