Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Generowanie palety kolorów
Forum PHP.pl > Forum > Przedszkole
Rysh
Zachciało mi się w moim projekcie przypisać każdemu użytkownikowi unikatowy kolor, więc postanowiłem wygenerować po 2-3 odcienie z każdego koloru. Niestety coś mi nie idzie, a nie odpuszczę do póki nie zrobię winksmiley.jpg Kolory są wyświetlane w systemie 16stkowym więc powstał mi oto taki kodzik... Niestety generuje on po 16 odcieni każdego koloru, a ja chce tylko raptem po 2-3 z każdego. Potrzebuje jakiejś wskazówki winksmiley.jpg
  1. for ($red = 0 ; $red <= 255 ; $red += 16) {
  2. for ($blue = 0 ; $blue <= 255 ; $blue += 16) {
  3. for ($green = 0 ; $green <= 255 ; $green += 16) {
  4. $i++;
  5. if (($i % 16) == 0) {
  6. $kolor[] = dechex($red) ."". dechex($blue) ."". dechex($green);
  7. echo "<font color=\"". dechex($red),dechex($blue),dechex($green) ."\">KOLOR: ". dechex($red),dechex($blue),dechex($green)."</font><br />";
  8. }
  9. }
  10. }
  11. }

Pozdrawiam Rysh.
sadistic_son
Coś takiego mi wyszło:
  1. for ($red = 0 ; $red <= 255 ; $red += 32) {
  2. $i++;
  3. if (($i % 2) == 0) {
  4. for ($blue = 0 ; $blue <= 255 ; $blue += 32) {
  5. $i++;
  6. if (($i % 2) == 0) {
  7. for ($green = 0 ; $green <= 255 ; $green += 32) {
  8. $i++;
  9. if (($i % 2) == 0) {
  10. $kolor[] = dechex($red) ."". dechex($blue) ."". dechex($green);
  11. echo "<b><font color=\"". dechex($red),dechex($blue),dechex($green) ."\">KOLOR: ". dechex($red),dechex($blue),dechex($green)."</font></b><br />";
  12. }}}
  13. }
  14. }
  15. }
thek
I po co tak nadmiarowo kombinować? Pomyśl wpierw ile około chcesz tych kolorów jako liczbę będąca sześcianem liczby naturalnej. czyli masz do wyboru:
1 -> 1
2 -> 8
3 -> 27
4 -> 64
5 -> 125
I gdy już wybierzesz to na tyle podziel 256. Przykład? Chcę mieć około 125, więc biorę i zaokrąglam w górę ceil(256/5) = ceil(51.2) = 52
  1. for ($red = 0 ; $red < 256 ; $red += 52) {
  2. for ($blue = 0 ; $blue < 256 ; $blue += 52) {
  3. for ($green = 0 ; $green < 256 ; $green += 52) {
  4. $kolor[] = dechex($red) ."". dechex($blue) ."". dechex($green);
  5. echo "<font color=\"". dechex($red),dechex($blue),dechex($green) ."\">KOLOR: ". dechex($red),dechex($blue),dechex($green)."</font><br />";
  6. }
  7. }
  8. }
Zero modulo, kombinowania wielkiego i minimum ilości pustych przebiegów pętli. Tylko dokładnie tyle ile trzeba.
DiH
Proponowałbym jednak
  1. for ($red = 0 ; $red < 256 ; $red += 51)
Choćby z tego względu, że otrzymasz w ten sposób podstawową/bezpieczną tabelę kolorów. Niby nie ma to większego znaczenia, ale przynajmniej wiesz, że czerwony, to czerwony, ale nie kolor o 1 pkt rgb jaśniejszy, a przy konwersji na hex wyjdą ładne liczby.
thek
Ależ moja także jest bezpieczna smile.gif Zauważ, że możliwe do przyjęcia wartości to 0, 52, 104, 156, 208 smile.gif Potem warunek nie jest spełniany więc jedyne co się dzieje w tych pętlach to mieszanie powyższych kombinacji. Całość nie ucieknie poza wartości 256, bo warunek pętli nie dopuści do 260 tylko zakończy pętlę. Zwróć też uwagę, że chcąc, nie chcąc jesteśmy zmuszani do zaokrągleń. czy w dół, czy w górę to kwestia uzgodnienia, ale to pierwsze zwiększa liczbę dostępnych kolorów do (n+1)^3 czyli mamy wtedy nie 5^3 = 125, ale 6^3 = 216 smile.gif Owszem, kolory są wtedy pełniejsze i pozostaje w sumie to do wyboru użytkownika co wybierze. Tak czy inaczej ucieczka od liczenia modulo z $i to likwidacja ogromnej ilości pustych przejść.

EDIT: A jedyne bezpieczne to tak naprawdę potęgi 2 mniejsze lub równe 256, czyli: 2, 4, 8, 16, 32, 64, 128, 256 ze wskazaniem na 2, 4, 8 smile.gif Jedyne naprawdę bezpieczne palety to posiadające do 256 kolorów, co dość skutecznie ogranicza skalę barwną.
Rysh
Dzięki thek, prosiłem podpowiedź smile.gif Wystarczyła by pierwsza część posta tongue.gif W każdym razie Dzięki smile.gif

Z początku robiłem pętle od 0 do 16kk i skok co 56k itp. Jednak efekt był podobny jak ten z pierwszego posta. Potem przypomniało mi się że paleta kolorów składa się z 3 kolorów (r, b, g) każdy kolor może przyjąć wartość od 0 do 255, jednak nie było pomysłu jak ominąć powtórzenia winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.