- Код: Выделить всё
getColor(min, max, current: integer): TColor;
Модератор: Модераторы
getColor(min, max, current: integer): TColor;
function ColorFromTemperature(Temp, Min, Max: Integer): TColor;
const
ReferenceDivisions = 4500;
ControlPoints: array[0 .. 6] of record
Position: 0 .. ReferenceDivisions;
R, G, B: byte;
end =
(
(Position: 0; R: 0; G: 0; B: 128), // тёмно-синий
(Position: 500; R: 0; G: 0; B: 255), // синий
(Position: 1500; R: 0; G: 255; B: 255), // голубой
(Position: 2000; R: 0; G: 255; B: 128), // зелёно-голубой
(Position: 2750; R: 255; G: 255; B: 0), // жёлтый
(Position: 3750; R: 255; G: 0; B: 0), // красный
(Position: ReferenceDivisions; R: 128; G: 0; B: 0) // тёмно-красный
);
// линейная интерполяция между A и B с параметром N/D: Result = B*(N/D) + A*(1 - N/D)
function Mix(A, B: Integer; N, D: Integer): Integer;
begin
result := A + (B - A) * N div D;
end;
var
I, N, D: Integer;
begin
Temp := Temp - Min;
Max := Max - Min;
if Temp <= 0 then Exit(RGBToColor(ControlPoints[0].R, ControlPoints[0].G, ControlPoints[0].B));
for I := 1 to High(ControlPoints) do
if {Temp/Max <= ControlPoints[I].Position/ReferenceDivisions}
Temp * ReferenceDivisions <= ControlPoints[I].Position * Max then
begin
// N/D = параметр интерполяции между цветами
// N/D = (Temp/Max - ControlPoints[I - 1].Position/ReferenceDivisions) / ((ControlPoints[I].Position - ControlPoints[I - 1].Position)/ReferenceDivisions)
N := Temp * ReferenceDivisions - ControlPoints[I-1].Position * Max;
D := (ControlPoints[I].Position - ControlPoints[I - 1].Position) * Max;
Exit(RGBToColor(
Mix(ControlPoints[I-1].R, ControlPoints[I].R, N, D),
Mix(ControlPoints[I-1].G, ControlPoints[I].G, N, D),
Mix(ControlPoints[I-1].B, ControlPoints[I].B, N, D)));
end;
result := RGBToColor(ControlPoints[High(ControlPoints)].R, ControlPoints[High(ControlPoints)].G, ControlPoints[High(ControlPoints)].B);
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34