Узор

Компьютер рисует узор

    Этот пример я взял из одной книжонки по программированию для начинающих изучать 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);
}
}
//---------------------------------------------------------------------------

Ну вот и все! Всего хорошего мой юный друг!!!

 

 ПрограммированиеГлавная




Hosted by uCoz