...

воскресенье, 17 ноября 2013 г.

[Из песочницы] Функция «ковра»

Подшефные ребята осваивают вэб-программирование, в частности, PHP.

Одной из первых задач на освоение таблиц они получают задание отрисовать на 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 пикселя.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. FiveFilters.org recommends: March Against Mainstream Media (More info).


Комментариев нет:

Отправить комментарий