2012-03-18 4 views
0

私はいくつかのグラフィックスを表示する小さなアプリケーションを書いています、そして今、私はオブジェクトの年齢に応じて色を変更しようとしています(System.currentTimeMillis()経由で保存される)赤く表示されます。誰かアルゴリズムを知っていますか?年齢によってJavaの色

+0

このうちどの部分に問題がありますか? –

+0

実際にすべてのものが...:D私は私の計算アルゴリズムからどのように私が始めなければならないのか分かりません... – jhbruhn

+0

チェーンをつけて、角かっこで色を選ぶことができますか? > 1時間、> 3時間、> 5280時間など? – Java42

答えて

1

あなた最古オブジェクトが青になりたいと仮定すると、あなたの最新オブジェクトは赤であることを、あなたはすべてのオブジェクトを知っている「年齢」

// 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); 

あなたの場合(のはtimestampそれを呼びましょう)あなたが表示したい陰影の数を段階的な大きさに応じて単純に丸めます。たとえば、次のように

// 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; 

または、代わりに、あなたは(たとえば、60 seconds、または60000 millisのために)、単純にこの値を持つoldest.timestampを交換して含めるようにアルゴリズムを変更する最大TTL値にnewestから拡張したい場合オーバーフローチェック:

// 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

大変ありがとうございました!私はあなたの最初の抜粋を使用し、今私はちょっと質問が残っています:ハードコードされたカラー値の代わりに2つのカラーオブジェクトをどのように使用できるのですか? – jhbruhn

+0

どういう意味ですか?私が理解しているところでは、「ハードコードされたカラー値」は 'Color.Blue'、' Color.Red'などのようなもので、 'new Color(red、green、blue)'で独自の 'Color'インスタンスを作成できます。各値は「0-255」の範囲内にある。あなたはもっと具体的になりますか? –

+0

私はこれを置き換えたい:int red = 255 - (255 * ratio); int blue = 255 * ratio; 2つのColorオブジェクトがあります。だから私はf。青色/赤色のグラデーションは生成しませんが、緑色/黄色のグラデーションは生成しません。 – jhbruhn

0

カラーの色=年齢> 5280? Color.RED:年齢> 1000? Color.BLACK:年齢> 30? Color.YouGetTheIdea

+0

私はあなたのコードにそのような三項演算子を入れ子にすることは決してないと教えてください... – Jeffrey

+0

私はかもしれない...それはコンパクトで明確です。しかし、主に私は教授のための教授の例を掲示します。創始者は、自分の状況に最も適したものを選ぶ。新しい読者の中には、このオプションについて知らない人がいるかもしれません。しかし、通常は、nn = xx?yy:zzを使用します。あなたがすでに望んでいたように。 – Java42

+1

私は通常、単純なバリデーションを行うときには三項演算子が好きですが、これは乱用されていると思います。特に 'if .. else'ブロックがこの場合効率的であり、より読みやすいソースを生成するためです。コードソースが小さくても、コンパイルされたコードが高速になるわけではありません。 –

0

あなたはすなわちいずれかのミリ秒、時間、またはおそらくカスタム・メジャーでは上記に基づいて、各オブジェクトの年齢に基づいて対策を持っている可能性が何も< 1時間が1であるなど

与えることあなたの尺度あなたは現在の限界を9分と最大に見つけるためにオブジェクトを反復することができます)、または測定値を計算する間にそれを実行することもできます:最小時間よりも短い時間が発生すると、新しい分などを保存します。

今、最後に色を適用することです。私たちのオブジェクトの範囲は10msから1000msです。たとえば、10〜100,100〜500,500〜1,000の3つの領域に分割し、それに基づいて色を適用することができます。