2013-10-07 9 views
-1

Я должен дать вариацию из 20 разных цветов для фигур, которые у меня есть в ArrayList. Я не уверен, как это сделать. Я думал о том, чтобы добавить их в массив, но я не уверен, как это работает? Может кто-нибудь объяснить это мне и намекнуть/указать мне в правильном направлении мышления?Создание случайных цветов

+0

Как добавить вещи в arraylists? Или как использовать случайные числа? –

+0

Собственно оба. Можно ли использовать случайные числа для генерации другого цвета каждый раз для каждой фигуры, которая находится в моем массиве randomShape? –

+0

Дайте ему понять, что классы ArrayList и Random имеют довольно понятные методы (.add и .nextInt() должны пригодиться), сообщите нам, если у вас возникнут проблемы –

ответ

0

создать список цветов, а затем установить его на ваши формы, как этот

for(Shape myShape : myShapeList){ 

int randomColor = (int)(Math.random()*myColorList.size()); 

myShape.setColor(myColorList.get(randomColor)); 


} 
+0

Но как мне создать список цветов? Помимо основных цветов я не знаю, как создать до 20 различных цветов –

+0

вы используете java.awt.Color? –

+0

Да, я. Я использую java.awt. *; –

1

Это немного сложно, потому что смысл отчетливых и случайных плохо определен.

Что касается компьютера, то новый цвет (0xFF000000) и новый цвет (0xFF000001) - это разные цвета, но людям будет трудно определить эти два. Они выглядят одинаково: черные.

Также им нужно быть действительно random? Если это так, то подход будет заключаться в создании списка и цикла до тех пор, пока вы не создадите нужный подсчет цветов, проверяя, что только что созданный случайный цвет достаточно отличается от всех цветов, созданных до сих пор, чтобы быть заметными человеческим глазом:

Random generator = new Random(); 
List<Color> colors = new ArrayList<>(); 
while (list.size() < numberDesired) { 
    Color randomColor = new Color(generator.nextInt(), false); 
    // check each color in list against list 
    boolean isDisinct = true; 
    for (Color existingColor : colors) { 
     isDistinct &= isDistinct(existingColor, randomColor); 
    } 
    if (isDistintc) { 
     colors.add(randomColor); 
    } 
} 
return colors; 

Метод isDistinct (Цвет, Цвет) может сложным образом реализовать, так как он должен учитывать свойства человеческого глаза.

На самом деле проще просто предопределить 20 выбранных вручную цветов и просто взять столько из них, сколько потребуется. Цвета не будут истинно случайными, но в большинстве случаев тот достаточно хорошо:

static List<Color> COLORS = new ArrayList<>(); 
static 
    COLORS.add(Color.WHITE); 
    COLORS.add(Color.RED); 
    ... // 18 more colors 
} 

public List<Color> getColors(int count) { 
    List<Color> result = new ArrayList<>(count); 
    for (int i=0; i<count; ++i) 
     result.add(COLORS.get(i)); 
    return result; 
} 
0

Для того, чтобы случайный цвета, вы хотите иметь случайное число для каждого из красных, зеленых и синих компонентов цвета. В классе Color вы можете указать значение от 0 до 255 для каждого из трех компонентов, но это даст вам такую ​​тонкую гранулярность цвета, что вы можете получить некоторые цвета, которые выглядят идентичными большинству людей, но на самом деле другой. Поэтому вы можете ограничить каждое из чисел кратным 5, например, в диапазоне от 0 до 255. Это даст вам 52 разных значения для каждого канала, в общей сложности около 140 000 возможных цветов.

Таким образом, у вас может быть такой способ, чтобы дать вам ваши цвета.

public Color makeRandomColor() { 
    int red = 5 * (int)(Math.random() * 52); 
    int green = 5 * (int)(Math.random() * 52); 
    int blue = 5 * (int)(Math.random() * 52); 
    return new Color(red, green, blue); 
} 

Здесь Math.random() дает значение с плавающей запятой, что меньше, чем один. Умножение на 52 делает его меньше 52. Лист (int) округляет его, поэтому он заканчивается как целое число от 0 до 51. И наконец, умножение на 5 приводит его в диапазон от 0 до 255, что и нужно. Этот способ гарантирует, что каждый компонент будет кратным 5, так что вы не получите цветов, которые слишком близко друг к другу.

Следующим трюком является вызов этого метода для каждой формы, к которой вы хотите применить цвет. Я не совсем уверен, какие методы у вас есть в классе Shape для применения цветов, но если у вас есть метод setColor, ваш код может выглядеть примерно так.

for(Shape eachShape : shapeList) { 
    eachShape.setColor(makeRandomColor()); 
} 

Прошу немного поэкспериментировать. Вы можете найти, например, что у вас слишком много темных цветов - темные темные серые и темные коричневые оттенки, которые не дают вам визуального эффекта, который вы хотите.Если это окажется так, вы могли бы добавить какую-нибудь причудливую математику к методу makeRandomColor(), так что это скорее приведет к увеличению числа номеров для каждого компонента, чем к более низким. Это даст вам яркие цвета.

Но я надеюсь, что то, что я вам дал, помогает вам начать работу.

Смежные вопросы