Подшефные ребята осваивают вэб-программирование, в частности, PHP.
Одной из первых задач на освоение таблиц <table> они получают задание отрисовать на PHP таблицу умножения, эдак 25х25.
Далее начинаются простые «навороты» — например, выкрасить в полученной таблице клетки с четными числами. Как выяснилось, наворотами можно наслаждаться часами.
Ожидается увидеть критерием выбора требующей покраски ячейки что-то вроде
...
if (($x * $y) % 2 == 0) $color = "red";
else $color = "white";
...
на выходе получим что-то вроде
Забавную раскраску ячеек можно получить при замене 2 на другое число.
Вот — для %4 (оставлю %, что бы подчеркнуть, что используется проверка остатка от деления)
Вот — для %5
Для простых чисел мы получаем «клетку» с размером, соответствующим числу, для составных чисел — достаточно забавный паттерн.
Например, для %21
Для четных чисел паттерн старательно пытается из себя изображать окружность, а если быть точным — концентрические окружности — например для %24
Изображение растянуто по горизонтали — т.к. все-таки числа чем дальше, тем большое.
Становится понятно, что сама таблица умножения уже стала менее интересна, поэтому будем рисовать изображение, в котором 1 пиксель будет соответствовать одной клетке нашей таблицы, ну а цвет — соответствию выбранному условию.
При этом значительно можно увеличить размер таблицы:
А что если отсекать в условии не по критерию деления нацело, а по критерию остатка, не превышающего некоторого значения?
Уже похоже на ковер. Но для большего сходства придется выполнять вот такую операцию:
((($x * $y) % K1) % K2)… %Kn)
Логично, что коэффициенты должны убывать при возрастании n, иначе проку от операции особого не будет — ряд выродится до более короткого.
Конечно же, ковер должен быть цветным. Тут главное — не переборщить с количеством цветов.
В результате примерно такая поделка получилась:
<?php
$max=rand(500,800);
$k1=$max;
$k2=rand($k1/10,$k1);
$k3=rand($k2/10,$k2);
$k4=rand($k3/10,$k3);
header("Content-type: image/png");
$image = imagecreatetruecolor($max,$max+20);
$black = imagecolorallocate($image,0,0,0);
$cr=rand(0,255);
$cg=rand(0,255);
$cb=rand(0,255);
$dr=0; $dg=0; $db=0;
for ($i=0; $i<$k3;++$i)
{
$cl[$i]=imagecolorallocate($image,rand(0,255),rand(0,255), rand(0,255));
}
for ($y=0; $y<=$max; $y++)
{
for ($x=0; $x<=$max; $x++)
{
$mux = $x*$y;
$rest = $mux%$k1 %$k2 %$k3 %$k4;
imagesetpixel($image,$x,$y,$cl[$rest%5]);
}
}
imagestring($image,3,20,$max,"K1=$k1, K2=$k2, K3=$k3, K4=$k4",imagecolorallocate($image,255,0,0));
imagepng($image);
который рисует ковры:
Особенно хорош ковер при Gaussian Blur примерно на 2.5 пикселя.
Автор: xx3l