?.pdf При создании графических приложений перед разработчиками очень частовстает задача отрисовки различных типов линий вдоль заданной траектории. При этом примитивы, формирующие шаблон специальной линии, могут быть скольугодно различны. Рассмотрим некоторые типы специальных линий, с которымиприходится работать при проектировании схем дислокации дорожных знаков, разметки и обустройства автомобильных дорог.1. Примеры специальных линий1 . 1 . Д о р о ж н а я р а з м е т к а Для описания данной спецлинии необходимо выделить повторяющуюся часть(шаблон) и задать ее в некотором заранее разработанном формате. Для отрисовкирассмотренной линии шаблон следует повторять вдоль заданной траектории, при этом на кривых участках изображение должно соответствующим образом изгибаться вдоль траектории (рис. 1).Рис. 1. Дорожная разметкаУниверсальный способ отрисовки специальных линий средствами GDI- 1011 . 2 . Д о р о ж н ы е о г р а ж д е н и я В данном примере помимо основного шаблона, задающего линию, можно выделить начальный и конечный шаблоны, которые имеют отличное от основногоначертание (рис. 2). Дополнительное неудобство возникает и в случае, когда длина траектории, вдоль которой необходимо отрисовать спецлинию, не являетсякратной сумме длин начального, конечного и некоторого количества основныхшаблонов (на практике так обычно и бывает).Рис. 2. Дорожное ограждениеЕсли предположить, что длина линии, вдоль которой необходимо отрисоватьшаблоны, составляет 250 мм, а длины начального, основного и конечного шаблонов равны соответственно 10, 30 и 10 мм, то нетрудно подсчитать, что при отрисовке будут отображены 1 начальный, 7 основных и 1 конечный шаблоны (суммарной длиной 230 мм). При этом остается неопределенность в рисовании 20-ммлинии, разрешить которую предлагается введением промежуточного шаблона. Он необходим в том случае, когда длина линии не соответствует сумме длин начального, конечного и N основных шаблонов. Например, для дорожных огражденийпромежуточным шаблоном будет являться отрезок прямой линии, идущей по верху. Будем считать также, что промежуточный шаблон конечной (но достаточной)длины, а при отрисовке спецлинии будем выбирать лишь какую-то его часть в зависимости от того, насколько суммы длин не совпадают. Еще одним отличием от предыдущего варианта является и то, что здесь присутствуют примитивы, которые должны изгибаться вдоль траектории (верхняя линия), но есть и такие, которые должны отображаться без искажений (окружности).1 . 3 . Р е з ю м е Таким образом, можно выделить ряд элементарных шаблонов, совокупностькоторых составляет требуемый составной шаблон. Рассмотрим их в порядке вхождения: 1) начальный шаблон; 2) промежуточный шаблон; 3) основной шаблон; 4) промежуточный шаблон; 5) конечный шаблон.Каждый из элементарных шаблонов в свою очередь состоит из базовых примитивов (прямые, кривые Безье, сплайны), которые характеризуются набором точек (X, Y) в системе координат элементарного шаблона и толщиной. При этом для базовых примитивов заводится 2 списка: для изгибающихся и неизгибающихсяпримитивов. Для создания произвольного шаблона как совокупности элементарных разработана специальная утилита SpecLinePatterns.102 А.В. Приступа, А.В. Петрухин2. Особенности реализации2 . 1 . Х р а н е н и е ш а б л о н о в Разработанные шаблоны хранятся в базе данных. Такой вариант хранения был выбран потому, что обычно в инструментах проектирования схем дислокации автомобильных дорог в основе лежит база данных с дорогами и элементами, входящими в нее. Если база данных отсутствует, то создавать ее только для храненияшаблонов спецлиний нецелесообразно, поэтому в качестве альтернативы структуру шаблонов можно хранить и в файлах. Если начинать с самого низкого уровня(примитивов), то каждый из них «умеет» записывать себя в поток и читать из него, а затем потоки двух списков примитивов записываются в поток элементарногошаблона.2 . 2 . В о з м о ж н о с т и G D I в к о н т е к с т е о т о б р а ж е н и я с п е ц и а л ь н ы х л и н и й Для решения задачи отображения разработанных шаблонов необходимо рассмотреть 2 возможности библиотеки GDI- [1, 2], а именно возможность рисоватьпрерывистые линии произвольной конфигурации, задавая длины штрихов и пропусков вдоль пера (рис. 3), а также делать пропуски в исходном пере заданнойтолщины (рис. 4.А), задавая ширины видимых и невидимых частей пера поперек(рис. 4.Б).Рис. 3. Прерывистая линияРис. 4.А. Исходное пероРис. 4.Б. Перо с пропускамиОперируя терминологией библиотеки GDI- [3], рассмотрим объект TGPPen(перо для рисования). В простейшем случае конструктор пера выглядит как TGPPen.Create (MakeColor (A, R, G, B), Width), где 0
| Приступа Андрей Викторович | Томский государственный университет | кандидат технических наук, доцент кафедрытеоретических основ информатики | pristupa@sibmail.com |
| Петрухин Александр Васильевич | ООО «Индор-Диагностика» | директор | diag@indor.ru |
Брусенцев В. GDI-: графика нового поколения [Электронный ресурс]. URL: http://www.rsdn.ru/article/gdi/gdiplus1.xml; http://www.rsdn.ru/article/gdi/gdiplus2.xml; http://www.rsdn.ru/article/gdi/gdiplus3.xml
Поляков А., Брусенцев В. Программирование графики: CDI+ и DirectX. СПб.: БХВ-Петербург, 2005. 360 с.
MSDN Win32 and COM Development Graphics and Multimedia GDI-. Приступа Андрей Викторович