Aby przedstawić listę obiektów o różnych kolorach w widgecie GWT, musimy uzyskać dynamicznie listę kolorów o tak różnych kolorach jak obiekty. Ponieważ rozmiar Listy może się różnić, musimy być w stanie obliczyć taką Listę kolorów.Jak dynamicznie obliczyć listę kolorów?
Odpowiedz
Inna wersja mojego rozwiązania z zakresów:
List<int> getUniqueColors(int amount) {
final int lowerLimit = 0x10;
final int upperLimit = 0xE0;
final int colorStep = (upperLimit-lowerLimit)/Math.pow(amount,1f/3);
final List<int> colors = new ArrayList<int>(amount);
for (int R = lowerLimit;R < upperLimit; R+=colorStep)
for (int G = lowerLimit;G < upperLimit; G+=colorStep)
for (int B = lowerLimit;B < upperLimit; B+=colorStep) {
if (colors.size() >= amount) { //The calculated step is not very precise, so this safeguard is appropriate
return colors;
} else {
int color = (R<<16)+(G<<8)+(B);
colors.add(color);
}
}
return colors;
}
Ten jest bardziej wyprzedzeniem, gdyż generuje kolory, które różnią się od siebie jak najwięcej (coś jak @aiiobe zrobił).
Ogólnie dzielimy zakres na 3 podzakresy czerwono-zielone i niebieskie, obliczamy, ile kroków potrzebujemy do iteracji każdego z nich (przez zastosowanie pow (zakres, 1f/3)) i iterujemy je.
Biorąc pod uwagę liczbę 3, wygeneruje ona 0x0000B1, 0x00B100, 0x00B1B1
. Dla numeru 10 będzie to: 0x000076, 0x0000EC, 0x007600, 0x007676, 0x0076EC, 0x00EC00, 0x00EC76, 0x00ECEC, 0x760000, 0x760076
Coś takiego, jak sądzę. Bez losowości, oblicza tylko, jakie kroki koloru podjąć i dzieli cały zakres kolorów na te kroki. Jeśli ograniczysz dolny limit - usuniesz zbyt ciemne kolory, a ograniczenie górnej granicy usunie zbyt jasne kolory.
List<Integer> getUniqueColors(int amount) {
final int lowerLimit = 0x101010;
final int upperLimit = 0xE0E0E0;
final int colorStep = (upperLimit-lowerLimit)/amount;
final List<Integer> colors = new ArrayList<Integer>(amount);
for (int i=0;i<amount;i++) {
int color = lowerLimit+colorStep*i;
colors.add(color);
}
return colors;
}
Proszę również zobaczyć moją inną wersję tego rozwiązania na dole. Generuje znacznie lepsze wyniki niż ten, ale jest nieco bardziej złożony. – bezmax
To nawet nie kompiluje. Nie możesz mieć 'List'' 'int' w java. Prawdopodobnie chcesz zmienić to na 'Integer'. – aioobe
Tak, to był błąd literowy. – bezmax
Jeśli dobrze rozumiem twoją sytuację, poszukujesz wielu kolorów, które wyglądają na "tak różne, jak to tylko możliwe"? Chciałbym w tym przypadku zasugerować, że zmienisz wartość barwy (dwa czerwone kolory o nieco innej jasności nie będą wyglądać inaczej), więc otrzymasz coś w rodzaju "tęczowej palety":
Można to osiągnąć za pomocą następujący kod:
Color[] cols = new Color[n];
for (int i = 0; i < n; i++)
cols[i] = Color.getHSBColor((float) i/n, 1, 1);
przykładem wykorzystania z a zrzuty ekranu poniżej:
import java.awt.*;
public class TestComponent extends JPanel {
int numCols = 6;
public void paint(Graphics g) {
float h = 0, dh = (float) getHeight()/numCols;
Color[] cols = getDifferentColors(numCols);
for (int i = 0; i < numCols; i++) {
g.setColor(cols[i]);
g.fillRect(0, (int) h, getWidth(), (int) (h += dh));
}
}
public static Color[] getDifferentColors(int n) {
Color[] cols = new Color[n];
for (int i = 0; i < n; i++)
cols[i] = Color.getHSBColor((float) i/n, 1, 1);
return cols;
}
public static void main(String s[]) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TestComponent());
f.setSize(200, 200);
f.setVisible(true);
}
}
numCols = 6
i numCols = 40
daje followi NG dwa screeny:
Jeśli potrzebujesz jak ponad 30 kolorach, można oczywiście zmienić jasność i być może nasycenia, jak również i mieć, na przykład, 10 ciemne kolory, 10 półcieni kolory i 10 jasnych kolorów.
- 1. Jak obliczyć gradient czterech kolorów?
- 2. Jak zrobić PdfPTable dynamicznie obliczyć szerokość kolumny
- 3. jak obliczyć różnicę kolorów w procentach za mniej
- 4. Jak generować nieuporządkowaną listę dynamicznie w asp.net?
- 5. Obliczyć widoczną różnicę w kolorze między dwiema wartościami kolorów HSI
- 6. Jak obliczyć sposoby malowania drzewa?
- 7. Jak dynamicznie ustawiać listę nagłówków w Retroficie 2 (Android)
- 8. Jak utworzyć listę rozwijaną dynamicznie za pomocą jQuery?
- 9. Jak mogę dynamicznie utworzyć listę nieuporządkowaną w JavaScript?
- 10. Jak utworzyć listę pól wyboru dynamicznie za pomocą javascript
- 11. Jak obliczyć rozmiar fragmentu tekstu w Win2D
- 12. Jak obliczyć entropię wykresu?
- 13. Jak obliczyć wyniki?
- 14. Jak obliczyć czas trwania?
- 15. Jak obliczyć współwystępkę słowa
- 16. Jak obliczyć współczynnik klikalności
- 17. Jak obliczyć sumę kontrolną
- 18. Jak obliczyć centroid 3D?
- 19. Jak obliczyć szerokość czcionki?
- 20. Jak obliczyć GMSCamera zoom
- 21. Jak obliczyć FAT
- 22. FPS jak to obliczyć?
- 23. Wiersz tabeli - Podawanie alternatywnych kolorów
- 24. Jak przekonwertować listę obiektów na listę interfejsów?
- 25. Jak ustawić selektor kolorów otwarty za pomocą wprowadzania kolorów HTML5?
- 26. Jak obliczyć największą liczbę powtórzeń na liście?
- 27. Powtarzanie kolorów
- 28. Jak obliczyć dowolną moc/root?
- 29. Jak obliczyć powtarzające się cyfry?
- 30. Jak obliczyć nachylenie w SQL
Jeśli chcesz pominąć szare kolory - potrzebne będą dodatkowe obliczenia. Będziesz potrzebował czegoś 'if (r == g == b), a następnie kontynuacji' w pętli, a także będziesz musiał zwiększyć 'amount' o' Math.pow (ilość, 1f/3) '(aby utworzyć pomijanie szarych kolorów). – bezmax
lub możesz trzymać się różnych odcieni;) – aioobe
Tak, ale nie jestem dobry z HSV, więc zaproponowałem pierwszą rzecz, która przyszła mi do głowy. – bezmax