БлогNot. Цветные циклы...

Цветные циклы...

Если Вы когда нибудь в качестве мелкого шныря ночальнега распределяли учебную производственную нагрузку, то знаете, что это такое. Поскольку в последние годы речи о том, чтоб заработать больше, не идёт, нужно сразу ставить правильную цель - как потерять меньше, ну или хотя бы как меньше работать за те же деньги. Потратив пару дней на решение заведомо некорректной из-за огромного количества бездельников антагонистических противоречий задачу, я всё же успевал в промежутках вести курсы по PHP, вот там-то и оказывалось время чего-нить поцарапать для отдыха.

В общем, рассматриваемая задача состояла в том, чтобы сделать на PHP циклы, которые программно можно менять местами, то есть, чтобы

for ($i=0; $i<$n; $i++)
for ($j=0; $j<$m; $j++)
for ($k=0; $k<$l; $k++) {
 echo "<br>$i,$j,$k";
}

могло выполняться и как

for ($j=0; $j<$m; $j++)
for ($i=0; $i<$n; $i++)
for ($k=0; $k<$l; $k++) {
 echo "<br>$i,$j,$k";
}

и так далее во всех шести вариантах перестановок. Самое очевидное решение - задать в какой-то строке нужный порядок циклов и использовать переменную переменных, как-то так:

$n=$m=$l=5;
$order='kji';
$i1=substr($order,0,1);
$j1=substr($order,1,1);
$k1=substr($order,2,1);
for ($$i1=0; $$i1<$n; $$i1++)
for ($$j1=0; $$j1<$m; $$j1++)
for ($$k1=0; $$k1<$l; $$k1++) {
 echo "<br>$i,$j,$k";
}

Этим следовало и ограничиться, но мне вдруг вспомнилась цветовая палитра Netscape, она же безопасные цвета, ведь если их все рисовать, тоже понадобится тройной цикл для 3 цветовых компонент! Так что пример получился гораздо более громоздким и за полчаса перерос в небольшой скрипт.

 Netscape Color Palette Map - скрипт в работе

 Скачать исходники можно на странице скрипта

Параметр rgb, передаваемый только через URL (методом GET), задаёт порядок циклов по красной, зелёной и синей цветовым компонентам, он может принимать значения rgb, rbg, brg, grb, bgr и gbr :)

Вот как можно перевести интенсивности красного, зелёного и синего, заданные десятичными числами, в строку формата #RRGGBB:

function colorcode ($r,$g,$b) { 
 //Десятичные интенсивности красного, зелёного и синего - в цвет #RRGGBB
 return '#'.($r<10?'0':'').strtoupper(dechex($r)).($g<10?'0':'').
  strtoupper(dechex($g)).($b<10?'0':'').strtoupper(dechex($b));
}

Эта функция в скрипте не пригодилась, так как у нас существенен порядок циклов, передаваемый параметром с именем $rgb. Например, если $rgb='bgr', то при выводе строк таблицы быстрее всего меняется красный цвет, затем зелёный, а в последнюю очередь синий. Неуместны теперь и параметры $r,$g,$b, заменим их на текущие счётчики тройного цикла $i,$j,$k:

function colorcode ($i,$j,$k,$rgb) { 
 //Используем другую функцию, чтобы можно было выводить цвета в разном порядке
 $cols = array ('r'=>'00','g'=>'00','b'=>'00');
 $vars = array ($i, $j, $k);
 for ($n=0; $n<3; $n++) {
  $c=substr($rgb,$n,1);
  $cols[$c]=($vars[$n]<10?'0':'').strtoupper(dechex($vars[$n]));
 }
 return '#'.implode('',$cols);
}

Второй нюанс - текст в цветной ячейке таблицы выводится шрифтом, противоположным по коду цвету фона ячейки. Первое пришедшее в голову решение для инверсии цвета, как оказалось, не работает!

function invertcode ($c) {
 return str_replace ( 
  array ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'),
  array ('F','E','D','C','B','A','9','8','7','6','5','4','3','2','1','0'),
  $c);
}
//Эта версия неверна #6633FF => #663300 
//Если поменять массивы местами, будет #6633FF => #99CCFF

Похоже, str_replace проходит по массивам поиска и замены неоднократно?

А вот через strtr всё сработало нормально:

function invertcode ($c) { 
 //Правильная версия функции инверсии кода цвета #RRGGBB
 // #6633FF => #99CC00
 return strtr ($c,array (
  'F'=>'0', 'E'=>'1', 'D'=>'2', 'C'=>'3',
  'B'=>'4', 'A'=>'5', '9'=>'6', '8'=>'7',
  '7'=>'8', '6'=>'9', '5'=>'A', '4'=>'B',
  '3'=>'C', '2'=>'D', '1'=>'E', '0'=>'F'));
}

Ну и сама функция построения цветовой таблицы с переменным порядком цветов получилась вот такая:

function colortab ($rgb) {
 echo '<div align="center"><table align="center" cellpadding="2" cellspacing="0"><tr>'."\n";
 $n=$r=0;
 for ($i=0; $i<257; $i+=51)
 for ($j=0; $j<257; $j+=51)
 for ($k=0; $k<257; $k+=51)
 {
  $c=colorcode($i,$j,$k,$rgb);
  echo '<td bgcolor="'.$c.'" align="center" valign="middle"><font color="'.invertcode($c).'">'.$c.'</font></td>'."\n";
  $n++;
  if ($n and !($n%6)) echo '<td width="6"></td>'."\n";
  if ($n and !($n%12)) { 
   echo '</tr><tr>'."\n"; 
   $r++; 
   if ($r and !($r%6)) echo '<tr><td colspan="13" height="6"></td></tr>';
  }
 }
 echo '</tr></table></div>'."\n";
}

Штучка бесполезная, но пусть будет.

В общем, на этом рабочую неделю пора заканчивать, надо и о выпивке доме ребёнке подумать. А то мой рабочий день в пн-вт длился часов по 12, но ведь гордиться тут нечем - дурак тем и отличается, что всё время работает, так что думать ему некогда.

25.04.2012, 11:52 [11459 просмотров]


теги: программирование ошибка цвет личное php

К этой статье пока нет комментариев, Ваш будет первым