Saltar al contenido

¿La forma más rápida de calcular los colores para un degradado?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *