Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Generator gradientów, Klasa, PHP 4 i 5
FiDO
post 2.10.2004, 21:15:58
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ł 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 tongue.gif


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
Chewolf
post 2.10.2004, 21:22:58
Post #2





Grupa: Zarejestrowani
Postów: 335
Pomógł: 0
Dołączył: 15.11.2003

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


Spoko ! i nie za dlugi kodzik jak na takie cos (chyba) szkoda tylko ze nazwy kolorow trzeba hexem podawac a nie zwyczajna nazwa np black ... Ale ogólnie jestem pod wrażeniem fajne ...
DOBRA ROBOTA
Go to the top of the page
+Quote Post
FiDO
post 2.10.2004, 22:03:32
Post #3





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%)
-----


A wiesz... mialem to zrobic, ale jakos mi umknelo ...
To jest w sumie tylko kwestia dodania tablicy z odwzorowaniami nazw kolorow na ich kody, wiec malo roboty. Jutro w wolnej chwili sie z tym pobawie.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
DeyV
post 2.10.2004, 22:30:48
Post #4





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




Bardzo ładnie napisane i na dodatek prawie w zgodzie ze standardami winksmiley.jpg

Może okazać się całkiem przydatne.

8,5/10 smile.gif


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
FiDO
post 3.10.2004, 14:32:30
Post #5





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%)
-----


Cytat(DeyV @ 2004-10-02 23:30:48)
Bardzo ładnie napisane i na dodatek prawie w zgodzie ze standardami winksmiley.jpg

Prawie zgodne? Tzn. co jest niezgodne? Pytam zupelnie powaznie, bez zlosliwosci smile.gif

PS. kolory podawane z nazwy juz są... kodu w pierwszym poscie nie zmieniam, ale w linku, ktory podalem jest wersja zaktualizowana.

edit:
@wassago: done smile.gif


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
wassago
post 3.10.2004, 14:57:55
Post #6





Grupa: Przyjaciele php.pl
Postów: 701
Pomógł: 0
Dołączył: 26.06.2002
Skąd: Londyn

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


@FiDO: zmienilem nieco regulamin ( http://forum.php.pl/index.php?act=ST&f=73&...t=0#entry129109 ), prosze sie zapoznac z nim winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
DeyV
post 7.10.2004, 20:06:23
Post #7





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ć 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


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 12:05