Pull to refresh

Функция «ковра»

Reading time 2 min
Views 8.1K
Подшефные ребята осваивают вэб-программирование, в частности, PHP.
Одной из первых задач на освоение таблиц <table> они получают задание отрисовать на PHP таблицу умножения, эдак 25х25.
Далее начинаются простые «навороты» — например, выкрасить в полученной таблице клетки с четными числами. Как выяснилось, наворотами можно наслаждаться часами.


Ожидается увидеть критерием выбора требующей покраски ячейки что-то вроде

...
if (($x * $y) % 2 == 0) $color = "red";
else $color = "white";
...

на выходе получим что-то вроде


Забавную раскраску ячеек можно получить при замене 2 на другое число.
Вот — для %4 (оставлю %, что бы подчеркнуть, что используется проверка остатка от деления)


Вот — для %5


Для простых чисел мы получаем «клетку» с размером, соответствующим числу, для составных чисел — достаточно забавный паттерн.
Например, для %21


Для четных чисел паттерн старательно пытается из себя изображать окружность, а если быть точным — концентрические окружности — например для %24


Изображение растянуто по горизонтали — т.к. все-таки числа чем дальше, тем большое.

Становится понятно, что сама таблица умножения уже стала менее интересна, поэтому будем рисовать изображение, в котором 1 пиксель будет соответствовать одной клетке нашей таблицы, ну а цвет — соответствию выбранному условию.
При этом значительно можно увеличить размер таблицы:
Для примера - %720 (6!=1*2*3*4*5*6)



А что если отсекать в условии не по критерию деления нацело, а по критерию остатка, не превышающего некоторого значения?
так выглядит ($x*$y)%720 < 72



Уже похоже на ковер. Но для большего сходства придется выполнять вот такую операцию:
((($x * $y) % K1) % K2)… %Kn)
Логично, что коэффициенты должны убывать при возрастании n, иначе проку от операции особого не будет — ряд выродится до более короткого.

так выглядит ($x*$y)%677 %255 %71 < 13



Конечно же, ковер должен быть цветным. Тут главное — не переборщить с количеством цветов.
В результате примерно такая поделка получилась:
Некоторое количество кода на PHP
<?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 пикселя.
Tags:
Hubs:
+56
Comments 6
Comments Comments 6

Articles