Второй пример- построение "резиновой" линии (rubberbanding)- метод формирования графических изображений в интерактивном режиме. В рассмотренной выше программе рисования для задания вершин формируемого графического объекта пользователь должен был дважды (или трижды) указать позиции в графической зоне окна, щелкнув кнопкой мыши. При этом он только мысленно мог себе представить, как именно пройдет формируемый отрезок и как он соотносится с ранее вычерченными объектами. Новый метод позволяет пользователю постоянной видеть "эскиз" формируемого отрезка, который будет следить за текущим положением мыши, связывая его с ранее введенной точкой. Поведение этого "эскиза" нового отрезка очень напоминает поведение резиновой нити, закрепленной одним концом на каком-либо гвоздике, вбитом в чертежную доску, а другим концом на игле циркуля или "чертилки", - куда бы ни двигалась "чертилка", между нею и вбитым гвоздиком всегда видна прямая линия, образованная натянутой нитью. Точно такую же роль играет в самом примитивном виде и искусственная "резиновая" нить в графической системе. Обычно изображение нити возникает, когда пользователь нажимает кнопку мыши, и отслеживает текущее положение указателя мыши до тех пор, пока пользователь не отпустит кнопку (рис. 3.23). Но в некоторых графических системах применяется и другая последовательность операций- нить возникает после первого щелчка, а после второго и всех последующих "перепрыгивает" в новую позицию, пока не будет сформирована команда прекращения последовательности отрезков. При формировании изображения "резиновой" нити на каждом цикле прежнее изображение отрезка (т.е. отрезка, связывавшего предыдущее положение указателя мыши с начальной точкой) стирается, а вычерчивается новое изображение, связанное с текущим положением указателя мыши.
Рис. 3.23. Построение "резиновой "линии
Ввод и взаимодействие с пользователем
При построении изображения "резиновой" нити не обойтись без операций на уровне буфера кадра или без специальных аппаратных средств. Эта проблема во многом сходна с проблемой построения изображения всплывающего меню. В каждом цикле отслеживания текущего положения мыши нужно сначала вернуть изображению "первозданный" вид, а потом вычертить новый отрезок. С помощью аналогичной технологии вычерчиваются не только "резиновые" отрезки, но и "резиновые" прямоугольники и окружности. Такие инструментальные пакеты, как GLUT, предоставляют программисту широкие возможности для выполнения операций пересылки блоков буфера кадра. В состав пакетов практически всегда включаются средства для формирования всплывающих меню и построения изображения "резиновой" нити, что избавляет прикладного программиста от необходимости самостоятельно разрабатывать их, если в приложении нужно реализовать подобные функции.