2011-01-05 6 views
1

Ist ein Ping in ms gegeben, gibt es eine Möglichkeit, die Schattierung algorithmisch auszuarbeiten, können wir diesen Ping machen, ohne die ifs und Farben hart zu codieren? IE diese Funktion funktioniert gut:Farben algorithmisch anstelle von hart definierenden Werten anzeigen

function displayPing(lngThePingTime) 

    response.Write("<span style=""font-wight:bold;color:") 

    if(lngThePingTime < 50) then 
     response.Write("#77ff66") 
    elseif lngThePingTime < 100 then 
     response.Write("#22ee00") 
    elseif lngThePingTime < 150 then 
     response.Write("#33bb00") 
    elseif lngThePingTime < 250 then 
     response.Write("#ffaa00") 
    elseif lngThePingTime < 400 then 
     response.Write("#ee6600") 
    elseif lngThePingTime < 550 then 
     response.Write("#dd4400") 
    elseif lngThePingTime < 700 then 
     response.Write("#dd1100") 
    elseif lngThePingTime < 1000 then 
     response.Write("#990000") 
    else 
     response.Write("#660000") 
    end if 

    response.Write(""">")  
    response.Write lngThePingTime   
    response.Write("</span>") 

end function 

Aber ist es eine Möglichkeit, einen Algorithmus aufweist, der sagt:

Lowest Colour : #77ff66 
Highest Colour: #660000 
Cutoff Value: 1500 (any ping higher than this is fixed to highest colour) 

Damit die Farbe jeden Schatten nicht eine Reihe von festen Schatten sein wird?

Sprache spielt keine Rolle, mehr Interesse an der Methode!

+1

Split die Farben an den entsprechenden RGB Werte und führen eine einfache lineare Interpolation zwischen Low und High durch. Sieht für mich OK aus, ich habe das benutzt. –

+0

Interpolation in den HSV-Koordinaten sieht in der Regel ein bisschen besser, d. H. Übergang von grün nach rot geht durch gelb statt bräunlich. –

Antwort

2

Farben sind ein mehrdimensionaler Raum, Sie müssen also wählen, wie Ihre Interpolation durchgeführt wird. Ungewöhnlich ist das Zeichnen einer "geraden" Linie mit RGB als Dimensionen nicht sehr gut.

Ein einfacher Weg ist HSB/V/L color space zu verwenden. Viele moderne Programmiersprachen werden automatisch in diesen Raum konvertiert, siehe zum Beispiel [java Color methods] [2]. Ansonsten ist die Mathematik nicht zu schwer. Die wikipedia article explains it.

Ich hatte die Situation, wo dies nicht das tat, was ich wollte - zum Beispiel wollte ich eine Ampel-Stil "gehen von rot nach grün über Bernstein". In diesem Fall habe ich den folgenden Code verwendet, der "gut genug" war. Wie Sie sehen können, habe ich es ausgenutzt, etwas über die Beziehung zwischen RGB und Farbe zu wissen. Das ist nicht so konfigurierbar, wie Sie wollen vielleicht, aber gibt ein Beispiel für die Art von Methode, die Sie verwenden können:

private static int makeTrafficLight(float fraction, int brightness) { 
    final float orange = 0.4f; 
    if(fraction < orange) { 
      int r = brightness; 
      float f = fraction/orange; 
      int g = (int)(brightness*(f/2.0f)); 
      int b = 0; 
      return Color.rgb(r,g,b); 
    } else { 
      float f = ((fraction-orange)/(1.0f-orange)); 
      int r = (int)(brightness*(1.0f-f)); 
      int g = (int)(brightness*(f/2.0f+0.5f)); 
      int b = 0; 
      return Color.rgb(r,g,b); 
    } 
} 

[2]: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Color.html#HSBtoRGB(float, float, float)

+0

Große Antwort, +1 danke –

Verwandte Themen