Случайные числа в машинной графике

advertisement
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
Лабораторная работа № 12
«СЛУЧАЙНЫЕ ЧИСЛА В МАШИННОЙ ГРАФИКЕ»
Введение
В качестве основы для создания какой-либо последовательности случайных чисел служат
показания встроенного в компьютер таймера. А поскольку они в каждый момент времени различны, то
мы и получаем великое множество практически не повторяющихся чисел в заданном диапазоне.
Имеющаяся в Паскале функция Random() возвращает целое случайное число в заданном диапазоне
и, как правило, используется в качестве источника неповторяющихся чисел, скажем, для имитации
бросаний кубика или генерации лабиринтов в компьютерных играх. Но их применение возможно и в
машинной графике, причем они обеспечивают множество интересных эффектов. Так, некоторые
достаточно сложные программы для рисования на IBM картинок, по качеству не уступающих
фотографиям, используют случайные числа для получения реалистичного изображения травы,
туманной дымки, огня костра или, например, для превращения рисунка в своеобразную мозаику. В
наиболее же простом случае функция Random является основой картинок типа «звездного неба».
I.Выполним на компьютере следующую программу:
var i:integer;
begin
for i:=1 to 10 do
write(random(100):4);
readLn;
end.
Мы видим, что при повторении запуска этой программы на экране появляются одни и те же числа.
Чтобы получать случайные числа, нужно инициировать процесс генерации случайных чисел
компьютером при помощи оператора RANDOMIZE. Он указывается в программе только один раз и
сообщает компьютеру, что надо создавать случайные числа, беря за основу показания таймера. При его
отсутствии функция Random выдает одну и ту же последовательность чисел при каждом запуске
программы. Для изменения этой последовательности поставьте оператор RANDOMIZE в начале
программы.
Выполним на компьютере следующую программу:
var i:integer;
begin
randomize;
for i:=1 to 10 do
write(random(100):4);
readLn;
end.
Получается десять случайных целых чисел в интервале от 0 до 100. Повторим запуск этой программы
несколько раз — числа будут получаться различные.
Основные конструкции, используемые при получении случайных чисел:
Random случайное число в интервале от 0 до 1;
Random(100) -случайное число в интервале от 0 до 99;
Random(100)+1 -случайное число в интервале от 1 до 100;
Random(10)+20 -целое случайное число в интервале от 20 до 29.
Задание 1. Получить 10 случайных чисел в интервале от 100 до 150.
II.Применим новые операторы и функции в машинной графике.
Откроем программу shablon.pas для включения графического режима.
Вспомним размер окна: 640(x)480(y).
Нарисуем 100 точек белого цвета, расположенных в случайном месте экрана.
uses graph, crt;
var x, y, i, dr, reg:integer;
begin
randomize;
dr:=9; reg:= 2;
outtextxy(250,240,'Press any Key'); {выводит текст}
repeat until keypressed;
{в центре экрана}
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
Initgraph(dr,reg,'d:\BP\bgi\');
for i:=0 to 100 do
begin
x:= random(639); y:= random(479);
Putpixel(x,y,10);
Delay(700); {Оператор задержки}
end;
ReadLn;
CloseGraph;
end.
Для изменения количества точек на экране служит оператор: for i:=0 to 100 do .
Нарисуем разноцветные «звезды»:
Изменим содержание цикла, добавив в раздел описаний var переменную с:
for i:=0 to 100 do
begin
x:= random(639);
y:= random(479);
c:= random(15)+1; {Исключаем черный цвет}
Putpixel(x,y,c);
Delay(7000); {Оператор задержки}
end;
Получилось «звездное небо».
Теперь заменим оператор Putpixel на LINE(x1,y1,x2,y2); где x1,y1 – координаты начала линии
зафиксируем, x2, y2– координаты конца линии изменим случайным образом. Изменим содержание
цикла:
for i:=0 to 100 do
begin
x:= random(639);
y:= random(479);
c:= random(15)+1;
setcolor(c);
{меняет цвет линий}
Line(315,245,x,y);
Delay(7000);
end;
Получилось изображение звезды с разноцветными лучами.
Задание 2. Нарисовать разноцветные линии расположенные случайным образом. III.Заменим
линии разноцветными прямо-угольниками. Изменим содержание цикла:
for i := 1 to 50 do
begin
c:=random(15)+1;
x1:= random(639);
y1:= random(479);
x2:= random(639);
y2:= random(479);
SetColor(c);
Rectangle(x1, y1, x2,y2);
Delay(9000);
end;
Чтобы получить закрашенные прямоуголь-ники можно воспользоваться оператором Bar(x1,y1,x2,y2)
– рисующую полосу заданного размера. Заменим Rectangle на Bar в предыдущей программе.
IV. Настал черед заполнить экран полусотней окружностей. Добавим пере-менную r и изменим
содержание цикла:
outtextxy(250,240,'Press any Key');
repeat until keypressed;
For i:=1 to 50 do
begin
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
c:=random(15)+1;
setcolor(c);
x:=random(639);
y:=random(479);
r:=random(150);
Circle(x,y,r);
Delay(9000);
end;
И закрасим окружности случайными цветами. Для этого добавим два оператора:
For i:=1 to 50 do
begin
c:=random(15)+1;
setcolor(c);
x:=random(639);
y:=random(479);
Setfillstyle(1,c);
Circle(x,y,random(150));
floodfill(x,y,c);
Delay(9000);
end;
V.Сделаем из окружностей эллипсы. В предыдущих программах заменим оператор Circle на
Ellipse(x1,y1,StAng,EndAng,xRadius,yRadius), где x1,y1 – центр эллипса, StAng – Начальный угол,
EndAng – конечный угол, xRadius,yRadius – радиусы по х и по y.
Ellipse(x,y,0,360,random(150),random(150));
В ходе написания этих программ мы повторили графические операторы PutPixel, LINE, CIRCLE,
Rectangle,Bar, Ellips, Sector ,а также познакомились с функциями Random и оператором RANDOMIZE.
Задание 3. Творческая работа.
Нарисовать зимнюю ночь. Запрограммировать движение месяца по небу.
Download