Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графика методичка.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
106.5 Кб
Скачать

5. Создание «резиновой нити»

Пользоваться созданной нами программой не удобно, так как мы видим положение отрезка только после того как указали определяющие его точки. В такой ситуации сложно создать даже произвольный горизонтальный отрезок. Однако, помочь пользователю достаточно просто. После ввода первой точки отрезка можно показать позицию создаваемого отрезка, соединив линией введенную точку и текущую позицию курсора мыши. При перемещении мыши линия должна соответственно изменять свое положение. С подобным приемом вы, наверное, сталкивались, работая с графическими программами. Данный тип курсора (ответа системы на действия пользователя) носит название «резиновой нити». Далее мы разберем принципы ее реализации.

Прежде чем переходить к изучению методов создания изменяющихся во времени изображений, рассмотрим подробнее режимы вывода, задаваемые свойством Canvas.Pen.Мode. С полным списком разрешенных значений этого свойства можно познакомится в справочной системе Delphi. Мы рассмотрим только наиболее важные для нашей темы режимы:

  • pmCopy Цвет линии определяется свойством Canvas.Pen.Color. При выводе в этом режиме рисуемая линия уничтожает попавшие под нее пиксели фона и заносит на их места пиксели своего цвета. Данный режим используется по умолчанию;

  • pmXor Цвет линии определяется результатом операции Xor (исключающее ИЛИ) над цветом фона и цветом, заданным свойством Canvas.Pen.Color;

  • pmNotXor Цвет линии определяется отрицанием результата, полученного по схеме предыдущего режима.

В отличие от режима pmCopy, при выводе в режимах, определяющих результирующий цвет на основе логической операции Xor, информация о фоне учитывается при определении цвета, выводимого пикселя, и ее при необходимости можно восстановить.

Предположим, цвет пикселя фона задан битовой комбинацией 1111, а цвет линии- 0101, тогда цвет выводимого пикселя определиться как

Восстановить цвет фона достаточно просто. Еще раз выполним логическую операцию Xor между полученным цветом и цветом линии

Как видим, битовый код цвета пикселя идентичен исходному цвету. Таким образом, если в режиме Xor начертить линию любого цвета, а затем повторно прорисовать ее по тем же координатам тем же цветом, то линия исчезнет с экрана, оставив фон не поврежденным.

Цвет выводимого пикселя сильно отличается от желаемого цвета линии (заданного свойством Canvas.Pen.Color). Чтобы этого не происходило, вместо логической операции Xor используют операцию NotXor. Результирующий цвет получается близким или совпадающим с цветом линии. Рассмотрим тот же пример.

как видим, результирующий цвет совпадает с цветом линии

так же как и в предыдущем случае получаем исходный цвет фона.

На рассмотренной выше идее и основывается один из методов создания «резиновой нити». При каждом движении мыши необходимо:

  1. Стереть с экрана существующий на данный момент отрезок. Для этого необходимо начертить еще раз этот отрезок в режиме NotXor.

  2. Начертить в режиме NotXor отрезок, связанный с новым положением мыши. Запомнить координаты концов отрезка для повторного вычерчивания, обеспечивающего стирание отрезка (так как первая точка отрезка фиксирована, можно запоминать только одну точку).

Реализуйте «резиновую нить». Для этого поместите в обработчик события onMouseMove требуемый код. Не забудьте вставить проверку на нажатие левой кнопки мыши, нить должна появляться только при нажатой кнопке.

Созданная вами программа может оставлять на экране «мусор» в виде отдельных точек. Это вызвано тем, что при первом перемещении курсора мыши образа нити на экране не существует, и попытка стирания приводит к появлению «мусора». Чтобы этого не происходило, нужно добавить в обработчик события onMouseDown функцию рисования нити (создаваемый отрезок будет единичной длины).