Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

9.4. Работа с цветом. Заливка. Стиль линий и заливки

Сначала поговорим о стиле линий. Если вы хотите, чтобы линии, которыми чертятся фигуры, были потолще, используйте процедуру SetLineStyle. Вот ее вызов - SetLineStyle(0,0,ThickWidth). Это приказ отныне рисовать линии толстыми. Если вы хотите вернуться к тонким линиям, напишите SetLineStyle(0,0,NormWidth).

Первый параметр процедуры SetLineStyle управляет стилем прямых отрезков (штриховые, пунктирные и др.). Попробуйте вместо 0 написать 1, 2 или 3 и посмотрите, что получится.

Второго параметра касаться не будем.

А теперь поговорим о цвете. Если цвет точки задается непосредственно в вызове процедуры, которая рисует точку (PutPixel), то цвета многих других фигур задаются по-иному. Делает это специальная процедура SetColor. Пример: SetColor(Yellow) приказывает компьютеру рисовать фигуры желтым цветом.

Вот поясняющий фрагмент:

Circle(100,100,20); {окружность белая и тонкая, так как по умолчанию Паскаль все рисует белым цветом тонкими линиями}

SetColor(Yellow);

Circle(150,100,20); {желтая тонкая окружность}

SetLineStyle(0,0, ThickWidth);

Circle(200,100,20); {желтая толстая окружность}

SetColor(Blue);

SetLineStyle(0.0,NormWidth);

Circle(250,100,20); {синяя тонкая окружность}

Работая в Паскале, вы можете покрасить любым цветом любую область экрана внутри замкнутого контура. Пусть вы нарисовали такую картинку:

После этого вы можете ее покрасить, например, вот так:

Как красить?

Начнем с процедуры SetFillStyle. Подобно тому как процедура SetColor сама ничего не рисует, а только устанавливает цвет линий на будущее, процедура SetFillStyle сама ничего краской не заливает, а устанавливает цвет и стиль заливки на будущее. Например, SetFillStyle(1, Green) устанавливает заливку зеленым цветом. На единичку пока не обращаем внимания.

Сам процесс заливки вызывает процедура FloodFill. Например, FloodFill(200,150,Blue) вызывает следующие действия Паскаля:

В точке экрана с координатами х = 200 и у = 150 встает кисть, цвет которой был указан в обращении к процедуре SetFillStyle (в нашем примере - зеленый), и начинает раскрашивать. Краска свободно растекается по экрану, и преградой для нее становится только линия, имеющая цвет, указанный в обращении к процедуре FloodFill, то есть синий. Очевидно, если синий контур не будет замкнут вокруг кисти, то краска закрасит весь экран.

Пример:

Следующий фрагмент нарисует желтый квадрат и зальет его красным цветом:

SetColor(Yellow);

SetFillStyle(1,Red);

Rectangle(200,50,300,150);

FloodFill(250,100, Yellow)

А теперь попробуем поставить кисть вне квадрата, записав в нашем фрагменте вместо FloodFill(250,100, Yellow), например, FloodFill(250,200, Yellow). Теперь красной будет вся поверхность экрана, кроме области внутри квадрата.

Напомним, что в нашем случае только желтые линии и области являются преградой для красной краски. Например, попытаемся покрасить желтой краской маленький прямоугольник, помеченный единичкой, полученный пересечением больших красного и синего прямоугольников:

Для этого поместим кисть внутрь этого прямоугольника и используем операторы SetFillStyle(1, Yellow) и FloodFill(...,...,Blue). Мы получим следующую картину:

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

Заливку можно делать не только сплошной, но и по-разному заштрихованной. Для этого вместо единички в обращении к процедуре SetFillStyle попробуйте другие целые числа - 2, 3 и др.

Задание 68

Усовершенствуйте снеговика из раздела 9.3. Он должен стать таким: с красным носом, красными губами, желтой шапкой и толстым синим посохом. При помощи оператора WriteLn сделайте надпись: "Это снеговик".