Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie w MySQL
Forum PHP.pl > Forum > Przedszkole
-michu-
Witam,
mam tabele z kolorami kolorami w RGB (kolumna R, kolumna G, kolumna cool.gif, chce je wyświetlić tak żeby kolor kolejnych rekordów przechodził płynnie. Czy jest sposób zeby zrobic sortowanie ktre warunkuja te 3 pola?
dr_bonzo
W ogole ciezko to zrobic
1. musisz wybrac kolor od ktorego zaczniesz
2. potem kolejny kolor (z pozostalych) ktory najmniej sie rozni (np. suma roznic skladowych kolorow do kwadratu, miedzy dwoma kolorami)
3. itd.
nevt
jak wspomniał DR boznzo - jest to skomplikowane zagadnienie... popatrz na układy wzroców kolorów w różnych systemach (PANTONE, RAL itp.)... wydaje mi się niemożliwe ułożenie funkcji sortującej działającej poprawnie z każdym możliwym zestawem barw, bo oko ludzkie jest bardzo czułym i nieliniowym detektorem. Jeżeli ta tabela ma sensowne rozmiary (kilkaset do kilku tysięcy wpisów) - to najprostszym i najskuteczniejszym rozwiązaniem będzie dodanie do bazy kolumny nr_koloru i sortowanie wg niej. a wartości nr_koloru ustalić na podstawie przybliżeń do któregoś systemu wzorców palet...
erix
Może się przyda.
http://www.phpclasses.org/browse/package/1410.html
dr_bonzo
erix: ani troche

  1. <?php
  2. // sortuje kolory wg podobienstwa
  3. $colors = generateColors( 100 );
  4. $colorsx = array(
  5. array( 0, 0, 0 ),
  6. array( 20, 20, 20 ),
  7. array( 30, 30, 30 ),
  8. array( 40, 40, 40 ),
  9. array( 50, 50, 50 ),
  10. array( 60, 60, 60 ),
  11. array( 0, 0, 50 )
  12. );
  13. $sortedColors = sortColors( $colors );
  14. printColors( $sortedColors );
  15.  
  16. function generateColors( $n )
  17. {
  18. $min = 0;
  19. $max = 255;
  20. $colors = array();
  21. for ( $i = 0; $i < $n; $i++ )
  22. {
  23. $color = array();
  24. $color[] = rand( $min, $max );
  25. $color[] = rand( $min, $max );
  26. $color[] = rand( $min, $max );
  27.  
  28. $colors[] = $color;
  29. }
  30. return $colors;
  31. }
  32.  
  33. function sortColors( $colors )
  34. {
  35. $sorted = array();
  36. $sorted[] = array_pop( $colors );
  37. while ( ! empty( $colors ) )
  38. {
  39. // last color
  40. $last = end( $sorted );
  41.  
  42. // find closest one
  43. $nextIndex = findClosest( $colors, $last );
  44. $next = $colors[ $nextIndex ];
  45. // remove it from colors
  46. unset( $colors[ $nextIndex ] );
  47.  
  48. // add to sorted colors
  49. $sorted[] = $next;
  50. }
  51. return $sorted;
  52. }
  53.  
  54. function findClosest( $colors, $c )
  55. {
  56. // first as best
  57. $best = reset( $colors );
  58. $bestIndex = key( $colors );
  59. $bestDifference = calculateDifference( $c, $best );
  60. // search better
  61. foreach ( $colors as $i => $v )
  62. {
  63. $newDiff = calculateDifference( $c, $v );
  64. if ( $newDiff < $bestDifference )
  65. {
  66. $best = $v;
  67. $bestIndex = $i;
  68. $bestDifference = $newDiff;
  69. }
  70. }
  71. return $bestIndex;
  72. }
  73.  
  74.  
  75. function calculateDifference( $from, $to )
  76. {
  77. $sum = 0;
  78. $pow = 10;
  79. $sum += pow( $from[0] - $to[0], $pow );
  80. $sum += pow( $from[1] - $to[1], $pow );
  81. $sum += pow( $from[2] - $to[2], $pow );
  82. return $sum;
  83. }
  84. function printColors( $colors )
  85. {
  86. foreach ( $colors as $color )
  87. {
  88. printf( '<div style="background-color: rgb( %d, %d, %d ); width: 200px; height: 5px;"></div>', $color[0], $color[1], $color[2] );
  89. }
  90. }
  91.  
  92. ?>


co wy na to? smile.gif
nevt
tylko tyle, że podobieństwo współrzędnych w przestrzeni barw RGB (lub innego modelu) nie przekłada się wprost na podobieństwo odcieni barw ocenianych subiektywnie przez obserwatora...
trochę wiem na ten temat, bo wałkowałem go przez pół roku pisząc prace dyplomową na temat transformacji przestrzeni barw w zastosowaniach informatycznych...
na przykład: prawie każdy powie ci, że kolor jasno zielony (#8f8) jest bliższy ciemno zielonemu (#080) niż np. para szaro-zielony (696) i szaro-niebieski (#669) - a twoja funkcja zadziała odwrotnie bo ostania para jest położona bliżej siebie w przestrzeni RGB...
i to jest jeden z powodów powstania systemów palet wzorców barw... gdzie kolory ułożone są w sekwencje wg. subiektywnej oceny odcienia barwy a nie wartości RGB czy CMYK
dr_bonzo
nevt: no ok, i ta tabela slownikowa z definicja kolorow to chyba najoczywistsze/prostsze rozwiazanie - tylko 16mln rekordow? :/

Moje rozwiazanie oczywiscie nie jest idealne, choc kolory sie ladnie ukladaja, to np. grupe czerwonych mozesz miec kilka razy, a na samym koncu dodawane sa kolory bardzo odlegle "kolorystycznie" od ostatniego.
nevt
dr_bonzo - twoje rozwiązanie jest bardzo dobre - wypowiedzialem się tak szczegółowo tylko dlatego, że kolega nie określił, do czego potrzebne mu takie sortowanie... bo jeśli do np. aranżacji kolorów dla sklepu z farbami - to zdecydowanie powinien oprzec się o palety a nie RGB próbek...
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.