uzluga.ru
добавить свой файл


Лекция 8

  • Кривые линии и ограничение изображения


Дуга окружности

  • Конечно же, хочется рисовать не только прямые линии, но и … , разумеется, например, окружности. Команда arc прорисовывает (добавляет к пути) дугу окружности. Ее точный формат

  • x y r a1 a2 arc

  • При таких параметрах проводится дуга окружности с центром в точке (x,y) и радиусом r от угла a1 до угла a2. Дуга проводится против часовой стрелки.

  • Для дуг, проводимых по часовой стрелке имеется команда arcn.

  • Уточнение: до рисования дуги проводится отрезок от текущей точки до начала дуги, если вы не хотите, чтобы этот отрезок появился, установите сами правильную начальную точку.



Пример с рисованием дуг

  • Вот красивый пример — старинный восточ-ный символ Инянь, олицетворяющий соединение двух противоположных начал.



Текст примера

  • %!

  • /disk {dup CP 4 2 roll 0 rm 0 360 arc}def

  • % полезное действие, рисует окружность данного

  • % радиуса с центром в текущей точке

  • /R 20 def /RH R 0.5 mul def /Rhole R 0.05 mul def

  • 300 500 T % черная часть фигуры

  • 0 R m 0 0 R 90 270 arc % левая часть

  • 0 RH neg RH 270 90 arc % низ правой части

  • 0 RH dup 270 90 arcn F % верх правой части

  • 0 RH m Rhole disk F % черная точка

  • GS 0 RH neg m Rhole disk WHITE F GR % белая точка

  • 0 LW % внешняя окружность

  • 0 0 m R disk S

  • showpage



Закругление

  • Кроме непосредственного рисования дуг окружностей в Постскрипте предусмотрена возможность рисования закруглений углов. Действия arcto и arct вписывают дугу данного радиуса в заданный угол.

  • Мы здесь рассмотрим только arct. Его формат

  • x1 y1 x2 y2 r arct

  • Пусть текущая точка обозначена через A, и имеются точки B=(x1,y1) и C=(x2,y2). В угол ABC вписывается окружность радиуса r. Действие arct проводит прямую линию по AB до точки касания и дугу окружности до точки касания на BC. Эта вторая точка касания и становится текущей.



Кривые Безье

  • Безье — это наш современник (возможно, он еще жив). Он работал инженером-проектировщиком во французской автомобильной фирме на заре компьютерных методов проектирования.

  • Предложенное им семейство кривых оказалось очень удобно и используется не только в Постскрипте.

  • Действие

  • x1 y1 x2 y2 x3 y3 curveto

  • проводит гладкую кривую, соединяющую текущую точку (x0,y0) с точкой (x3,y3), причем направление этой кривой в начальной точке совпадает с направлением на точку (x1,y1), а в конечной точке — с направлением на (x2,y2). Степень прилегания кривой к направлениям зависит от удаленности этих направляющих точек.



Математические подробности

  • Кривые Безье – это частный случай полиномов Бернштейна.

  • Для тех, кто жаждет математических подробностей:

  • кривая Безье задается параметрически полиномами третей степени

  • x(t) = a_x t^3 + b_x t^2 + c_x + x_0,

  • y(t) = a_y t^3 + b_y t^2 + c_y + y_0,

  • причем параметр t пробегает значения от 0 до 1. Контрольные точки связаны с коэффициентами следующими равенствами

  • x1 = x_0 + c_x/3, x2 = x1 + (c_x + b_x)/3,

  • x3 = x0 + a_x + b_x + c_x,

  • и совершенно аналогично для y.



Интерфейсные подробности

  • В программных системах, использующих Постскрипт и предназначенных для визуальных изменений графики, например, в CorelDraw и в FontLab, отрезки кривых, описываемые кривыми Безье, в режиме редактирования изображаются с двумя «булавками».

  • Пользователь может перемещать концы этих булавок, и кривая Безье сразу же изменяется.

  • Попробуйте сами нарисовать кривую Безье с такими «булавками»



Мой вариант решения

  • %!

  • /m{moveto}def /l{lineto}def LW{setlinewidth}def

  • /GS{gsave}def /GR{grestore}def

  • /CP{currentpoint}def /S{stroke}def /F{fill}def

  • /BLUE{0 0 1 setrgbcolor}def

  • /pin{GS l CP BLUE 0 LW S m CP 2 0 360 arc

  • F GR}def

  • /pcurveto{GS 6 copy m pin GR GS pin GR

  • curveto S}def

  • 200 200 m 1.5 LW

  • 300 250 450 250 400 200 pcurveto

  • showpage



Рисование внутри контура

  • Сейчас настал момент описать еще одно использование замкнутых путей.

  • Путь может задавать область, внутри которой должна находиться видимая часть рисунка.

  • Для того, чтобы достичь такого эффекта, нужно после построения замкнутого контура выполнить действие clip, а затем действие newpath, открывающее образование нового пути. Рисование этого нового пути (или закраска) использует ограничивающий контур и вызовет его потерю.

  • Однако, так как ограничивающий контур входит в графическое состояние, то сохранением состояния, можно сохранить и его.



Небольшой пример

  • Что нужно сделать, чтобы несколько геометрических фигур «подсунуть друг под друга» в циклическом порядке? Если мы будем просто рисовать одну фигуру за другой, то последняя нарисованная фигура окажется верхней.

  • Слева показано, что получилось, тонкой рамкой обведено неправильное место. Его просто поправить, если внутри рамки нарисовать заново первую фигуру. Так получен рисунок в центре. Справа показано, что так можно делать и более сложные вещи.



Программа для картинки

  • /FS{GS 0.75 setgray fill GR stroke}def

  • /V {30 -60 rm -7.5 90 rl 15 hrl CL FS} def % клин

  • 1.2 LW

  • % Левая картинка: рисуются 6 закрашенных клиньев

  • 120 340 m 6 {GS CPT V GR 60 rotate} repeat

  • % рамка вокруг «неправильного» места,

  • % где самый последний клин лежит выше всех

  • GS 21 -31 rm 25 vrl 25 hrl -25 vrl CL 0.5 LW S GR

  • % Центральная картинка: такие же клинья

  • 260 340 m 6 {GS CPT V GR 60 rotate} repeat

  • % потом строится та же рамка

  • GS 21 -31 rm 25 vrl 25 hrl -25 vrl CL

  • % но рамка не рисуется, а объявляется огранич.

  • % контуром, и путь начинает строиться заново

  • clip newpath 260 340 m V GR

  • % нарисованный клин изобразился только внутри рамки

  • showpage