[Previous] [Contents] [Next]

Анимация

Библиотека VingGaph позволяет изменять такие параметры отображаемых элементов, как цвет, местоположение, размер и др. Это позволяет строить изображения, динамически меняющиеся по алгоритму пользователя.

Note: Точкой привязки графического элемента считается левая верхняя вершина прямоугольника, в который вписан этот элемент.

Рассмотрим функции, изменяющие текущие параметры графических элементов. Во всех этих функциях графические элементы указываются посредством своего идентификатора ident.

SetColor(int ident, int color)
Изменяет цвет элемента на color.
Fill(int ident, int color)
Заполняет внутреннюю область элемента цветом color. Параметр color может быть опущен, в этом случае используется цвет, установленный в текущей нити с помощью SetColor(int color), как объяснялось в разделе об установке цвета. Значение параметра color=-1 убирает заполнение, т.е. делает элемент прозрачным (как в начальном состоянии). Функция Fill() позволяет изменить цвет рабочей области окна графического терминала, если ident=0.
Bug: В QNX Neutrino 1.0 при работе терминала VinGraph в режиме VGOSC=0 (см. раздел о терминале VinGraph) функция Fill(0, color) заполняет окно терминала не полностью. Для устранения этой ошибки рекомендуется использовать следующую последовательность действий:
    Hide (0), Fill (0, color), Show (0);
Указанная ошибка отсутствует в QNX Neutrino 2.0 и в режиме VGOSC=1.
MoveTo(int x, int y, int ident)
Передвигает элемент в точку (x, y).
Move(int ident, int dx, int dy)
Сдвигает элемент на dx точек по горизонтали и dy точек по вертикали. Параметры dx, dy могут быть положительными, отрицательными или нулевыми.
Enlarge(int ident, int left, int up, int right, int down)
Увеличивает размер элемента на указанное количество точек влево, вверх, вправо и вниз (по порядку следования параметров). Если значение параметра отрицательно, то происходит уменьшение элемента в соответствующем направлении.
Enlarge(int ident, int dx, int dy)
Производит центрированное увеличение элемента, т.е. увеличивает его на dx точек одновременно влево и вправо и на dy точек вверх и вниз. Если значение параметра отрицательно, то происходит уменьшение элемента по соответствующей оси.
EnlargeTo(int x, int y, int w, int h, int ident)
Изменяет положение и размеры элемента путем указания с помощью первых четырех параметров нового описывающего прямоугольника. Данная функция может также использоваться для изменения положения и размеров окна графического терминала (если ident=0 или опущен).
EnlargeTo(const tPoint points [], int npoints, int ident)
Изменяет положение и конфигурацию ломаных линий и многоугольников, а также, как частный случай, всех элементов, которые можно определить двумя точками -- координатами левой верхней и правой нижней вершин описывающего прямоугольника. Данная функция также оказывает особое влияние на точечный элемент, рисуемый с помощью функции Pixel(), превращая его во множество точек, не связанных линиями. Параметр points указывает на массив из npoints точек.
SetLineWidth(int ident, int width)
Изменяет толщину линий, которыми рисуется элемент. Толщина линий становится равной width пикселов. Рисование графических элементов толстыми линиями более трудоемко, т.к. требуется рассчитывать большее количество точек и особо обрабатывать стыковку линий и их окончание. Значение width=0 выключает этот особый режим рисования.
SetText(int ident, const char *text)
Заменяет текст в элементе, созданном с помощью функции Text(), на новый, задаваемый параметром text.

Рассмотрим два простых примера.

Следующая программа рисует движущиеся квадрат и круг:

#include <unistd.h>
#include <vingraph.h>

int main ()
  {
  ConnectGraph ();
  Fill (0, RGB (255, 242, 205));
  int c1 = RGB (38, 176, 136);
  int f1 = Rect (10, 200, 50, 50, 0, c1);
  Fill (f1, c1);
  int c2 = RGB (48, 200, 240);
  int f2 = Ellipse (580, 200, 50, 50, c2);
  Fill (f2, c2);
  delay (1000);
  for (int i = 320; i; i--)
    Move (f1, 2, 0), Move (f2, -3, 0), delay (20);
  CloseGraph ();
  return 0;
  }

Вы можете посмотреть, как работает эта программа, запустив файл exmove.demo.

Следующая программа рисует расширяющиеся квадрат и окружность:

#include <unistd.h>
#include <vingraph.h>

int main ()
  {
  ConnectGraph ();
  Fill (0, RGB (255, 242, 205));
  int f1 = Rect (280, 190, 50, 50, 0, RGB (38, 176, 136));
  int f2 = Ellipse (370, 210, 200, 200, RGB (48, 200, 240));
  delay (1000);
  for (int i = 240; i; i--)
    Enlarge (f1, 2, 2), Enlarge (f2, -1, -1), delay (20);
  CloseGraph ();
  return 0;
  }
,

Вы можете посмотреть, как работает эта программа, запустив файл exenlarge.demo. Обратите внимание на нештатное поведение окружности, когда она продолжает "умешьшаться" после достижения нулевого размера.


[Previous] [Contents] [Next]