Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Generator gradientów, Klasa, PHP 4 i 5
FiDO
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


No to ja bede pierwszy jako, ze mnie tu Bakus przekierował (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

A więc klasa ta służy do generacji kolorów pośrednich między dwoma podanymi kolorami, pomiędzy którymi mogą być dowolne inne kolory pośrednie (np. przejście z bialego do czarnego przez czerwony). Wszystko jest w zasadzie opisane w komentarzach do kodu, łącznie z przykladem uzycia. Nadmienie tylko w razie, gdyby nie bylo to takie oczywiste, ze jak dodamy np. 4 kolory, to poczatkowym jest ten pierwszy, koncowym ostatni dodany, natomiast wszystkie dodane "w srodku" beda kolorami, przez które gradient będzie stopniowo przechodził.
Ilosc kolorow posrednich, ktore chcemy uzyskac (czyli w pewnym sensie dokladnosc czy tez szczegolowosc gradientu) jest podawana przez parametr do metody get() Ilosc ta zawiera kolory podane.. czyli jak np. generujemy gradient z dwoch kolorow w 100 krokach, samych kolorow posrednich (tych co zostaly wygenerowane), bedzie wynosila 98.

Oto i kod:

  1. <?php
  2.  
  3. /**
  4.  * @package ColorGradient
  5.  * @author FiDO <fido@list.pl>
  6.  * @version 0.9.1
  7.  */
  8.  
  9. /**
  10.  * Generuje gradient z jednego podanego koloru do drugiego z mozliwosci
  11.  * ustalenia dowolnej ilosci kolorow posrednich
  12.  *
  13.  * Przykład użycia:
  14.  * <code>
  15.  * <?php
  16.  * 
  17.  * $cGrad = new ColorGradient;
  18.  * // z białego do czarnego przez szary
  19.  * $cGrad->addColors(array('#000000', '#C0C0C0', '#FFFFFF'));
  20.  * // ilosc kroków
  21.  * $kolory = $cGrad->get(100);
  22.  * if ($kolory === false)
  23.  * {
  24.  *     echo \"Za mało kolorów lub liczba kroków mniejsza niż liczba kolorów\";
  25.  * }
  26.  * foreach ($kolory as $kolor)
  27.  * {
  28.  *     echo \"<span style='background: $kolor; width: 5px;'>&nbsp;</span>\";
  29.  * }
  30.  *
  31.  * ?>
  32.  * </code>
  33.  *
  34.  * @package ColorGradient
  35.  * @author FiDO <fido@list.pl>
  36.  * @version 0.9.0
  37.  */
  38. class ColorGradient
  39. {
  40.     /**
  41.      * tablica kolorów, z których generujemy gradient
  42.      *
  43.      * @access private
  44.      */
  45.     var $_aColors = array();
  46.  
  47.     /**
  48.      * zmienna decydujaca o tym, czy zwrócone kolory będa w formacie html (np. #FFFFFF)
  49.      * gdy false, każdy kolor zwracany jest jako tablica składajaca się z 3 elem
  50. ntów,
  51.      * których wartosci oznaczaja kolejno red, green, blue
  52.      * 
  53.      * @access public
  54.      */
  55.     var $return_html = true;
  56.  
  57.     /**
  58.      * Sprawdza poprawnosć koloru w formacie tablicowym (r,g,b)
  59.      * 
  60.      * @access private
  61.      * @return boolean true jesli poprawny, w przeciwnym przypadku false
  62.      */
  63.     function _isColorValid($aColor)
  64.     {
  65.         if (!is_array($aColor) || count($aColor) != 3)
  66.         {
  67.             return false;
  68.         }
  69.         for ($i = 0; $i < 3; $i++)
  70.         {
  71.             if (!is_int($aColor[$i]) || $aColor[$i] > 255 || $aColor[$i] < 0)
  72.             {
  73.                 return false;
  74.             }
  75.         }
  76.         return true;
  77.     }
  78.     /**
  79.      * dodaje pojedynczy kolor do tablicy kolorów
  80.      * 
  81.      * dozwolone sa następujace formaty:
  82.      * string : #FFFFFF
  83.      * string : 255,255,255
  84.      * tablica: (255, 255, 255)
  85.      * (wszystkie w kolejnosci RGB)
  86.      *
  87.      * @access public
  88.      * @param mixed dodawany kolor
  89.      * @return boolean true jesli dodanie się powiodło (kolor jest poprawny)
  90.      */
  91.     function addColor($color)
  92.     {
  93.         // zamiana formatów innych niż tablicowy na tablicowy
  94.  
  95.         // string: 255,255,255
  96.         // białe znaki pomiędzy liczbami a przecinkami dozwolone
  97.         if (@preg_match('#^(d+)s*,s*(d+)s*,s*(d+)$#', $color, $rgb))
  98.         {
  99.             $color = array((int)$rgb[1], (int)$rgb[2], (int)$rgb[3]);
  100.         }
  101.         // string: #FFFFFF
  102.         elseif (@preg_match('/^#[0-9a-f]{6}$/i', $color))
  103.         {
  104.             $color  = array_map(
  105.                         \"hexdec\", 
  106.                         explode(\"n\", wordwrap(substr($color, 1), 2, \"n\", true))
  107.                     );
  108.         }
  109.         // string: black, white, red, etc.
  110.         elseif (is_string($color)) 
  111.         {
  112.             @include 'ColorNames.inc.php';
  113.             if (isset($colorNames[$color]))
  114.             {
  115.                  $color = $colorNames[$color];
  116.             }
  117.         }
  118.  
  119.         // jesli kolor poprawny, dodajemy na koniec tablicy
  120.         if ($this->_isColorValid($color))
  121.         {
  122.             $this->_aColors[] = $color;
  123.             return true;
  124.         }
  125.         return false;
  126.     }
  127.  
  128.     /**
  129.      * dodaje kilka kolorów przekazanych za pomoca tablicy
  130.      * 
  131.      * @access public
  132.      * @param array tablica zawierajaca pojedyncze kolory w dozwolonym formacie
  133.      * @return integer liczba poprawnie dodanych kolorów
  134.      */
  135.     function addColors($colors)
  136.     {
  137.         if (!is_array($colors))
  138.         {
  139.             return 0;
  140.         }
  141.         $added = 0;
  142.         foreach ($colors as $color)
  143.         {
  144.             if ($this->addColor($color))
  145.             {
  146.                 $added++;
  147.             }
  148.         }
  149.         return $added;
  150.     }
  151.  
  152.     /**
  153.      * konwertuje kolor w postaci tablicy na format zgodny z html
  154.      * 
  155.      * array(255,0,255) -> #FF00FF
  156.      *
  157.      * @param array kolor do konwersji
  158.      * @return string kod html koloru
  159.      */
  160.     function _toHex($color)
  161.     {
  162.         if (!$this->return_html)
  163.         {
  164.             return $color;
  165.         }
  166.         // konwersja elementów tablicy na liczbe szesnastkowa 
  167.         $color = array_map('strtoupper', array_map('dechex', $color));
  168.         // dopełnienie zerem liczb jednocyfrowych
  169.         array_walk($color, create_function('&$v', '$v = str_pad($v, 2, \"0\", 0);'));
  170.  
  171.         return '#'. implode('', $color);
  172.     }
  173.  
  174.     /**
  175.      * pobiera tablice kolorów posrednich między dwoma danymi (wyłaczajac dane kolory)
  176.      * 
  177.      * @param integer indeks pierwszego koloru
  178.      * @param integer indeks drugiego koloru
  179.      * @param integer ilosć kolorów posrednich do wygenerowania
  180.      * @access private
  181.      * @return array tablica kolorów posrednich
  182.      */
  183.     function _getGradient($c1idx, $c2idx, $steps)
  184.     {
  185.         // no steps.. no intermediate colors..
  186.         if ($steps == 0)
  187.         {
  188.             return array();
  189.         }
  190.  
  191.         // obliczamy krok dla każdej składowej
  192.         for ($i = 0; $i < 3; $i++) 
  193.         {
  194.             $aStep[$i] = ($this->_aColors[$c2idx][$i] - $this->_aColors[$c1idx][$i]) / ($steps + 1);
  195.         }
  196.  
  197.         $inter = array();
  198.         // generacja kolorów posrednich
  199.         for ($i = 1; $i <= $steps; $i++) 
  200.         {
  201.             for ($j = 0; $j < 3; $j++) 
  202.             {
  203.                 $color[$j] = round($this->_aColors[$c1idx][$j] + $aStep[$j] * $i);
  204.                 // make sure we don't go off beyond limits
  205.                 $color[$j] = ($color[$j] > 255) ? 255: $color[$j];
  206.                 $color[$j] = ($color[$j] < 0  ) ? 0  : $color[$j];
  207.             }
  208.             $inter[] = $color;
  209.         }
  210.  
  211.         return array_map(array(&$this, \"_toHex\"), $inter);
  212.     }
  213.  
  214.     /**
  215.      * zwraca tablice kolorów posrednich pomiędzy dodanymi kolorami
  216.      * 
  217.      * @param integer ilosć kolorów, które ma zawierać gradient
  218.      * @return mixed tablica kolorów lub false gdy niemożliwa generacja
  219.      */
  220.     function get($steps)
  221.     {
  222.         // sprawdzenie czy sa dodane conajmniej 2 kolory oraz czy
  223.         // liczba kroków wynosi conajmniej tyle co liczba kolorów
  224.         if ($steps < count($this->_aColors) || count($this->_aColors) < 2)
  225.         {
  226.             return false;
  227.         }
  228.  
  229.         $nColors = count($this->_aColors);
  230.         // liczbę kolorów posrednich do uzyskania pomniejszamy o liczbę kolorów
  231.         $steps -= $nColors;    
  232.         // obliczenie ile potrzeba kroków do przejscia między każda para kolorów
  233.         // najpierw wszystkim dzielimy po równo
  234.         $step    = array_fill(0, $nColors - 1, (int)($steps / ($nColors - 1) ));
  235.         // jesli zostanie reszta to dodajemy po 1 zaczynajac od poczatku
  236.         for ($i = 0; $i < ($steps % ($nColors - 1)); $i++) 
  237.         {
  238.             $step[$i]++;
  239.         }
  240.  
  241.         $out = array($this->_toHex($this->_aColors[0]));
  242.         for ($i = 0, $n = $nColors - 1; $i < $n; $i++) 
  243.         {
  244.             $inter  = $this->_getGradient($i, $i + 1, $step[$i]);
  245.             $out    = array_merge(
  246.                         $out, 
  247.                         $inter, 
  248.                         array($this->_toHex($this->_aColors[$i + 1]))
  249.                     );
  250.         }
  251.         return $out;
  252.     }
  253. } // end class
  254.  
  255. ?>


Dodatkowo wersja do sciagniecia: http://willow.iie.uz.zgora.pl/~ipatalas/de...lorGradient.zip
(szerokosc TAB'ow w kodzie: 4)

A teraz mozecie krytykowac (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Cytat
Tzn. co jest niezgodne?

ups. Chyba się rozpędziłem. Zapomniałem że najnowsza wersja standardów kodowania, przygotowana w oparciu o wypowiedzi i głosy deweloperów z php.pl nie jest jeszcze oficjalnie wydana, tak więc ciężko już jej od ludzi wymagać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Tak czy inaczej = jestem przekonany o przydatności prefiksów przed nazwami zmiennych (w dotychczasowych standardach są 3 znakowe, ja już teraz zalecam 1 znak, tj. $aTablica, $iLiczba, $fCena itp. w przypadku wszystkich zmiennych z wyjątkiem liczników w pętlach, gdzie to czasem by było odrobine przerostem formy nad treścią.

Warto też by stosować jeden system nazewnistwa. Tj. jeśli nazywasz zmienne wTenSposób, to nie ma chyba potrzeby by nagle pojawiała się taka_zmienna .
Oczywiście są to drobiazgi, ale maja znacznie dla czytelności kodu i być może kiedyś Ci się przydadzą.

pozdrawiam
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 11:13