Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Generowanie palety kolorów
Rysh
post 25.03.2010, 00:49:48
Post #1





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


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.


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 25.03.2010, 03:08:33
Post #2





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


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. }


Ten post edytował sadistic_son 25.03.2010, 03:13:19


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
thek
post 25.03.2010, 08:41:03
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.
Powód edycji: [thek]: Własciwie to nie masz ŻADNEGO pustego przebiegu pętli. Wszystkie Ci kolor zwrócą.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
DiH
post 25.03.2010, 09:18:13
Post #4





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

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


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.

Ten post edytował DiH 25.03.2010, 09:18:40
Go to the top of the page
+Quote Post
thek
post 25.03.2010, 10:07:44
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Rysh
post 25.03.2010, 12:32:40
Post #6





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


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


--------------------
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: 19.07.2025 - 01:38