Узоры. Плитки
Рисование в си графических узоров
Рассмотрим программу на си для рисования повторяющихся графических узоров Программа заполняет экран прямоугольными плитками различного цвета. Цвет плитки определяется случайным образом. При написании программы будут полезны уроки Графика в Си. и Циклы в Си.
Описание алгоритма программы на си для рисования узора
Чтобы цвет каждой плитки определялся случайным образом, мы должны использовать случайные числа в си. Для этого будем использовать функцию, которая определяет системное время в Си в секундах.
#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();
}
Полезно почитать по теме графика в Си
Графика в Си
Графическая программа на Си Узоры концентрическими окружностями
Графическая программа на Си Анимация на Си
Поделиться
Нет комментариев. Ваш будет первым!