Узоры. Плитки

12 сентября 2018 - Администратор

Рисование в си графических узоров
Рассмотрим программу на си для рисования повторяющихся графических узоров Программа заполняет экран прямоугольными плитками различного цвета. Цвет плитки определяется случайным образом. При написании программы будут полезны уроки Графика в Си. и Циклы в Си.
Описание алгоритма программы на си для рисования узора
Чтобы цвет каждой плитки определялся  случайным образом, мы должны использовать случайные числа в си. Для этого будем использовать функцию, которая определяет системное время в Си в секундах.

#include <time.h>
// функция выдающая системное время секунды

int sec()
{
time_t t;
struct tm *t_m;
t=time(NULL);
t_m=localtime(&t);
return t_m->tm_sec;
}

Цвет меняется в диапазоне от 1 до 15.
// определяем цвет плитки
       color=(rand()+sec())%15+1;

Чтобы заполнить экран прямоугольниками, мы рисуем таблицу из них. “Пробегаемся” по всем строкам и для каждой строки рисуем столбцы в виде прямоугольников. Для этого используется вложенный цикл.  Внешний цикл отвечает за строки, вложенный за столбцы. Переменные циклов, будут указывать номер строки и номер столбца прямоугольника.Чтобы нарисовать закрашенный прямоугольник в Си используется оператор bar(x1,y1,x2,y2) он рисует закрашенный прямоугольник,  с координатами верхнего левого угла x1, y1 и с координатами правого нижнего угла x2 , y2. Если размер плитки size, то координаты левого верхнего угла плитки с номером строки i ( координата y ) и номером столбца j(координата x) будет x1=j*size, y1=i*size. Так как в графическом режиме  Си координата x увеличивается слева направо, а координата y увеличивается сверху вниз,то координаты правого нижнего угла текущий плитки будут вычисляться по формулам x2=x1+size=size*(j+1), y2=y2+size=size*(i+1)

// пробегаемся по всем строкам
for (i=0; i<=k; i++)
{
// пробегаемся по всем столбцам
    for (j=0;j<=k;j++)
    {
        // определяем цвет плитки
       color=(rand()+sec())%15+1;
       // задаем цвет плитки
       setfillstyle(1, color);
       // рисуем плитку
       bar(j*size,i*size, (j+1)*size, (i+1)*size);
    }
}

Пример полного решения:

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

// функция выдающая системное время секунды

int sec()
{
time_t t;
struct tm *t_m;
t=time(NULL);
t_m=localtime(&t);
return t_m->tm_sec;
}

main()

{
int i,j;// перменные для циклов
int k=10; // количество плиток
int size;// размер плитки
int color;// цвет плитки

initwindow(600, 600);// инициализируем графическое окно
size=600/k;
// пробегаемся по всем строкам
for (i=0; i<=k; i++)
{
// пробегаемся по всем столбцам
    for (j=0;j<=k;j++)
    {
        // определяем цвет плитки
       color=(rand()+sec())%15+1;
       // задаем цвет плитки
       setfillstyle(1, color);
       // рисуем плитку
       bar(j*size,i*size, (j+1)*size, (i+1)*size);

    }
}
getch();
closegraph();
}

На заметку:

1. Чтобы задать случайное число в Си  в диапазоне от 1 до N-1 необходимо использовать конструкцию

chislo=(rand()+sec())%N+1

Где rand() – стандартная функция выдающая  всегда одну и ту же последовательность разбросанных целых чисел (нужно объявить #include <stdlib.h> )
sec() наша собственная функция , задающая системное время в секундах. Так  как этот параметр достаточно случайный и зависит от времени запуска программы, 
то (rand()+sec()) будет достаточно случайным и непредсказуемым целым числом.
int sec()
{
time_t t;
struct tm *t_m;
t=time(NULL);
t_m=localtime(&t);
return t_m->tm_sec;
}

Чтобы ее использовать, необходимо объявить #include <time.h>
2. Чтобы работать со всеми элементами матрицы (например, отобразить их) необходимо использовать вложенный цикл for Первый цикл (внешний) отвечает за строки, внутренний отвечает за столбцы.

For(i=0; i<количество строк; i++)
{
For(j=0; j<количество столбцов;j++)
{
…Работаем с элементом матрицы  имя матрицы[i][j]…
}

}

Задания для самостоятельной работы:
1. Поменяете размер плитки в исходной программе. Попробуйте сделать  окно прямоугольным
2. напишите программу,  в которой менялось бы заполнение  экрана.
Для этого необходимо использовать еще один внешний цикл for отвечающий за каждое заполнение. После заполнения, 
необходимо будет установить паузу с помощью функции delay(количество миллисекунд).

Пример решения:

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

// функция выдающая системное время секунды

int sec()

{
time_t t;
struct tm *t_m;
t=time(NULL);
t_m=localtime(&t);
return t_m->tm_sec;
}

main()

{

int i,j, l;// перменные для циклов
int k=10; // количество плиток
int size;// размер плитки
int color;// цвет плитки
int num=20;// количество изменений узора
initwindow(600, 600);// инициализируем графическое окно
size=600/k;

// для изменения узора
for(l=1;l<=num;l++)
{
// пробегаемся по всем строкам
for (i=0; i<=k; i++)
{
// пробегаемся по всем столбцам
    for (j=0;j<=k;j++)  

{
        // определяем цвет плитки
       color=(rand()+sec())%15+1;
       // задаем цвет плитки
       setfillstyle(1, color);
       // рисуем плитку
       bar(j*size,i*size, (j+1)*size, (i+1)*size);
   }
}
// пауза
delay(1000);
}
getch();
closegraph();
}

Вернуться к содержанию

Полезно почитать по теме графика в Си
Графика в Си
Графическая программа на Си Узоры концентрическими окружностями
Графическая программа на Си Анимация на Си

Поделиться

 
Комментарии (0)

Нет комментариев. Ваш будет первым!