Victoria, miembro de este gran staff, nos hizo el favor de crear este enunciado ya que domina a la perfección el tema.
Solución:
Parece que quieres reemplazar tu ??? con
Round((R1*Percent + R2*(100-Percent))/100.0)
El EnsureRange
en su código no es necesario porque esta función debe devolver valores en el rango de 0 a 255 siempre que Percent
está en el rango de 0 a 100. Creo que aplicaría el EnsureRange
a Percent
(fuerce el rango de 0.0 a 100.0) y luego use el siguiente código:
Result := RGB(
Round((R1*Percent + R2*(100-Percent))/100.0),
Round((G1*Percent + G2*(100-Percent))/100.0),
Round((B1*Percent + B2*(100-Percent))/100.0),
);
Su primera función devuelve un array cuyo primer color es ColorA
. Tal vez sería mejor con esto:
for X:= 0 to Count - 1 do
Result[X]:= ColorBetween(ColorA, ColorB, (X+1) / (Count+1) * 100.0);
Esto da el mismo comportamiento en ambos extremos de la array. O tal vez quieras ambos ColorA
y ColorB
incluido. Entonces usarías:
X / (Count-1) * 100.0
Pero si hace esto, recuerde que Count debe ser mayor que 1, de lo contrario, dividirá por cero. ¡¡Eso nunca funciona!!
No te preocupes por el rendimiento. Sin duda, el código podría hacerse un poco más rápido, pero ciertamente no será un cuello de botella. Tomarás estos colores y dibujarás con ellos. Eso va a consumir muchos más recursos que estas simples rutinas.
Un punto final. La interpolación en el espacio RGB no se verá particularmente suave o lineal para el ojo humano. Usar el porcentaje de punto flotante no puede evadir ese hecho. Para obtener los mejores resultados durante la visualización, deberá interpolar en un espacio de color diferente.
no se si este es el lo más rápido manera, pero funciona:
function ColorBetween(const ColorA, ColorB: TColor; const Percent: Integer): TColor;
var
R1, G1, B1: Byte;
R2, G2, B2: Byte;
begin
R1:= GetRValue(ColorA);
G1:= GetGValue(ColorA);
B1:= GetBValue(ColorA);
R2:= GetRValue(ColorB);
G2:= GetGValue(ColorB);
B2:= GetBValue(ColorB);
Result:= RGB(
Percent * (R2-R1) div 100 + R1,
Percent * (G2-G1) div 100 + G1,
Percent * (B2-B1) div 100 + B1
);
end;
function ColorsBetween(const ColorA, ColorB: TColor; const Count: Integer): TColorArray;
var
X : integer;
begin
SetLength(Result, Count);
for X := 0 to Count - 1 do
Result[X] := ColorBetween(ColorA, ColorB, Round((X / (Count-1)) * 100)); //Note: Divide by count-1
end;
Sección de Reseñas y Valoraciones
Si estás contento con lo expuesto, tienes la libertad de dejar un ensayo acerca de qué le añadirías a este escrito.