Java Цвет по возрасту - PullRequest
       2

Java Цвет по возрасту

0 голосов
/ 18 марта 2012

Я пишу небольшое приложение, которое отображает некоторую графику, и только сейчас я пытаюсь изменить цвет в зависимости от возраста Объекта (сохраненный с помощью System.currentTimeMillis()), чтобы самые старые были синим, а новейшие Объекты отображалисьКрасный или около того.Кто-нибудь знает алгоритм Vel Ita (или около того)?

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Предполагая, что вы хотите, чтобы ваш самый старый объект был синим, а ваш самый новый объект - красным, и вы знаете все объекты "возраст" (назовем его timestamp)

// mesure the difference in age of the newest and oldest objects
double agediff = newest.timestamp - oldest.timestamp;

// for any given object :
// 1. color ratio from 0.0=old to 1.0=new
double ratio = (someObject.timestamp - oldest.timestamp) / ageDiff;

// 2. get red and blue values
int red = 255 - (255 * ratio);
int blue = 255 * ratio;

// 3. construct Color
Color objectColor = new Color(red, 0, blue);

Если вы хотите масштабировать количество оттенков, которые хотите отобразить, просто округлите соотношение в соответствии с шагом.Например:

// the maximum number of shades between blue and red
int step = 4;    // the value cannot be 1 (otherwise use a Color constant!)

double stepScale = 256 / (step - 1);
double halfStepScale = stepScale / 2;
ratio = Math.ceil((int) ((ratio * 256 + halfStepScale) / stepScale) * stepScale) / 256d;

Или, если вместо этого вы хотите масштабировать от новейшего до максимального значения TTL (например, 60 seconds или 60000 millis), просто замените oldest.timestamp на этоЗначение и измените ваш алгоритм, чтобы включить проверку переполнения:

// our "oldest" timestamp is now pre-defined:
long oldestTs = newest.timestamp - ttlTimestamp;  // ttlTimestamp = 60000;
// mesure the difference in age of the newest and the TTL (ex: 60000)
double agediff = newest.timestamp - oldestTs;

// for any given object :
// 1. color ratio from 0.0=old to 1.0=new
double ratio = (someObject.timestamp - oldestTs) / ageDiff;

if (ratio < 0.0) ratio = 0.0;   // prevent overflow

// etc.

** Редактировать **

Если вы хотите другой градиент, чем синий / красный, вы можете иметь:

// green=new, yellow=old
new Color(1f - (float) ratio, 1f, 0f);
// yellow=new, green=old
new Color((float) ratio, 1f, 0f);
// green=new, red=old
new Color(1f - (float) ratio, (float) ratio, 0f);

// etc.
0 голосов
/ 18 марта 2012

у вас может быть мера, основанная на возрасте каждого объекта, в миллисекундах, часах или, возможно, пользовательская мера, основанная на вышеприведенном, то есть все, что <1 час - 1 и т. Д. </p>

Это дает вам меру. Теперь вы можете перебирать объекты, чтобы найти текущие пределы (9 минут и максимум), или вы можете даже делать это, вычисляя меры: каждый раз, когда происходит меньшее, чем минимум, сохраняйте новые мин и т. Д.

Теперь у вас сейчас спред. Последнее, что нужно применить цвета. Допустим, наши объекты находятся в диапазоне от 10 мс до 1000 мс. Вы можете разбить его на 3 области: 10-100, 100-500, 500-1000, например, и применять цвета на основе этого.

0 голосов
/ 18 марта 2012

Цветовой цвет = возраст> 5280?Color.RED: возраст> 1000?Color.BLACK: возраст> 30?Color.YouGetTheIdea

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...