Побудова ламаної лінії з вершинами в точках масиву XY (n - число точок)
У графічних побудовах беруть участь або абсолютні координати точок (x1, y1), (x2, y2), що задаються значеннями типу SmallInt в екранній системі координат, або збільшення (dx, dy) щодо позиції поточної точки. Абсолютні ко ординати можуть бути і негативними. Це означає, що одна з точок графіче- ського примітиву знаходиться за межами координатної сітки екрану. Але видимий фрагмент відповідного графічного примітиву буде побудований. Порядок завдання кутових точок прямокутника жорстко фіксований. Точка (x1, y1) соответ- ствует лівого верхнього кута прямокутника.
Після відкриття графіки або очищення графічного екрану поточна точка (графічний курсор) знаходиться на початку координат - в лівому верхньому кутку екрану. При побудові ліній поточна точка переміщується в кінець відрізка. Побудова прямокутника не змінює позицію поточної точки. У цьому можна переконатися на такому прикладі (лістинг 15.3).
Лістинг 1 5 .3. програма CP
program CP; uses graph; var
gd: = D8bit; gm: = m800x600; initgraph (gd, gm, ");
LineRel (50,0); readln; closegraph;
Відповідне графічне вікно наведено на рис. 15.4.
Мал. 15.4. Переміщення поточної точки
Відрізки прямих і контури прямокутника можуть малюватися не тільки суцільними лініями. За замовчуванням в графічній системі встановлений саме цей режим. Однак користувач може його змінити, звернувшись до процедури SetLineStyle.
SetLineStyle (Style, Pattern, width);
Перший її параметр Style зазвичай задається однією з наступних мнемоніче- ських констант:
± SolidLn - режим побудови суцільних ліній (за замовчуванням);
± DottedLn - режим побудови пунктирною лінії;
± CenterLn - режим побудови штрихпунктирной лінії;
± Dashedln - режим побудови штриховий лінії;
± UserBitln - режим побудови ліній за шаблоном користувача.
У перших чотирьох режимах параметр Pattern ігнорується і може бути за- дан, наприклад, нулем. Його призначення - задати шаблон користувача, який формується у вигляді двобайтового шестнадцатеричной константи. Шаблон скані- руется зліва направо. Його черговий нульовий розряд робить черговий піксель ли ванні невидимим, а одиничний розряд - видимим. Після вичерпання розрядів шаблону сканування його бітів повторюється заново. Зразки відтворення стандартних типів ліній наведені на рис. 15.5. Як нестандартного шаб- лона була використана константа Pat = $ FFFFFF00.
Третій аргумент процедури SetLineStyle задає товщину лінії, яка мо-
жет дорівнювати одному пікселю (width = NormWidth) або двом пикселам (width = ThickWidth).
Мал. 15.5. стилі ліній
Процедура DrawPoly призначена для побудови ламаної лінії, вершини якої задані масивом точок типу PointType. Якщо координати останньої точки масиву збігаються з координатами початкової точки, то таким способом можна побудувати будь-який багатокутник (лістинг 15.4).
Лістинг 15.4. програма polygon
program polygon; uses graph;
xy: array [1..4] of PointType;
DrawPoly (4, xy); // побудова трикутника
Графічний екран цієї програми наведено на рис. 15.6.
Мал. 15.6. побудова трикутника
Наведені рис. 15.1, 15.3-15.6 побудовані штучно, т. К. Стандартно встановлений режим малювання відтворює всі графічні елементи білим кольором на чорному тлі. Тому справжні графічні вікна відповідних програм були оброблені в програмі Paint за допомогою звернення кольору на виділених ділянках робочого поля.
Справа в тому, що спроба малювати на графічному екрані чорним по білому не вирішується простим зміною кольору малювання (fc: = 0) і кольору фону (bc: = 15). При включенні в наведену вище програму, перш ніж звертатися до процедури Draw- Poly двох наступних операторів:
SetColor (0); // код чорного кольору SetBkColor (15); // код білого кольору
вміст графічного екрану не змінюється. Спроба виявити колір фону шляхом стирання вмісту екрану (процедура ClearDevice) теж ні до чого доброго не приводить - екран стає білим, а малювання кольором фону по білому на- дов не залишає. Тому доводиться йти на "обман" графічної системи: код нульового кольору переносимо в регістр ЦАП з номером, відмінним від 0. Потім назна- чаєм цей колір як колір переднього плану і міняємо колір фону (лістинг 15.5).
Лістинг 1 5 .5. Рісо вання ч е рним по бел ому
program poly_B_W; uses graph;
xy: array [1..4] of PointType;
gd: = D8bit; gm: = m800x600; initgraph (gd, gm, ");
SetPalette (1,0); // чорний колір -> 1-й регістр ЦАП SetColor (1); // присвоєння їм кольорів малювання SetBkColor (15); // зміна кольору фону
ClearDevice; // прояв кольору фону
DrawPoly (4, xy); readln; CloseGraph;
Після цих маніпуляцій перед нами графічний екран, висновок якого на принтер не призводить до підвищеної витрати тонера (див. Рис. 15.6).