Работа с цветом. Заливка. Стиль линийи заливки
Сначала поговорим о стиле линий. Если вы хотите, чтобы линии, которыми чертятся фигуры, были потолще, используйте процедуру 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). Теперь красной будет вся поверхность экрана, кроме области внутри квадрата.
Распространенная ошибка новичков - на вопрос о том, каким цветом будет красить оператор FloodFill(250, 100, Yellow), они отвечают “Желтым”, хотя нужно отвечать “Не знаю, надо посмотреть в SetFillStyle”.
Напомним, что в нашем случае только желтые линии и области являются преградой для красной краски. Например, попытаемся покрасить желтой краской маленький прямоугольник, помеченный единичкой, полученный пересечением больших красного и синего прямоугольников:
Для этого поместим “маляра” внутрь этого прямоугольника и используем операторы SetFillStyle(1, Yellow) и FloodFill( ¼ , ¼ ,Blue ). Мы получим следующую картину:
Очевидно, при помощи FloodFill нужный прямоугольник закрасить невозможно, так как он ограничен линиями разного цвета.
Заливку можно делать не только сплошной, но и по-разному заштрихованной. Для этого вместо единички в обращении к процедуре SetFillStyle попробуйте другие целые числа - 2, 3 и др.
Задание 68: Усовершенствуйте снеговика из 9.3. Он должен стать таким - с красным носом, красными губами, желтой шапкой и толстым синим посохом. При помощи оператора WriteLn сделайте надпись “Это снеговик”.