2 votos

Cómo determinar si un valor de color rgb (x,y,z) está dentro de un gradiente entre otros valores rgb

Digamos que tengo dos colores

color1=[red:255, green:0, blue:0 ]

color2:[red:0,green:255,blue:0 ]

Imagina un gradiente entre esos dos colores, con el color1 en el extremo izquierdo pasando lentamente al color2 en el derecho.

¿Cómo podría determinar si hay un tercer color en esa banda de gradiente de color?

Ahora mismo lo determino por la vía larga comparando ratios de cambio de forma procedimental.

¿Hay alguna ecuación que simplifique esto?

1voto

vadim123 Puntos 54128

Paso 1: Determine a qué distancia se encuentra el tercer color, en el eje rojo.

Paso 2: Comprueba si el tercer color está igual de lejos en los ejes verde y azul.


Fórmulas explícitas:

Supongamos que los tres valores de color rojo son $R_1, R_2, R_3$ . Establecemos $$\lambda_R=\frac{R_3-R_1}{R_2-R_1}$$ Esta constante $\lambda_R$ debe estar entre $0$ y $1$ ; de lo contrario, simplemente respondemos "NO".

Podemos calcular $\lambda_G$ , $\lambda_B$ para los otros dos colores de manera similar. Si las tres constantes coinciden (hasta el error de redondeo) respondemos "SÍ"; en caso contrario, "NO". Lo único que hay que tener en cuenta es si $R_1=R_2$ no queremos dividir por cero, así que comprobamos por separado si $R_3=R_1$ o no (como en el ejemplo dado, para el azul).

1voto

Nico Puntos 81

Depende un poco de cómo se realice el gradiente. El caso más probable es que sea simplemente una función lineal $$\mathbf{c}(t)=\langle 255,0,0\rangle + t\langle -255,255,0\rangle.$$ para $t\in[0,1]$ nota que $\mathbf{c}(0)$ es el vector correspondiente al color uno y $\mathbf{c}(1)$ es el color dos.

Lo importante es que el segundo sumando siempre añade a la segunda coordenada la misma cantidad que elimina de la primera. Por lo tanto, se podría utilizar este sencillo criterio: un color $\langle a,b,c\rangle$ está en el gradiente si

  1. $c=0$
  2. $a+b=255$

Editar: Voy a redondear mi respuesta para que sea un poco más general. Si te dan dos colores $\alpha=\langle r_1,g_1,b_1\rangle$ y $\beta=\langle r_2,g_2,b_2\rangle$ entonces cada color del gradiente de la línea recta entre ellos puede ser realizado como un valor de la función $$\mathbf{c}(t)=\alpha+t(\beta-\alpha)=\langle r_1,g_1,b_1\rangle+t\langle r_2-r_1,g_2-g_1,b_2-b_1\rangle$$ de nuevo, como $t$ se sitúa en el intervalo $[0,1]$ . Como antes, $\mathbf{c}(0)=\alpha$ y $\mathbf{c}(1)=\beta$ .

Ahora bien, si tienes un vector $\gamma=\langle r_3,g_3,b_3\rangle$ y quieres determinar si este color se encuentra en el gradiente, tendrías que ver si hay un $t\in[0,1]$ que satisface la ecuación $$\gamma=\alpha+t(\beta-\alpha)$$ que puede comprobarse mediante la función $\lambda_i$ utilizado en la respuesta de @vadim123.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X