Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика программирование, учебник.doc
Скачиваний:
0
Добавлен:
25.12.2019
Размер:
22.08 Mб
Скачать

Построение и окраска произвольного рисунка на примере замка

Существует два подхода к построению программ воспроизведения изображения на экране: визуальное проектирование и геометрическое моделирование изображения.

В графических программах языка Borland Pascal 7.0 не предусмотрены программные средства визуального программирования, поэтому приходится поступать следующим образом. Берется лист миллиметровки размером в миллиметрах, соответствующий количеству пикселей по осям экрана. На этот лист наносится рисунок, как вы его хотите видеть. Далее по рисунку вручную снимаются координаты всех точек, и заполняются массивы координат X и Y. Далее в программе соединяют эти точки прямыми линиями, строят на основании этих координат прямоугольники, дуги и окружности. Для иллюстрации этого метода приведем пример построения замка (см. рис. 3.14).

Пример 23. На фоне синего неба со звёздами (использован датчик случайных чисел) и желтым полумесяцем нарисован кирпичный замок (из серого кирпича) с крышей из черепицы красного цвета. Код программы, составлен Румянцевой Натальей Сергеевной, студенткой первого курса СПбГУВК, группа ИС-11.

Рис. 3.14 Изображение замка в окне Norton Commander. Результат работы программы PR23

Построение и заливка правильного многоугольника

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

Этот способ заключается в том, что разрабатываются формулы, с помощью которых рассчитываются положения характерных точек геометрической фигуры, и на основании этих расчетов заполняются координатные массивы X и Y. Очевидно, второй способ наиболее удобен для правильных геометрических фигур, к которым относятся и звезды.

Пример 24. Разработать программу, отображающую в центре экрана пятиконечную звезду, с длинами лучей L и M, повернутую относительно центра на угол G (см. рис. 3.15), и окрашенную основным и ярким оттенком цвета С.

Рис. 3.15 Модель звезды (угол поворота G = –90º)

Модель звезды содержит помимо центральной точки (на рис. 3.15 эта точка соответствует началу системы координат XOY), еще 10 пронумерованных по порядку точек - концов лучей. Лучи чередуются и делятся на большие и маленькие. Большие лучи имеют одинаковую длину, равную L в пикселях, а маленькие - M. Угол поворота звезды определяется по положению первого луча и задается углом G (в градусах) и отсчитывается от оси OX по часовой стрелке. Концы больших лучей лежат на окружности радиусом L и центром в точке 0, 0 на осях XOY. Концы малых лучей лежат на окружности радиусом M и центром в точке 0, 0 на осях XOY. Угол между соседними лучами равен 36. Таким образом, пересчет положения концов лучей из полярной системы координат в декартовую XOY можно осуществлять по известным формулам:

,

где - длина луча с номером i; - угол поворота луча относительно оси OX; P - координата центра экрана по оси X; Q - координата центра экрана по оси Y. Ниже приведен код программы, рисующую звезду по примеру 24.

PROGRAM PR24;

Uses CRT, GRAPH;

Var dr, md: integer;

G,PG:real; {УГЛЫ ПОВОРОТА - ЗВЕЗДЫ, ЛУЧА}

L,M, {ДЛИНА БОЛЬШОГО И МАЛОГО ЛУЧЕЙ ЗВЕЗДЫ}

P,Q, {МАКСИМАЛЬНЫЕ ЗНАЧЕНИЯ ПО ОСЯМ X И Y}

XP,YQ, {КООРДИНАТЫ ТОЧКИ ЗАЛИВКИ}

C, {ЦВЕТ ЗВЕЗДЫ}

K,I: WORD;

X,Y: ARRAY[1..10] OF WORD; {КООРДИНАТЫ КОНЦОВ ЛУЧЕЙ}

ch: char;

Begin

ClrScr;

WRITELN('Укажите длину лучей - L, M'); READLN(L, M);

WRITELN('Укажите угол поворота звезды, град.- G'); READLN(G);

WRITELN('Укажите цвет звезды, число - С'); READLN(C);

dr := detect; INITGRAPH (dr, md, 'd:\tp\bgi');

P := GetMaxX div 2; Q := GetMaxY div 2;

SetBkColor(7); ClearDevice;

SetColor(1); SetLineStyle(0,0,1);

For I:=1 TO 10

DO Begin {ОПРЕДЕЛЕНИЕ КООРДИНАТ КОНЦОВ ЛУЧЕЙ}

IF ODD(I) THEN K := L ELSE K:=M;

PG:=(G + 36*(I-1))*PI/180; {УГОЛ ЛУЧА}

X[I]:=ROUND(K * Cos(PG) + P);

Y[I]:=ROUND(K * Sin(PG) + Q);

LINE(X[I],Y[I],P,Q);

End;

For I:=1 TO 9

DO LINE(X[I], Y[I], X[I+1], Y[I+1]);

LINE(X[10],Y[10],X[1],Y[1]);

For I := 1 TO 10 {ЗАЛИВКА СЕКТОРОВ ЛУЧЕЙ ЗВЕЗДЫ ЦВЕТОМ C}

DO Begin

IF ODD(I) THEN SetFillStyle(1,C) ELSE SetFillStyle(1,C+8);

PG:=(G+36*(I-1)+18)*PI/180; {УГОЛ ЛУЧА XP, YP - ТОЧКА ЗАЛИВКИ}

XP := ROUND(5*Cos(PG) + P); YQ := ROUND(5*Sin(PG) + Q);

FloodFill(XP, YQ, 1);

END;

ch:=readkey;

End.