Компьютер рисует
узор
Этот пример я взял из одной книжонки по
программированию для начинающих изучать Builder C++ . Программка
довольно интересная. Словом, она может самостоятельно рисовать узоры
на экране. То есть изображение «живет собственной жизнью»!
В общем, меньше слов , больше дела! Для начала создаем проект
и кидаем на форму PaintBox (Область рисования), которая находится на
вкладке Sistems, там же находится и второй элемент, который нам
нужен. Но пока остановимся на первом. Задаем размеры PaintBox.
Допустим они будут 320:320. Теперь перетаскивай на форму таймер:
Timer из той же вкладки. Сразу же установим время срабатывания:
100. Начинаем программирование. Для
начала запишем константы, которые вставим в самое начало нашей
программы, то есть до их применения в проге. Пишем:
const size=40; const
csize=12;
Здесь ключевое слово const указывает на то, что дальше идет
описание константы. Константа size задет число клеточек по
каждому направлению, константа csize – число используемых цветов.
Число используемых цветов забацаем в массив: Tcolor Colors[16] =
{ clRed, clGreen, clYellow, clBlue, clWhite,
clGray, clFuchsia, clTeal, clNavy, clMaroon, clLime, clOlive,
clPurple, clSilver, clAqua, clBlack};
Их может быть больше, чем мы будем использовать. Теперь
описываем двумерный массив:
int Points[size][size];
Ну что ж теперь можно приступать к описанию логики
программы. Выбираем форму, щелкаем в инспекторе объектов на
вкладке Events, далее дважды щелкаем напротив события OnCreate и
пришем:
int i, j; //
вводим необходимые переменные цикла. randomize() //обеспечиваем
неповторимость случайных чисел.
Что бы система нашла эту процедуру в начале программы надо
добавить: #include
<stdlib.h>
Приступаем к инициализации массива квадратиков:
for (i=0; i<size; i++) for (j=0;
j<size; j++) Points[i][j] = random(csize);
Теперь выберите объект Timer1 кликайте на вкладку Events затем по
событию OnTimer и пишите:
Задаем переменные, которые будут определять состояние соседних
клеток, а так же переменные цикла двумерного массива:
int i, j; int c, d, u, l, r; int
newPoints[size][size]; for (i=0; i<size; i++) for (j=0;
j<size; j++) c = Points[i][j]+1;//
определяем следующий цвет. if (c==csize) c=0;
Аналогичным способом вычисляем индексы квадратов, которые
примыкают снизу, сверху, слева и справа:
d=i-1; if (d<0)
d=size-1; u=i+1; if (u==size) u=0; l=j-1; if (l<0)
l=size-1; r=j+1; if (r==size) r=0; newPoints[i][j]=Points[i][j]; //если среди соседей такой цвет отсутствует, то
клеточка остается такой же. if
(Points[d][j]==c || Points[u][j]==c || Points[i][l]==c ||
Points[i][r]==c) newPoints[i][j]=c;} // оператор || указывает на то что условие истинно,
если истинно хотя бы одно из условий. Теперь
разбиваем область рисования на клеточки: c
= 320/size; for (i=0; i<size; i++) for (j=0;
j<size; j++){
Копируем новые цвета клеточек в основной
массив:
Points[i][j]=newPoints[i][j];
Далее пишем:
PaintBox1->Canvas->Pen->Color =
Colors[Points[i][j]]; PaintBox1->Canvas->Brush->Color =
Colors[Points[i][j]]; PaintBox1->Canvas->Rectangle
(c*(i-1),c*(j-1),c*i-1,c*j-1);}
Все сделано!!! Теперь программа будет рисовать сама.
Рисунок обновляется по системным часам, то есть по таймеру, который
мы с вами установили. Посмотрите что получиться. Жми F9. Темка
интересная. Вот только сколько я не бился, никак не получалось
геометрически правильного рисунка. Попробуйте, может у вас что
нибудь да получиться!!! Далее приведен листинг программы. Если
не поняли, то качайте исходники, в разделе исходники и программули.
#include <vcl.h> #pragma
hdrstop #include <stdlib.h> #include
"Unit1.h" //--------------------------------------------------------------------------- #pragma
package(smart_init) #pragma resource "*.dfm" TForm1
*Form1; const size=40; const csize=12; TColor
Colors[16]= { clRed, clGreen, clYellow, clBlue, clWhite, clGray,
clFuchsia, clTeal, clNavy, clMaroon, clLime, clOlive, clPurple,
clSilver, clAqua, clBlack}; int
Points[size][size]; //--------------------------------------------------------------------------- __fastcall
TForm1::TForm1(TComponent*
Owner) :
TForm(Owner) { } //---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject
*Sender) { int i, j; randomize(); for (i=0; i<size;
i++) for (j=0; j<size; j++) Points[i][j] =
random(csize); } //--------------------------------------------------------------------------- void
__fastcall TForm1::Timer1Timer(TObject *Sender) { int i,
j; int c, d, u, l, r; int newPoints[size][size]; for(i=0;
i<size; i++) for(j=0; j<size;
j++) {c=Points[i][j]+1; if(c==size)
c=0; d=i-1; if(d<0) d=size-1; u=i+1; if(u==size)
u=0; l=j-1; if(l<0) l=size-1; r=j+1; if(r==size)
r=0; newPoints[i][j]=Points[i][j]; if(Points[d][j]==c ||
Points[u][j]==c || Points[i][l]==c ||
Points[i][r]==c) newPoints[i][j]=c; } c=320/size; for(i=0;
i<size; i++) for(j=0; j<size;
j++) { Points[i][j]=newPoints[i][j]; PaintBox1->Canvas->Pen->Color=Colors[Points[i][j]]; PaintBox1->Canvas->Brush->Color=Colors[Points[i][j]]; PaintBox1->Canvas->Rectangle(c*(i-1),c*(j-1),c*i-1,c*j-1); } } //---------------------------------------------------------------------------
Ну вот и все! Всего хорошего мой юный
друг!!! |