Mein Vorschlag: Logik von Darstellung trennen (originell, ich weiß).
Statt den „Wert“ der Straße direkt als Farbe zu speichern, speicherst du ihn als Wert zwischen 0.0 und 1.0 (über Gleitkommazahlen oder über einen entsprechend skalierten Integer, wie auch immer). Am Ende multiplizierst du einfach die Maximalfarbe mit dem Wert. Dadurch reduzierst du außerdem Rundungsfehler.
Beispiel:
FarbeMaximal = RGB($FF, $00, $00) (100% rot)
Wert = 0.0
-> Farbe = RGB($FF*0.0, $00*0.0, $00*0.0) = RGB($00, $00, $00); (schwarz)
Wert = 0.5
-> Farbe = RGB($FF*0.5, $00*0.5, $00*0.5) = RGB($7F, $00, $00); (dunkelrot)
Wert = 1.0
-> Farbe = RGB($FF*1.0, $00*1.0, $00*1.0) = RGB($FF, $00, $00); (100% rot)
Je nachdem, wie das Mapping verlaufen soll, kannst du den Wert auch vorher potenzieren (Stichwort Gamma). Also z.B.
Wert = Power(Wert, 2.2);
für einen Gammawert von 2.2.
Natürlich kannst du auch, wie schon vorgeschlagen, ein anderes Farbmodell wie
HSV statt
RGB verwenden, aber imo ist das für diesen Zweck unnötig kompliziert.