Como você mencionou que tem um fundo estacionário, a cor das bolas ainda pode ser aleatória, mas elas precisam cair em determinados intervalos que ainda complementam o fundo.
Noções básicas. Antes de fazermos isso, você precisa conhecer o básico. Considere as seguintes cores:
Black #000000 rgb(0,0,0)
Red #FF0000 rgb(255,0,0)
Green #00FF00 rgb(0,255,0)
Blue #0000FF rgb(0,0,255)
Yellow #FFFF00 rgb(255,255,0)
Cyan #00FFFF rgb(0,255,255)
Pink #FF00FF rgb(255,0,255)
Gray #C0C0C0 rgb(192,192,192)
White #FFFFFF rgb(255,255,255)
Mistura de cores RGB [(0..255), (0..255), (0..255)] cria novas cores como acima.
Computação para cores negativas A computação para cores negativas é como transformar vermelho em ciano, verde em roxo, azul em amarelo.
Red #FF0000 rgb(255,0,0) -> Cyan #00FFFF rgb(0,255,255)
Green #00FF00 rgb(0,255,0) -> Purple #FF00FF rgb(255,0,255)
Blue #0000FF rgb(0,0,255) -> Yellow #FFFF00 rgb(255,255,0)
Cor Complementar
Conforme referência em Computação de cores complementares: http://serennu.com/colour/rgbtohsl.php
Sobre HSL
HSL expressa cores em termos de matiz, saturação e luminosidade, fornecendo um número para cada um desses três atributos da cor.
The Hue é a posição da cor na roda de cores, expressa em graus de 0 ° a 359 °, representando os 360 ° da roda; 0 ° sendo vermelho, 180 ° sendo o vermelho oposto à cor ciano e assim por diante.
A saturação é a intensidade da cor, quão opaca ou brilhante é. Quanto menor a saturação, mais opaca (mais cinza) a cor fica. Isso é expresso como uma porcentagem, sendo 100% de saturação total, o mais brilhante e 0% sem saturação, cinza.
Leveza é o quão clara é a cor. Um pouco diferente da saturação. Quanto mais branco na cor, maior o valor da luminosidade, mais preto, menor a luminosidade. Portanto, 100% de luminosidade torna a cor branca, 0% de luminosidade torna a cor preta e a cor "pura" seria 50% de luminosidade.
É mais fácil ver a diferença entre Saturação e Luminosidade do que explicá-la. Se você deseja esclarecer, tente visualizar as variações de Luminosidade e Saturação na página da calculadora de cores, escolhendo uma cor bastante brilhante como sua cor inicial.
Portanto, a notação HSL se parece com isso, fornecendo os valores Matiz, Saturação e Luminosidade nessa ordem: t
Vermelho: 0 ° 100% 50% Rosa pálido: 0 ° 100% 90% Ciano: 180 ° 100% 50% Aqui estão as etapas:
Converta sua cor para HSL.
Altere o valor da Matiz para o oposto da Matiz (por exemplo, se o seu Matiz for 50 °, o oposto estará em 230 ° na roda - 180 ° mais à frente).
Deixe os valores de Saturação e Luminosidade como estavam.
Converta esse novo valor HSL de volta à sua notação de cores original (RGB ou qualquer outra coisa).
Sites como EasyRGB.com podem fazer uma conversão genérica para você de RGB para HSL ou vice-versa.
Exemplo de programação feito em PHP conforme referência
Conversão RGB para HSL
O valor acima do azul # 0000FF rgb (0,0,255) pode ser apresentado como vermelho hexadecimal 00 + verde hexadecimal 00 + azul hexadecimal FF
$redhex = substr($hexcode,0,2);
$greenhex = substr($hexcode,2,2);
$bluehex = substr($hexcode,4,2);
Também pode ser apresentado como Vermelho Decimal 0 + Verde Decimal 0 + Azul Decimal 255
$var_r = (hexdec($redhex)) / 255;
$var_g = (hexdec($greenhex)) / 255;
$var_b = (hexdec($bluehex)) / 255;
Agora, conecte esses valores à rotina rgb2hsl. Abaixo está minha versão PHP do código genérico do EasyRGB.com para essa conversão:
A entrada é $ var_r, $ var_g e $ var_b acima A saída é equivalente a HSL como $ h, $ se $ l - eles são novamente expressos como frações de 1, como os valores de entrada
$var_min = min($var_r,$var_g,$var_b);ttt
$var_max = max($var_r,$var_g,$var_b);
$del_max = $var_max - $var_min;
$l = ($var_max + $var_min) / 2;
if ($del_max == 0)
{
$h = 0;
$s = 0;
}
else
{
if ($l < 0.5)
{
$s = $del_max / ($var_max + $var_min);
}
else
{
$s = $del_max / (2 - $var_max - $var_min);
};
$del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max;
$del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max;
$del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max;
if ($var_r == $var_max)
{
$h = $del_b - $del_g;
}
elseif ($var_g == $var_max)
{
$h = (1 / 3) + $del_r - $del_b;
}
elseif ($var_b == $var_max)
{
$h = (2 / 3) + $del_g - $del_r;
};
if ($h < 0)
{
$h += 1;
};
if ($h > 1)
{
$h -= 1;
};
};
Então agora temos a cor como um valor HSL, nas variáveis $ h, $ se $ l. Essas três variáveis de saída são novamente mantidas como frações de 1 neste estágio, e não como graus e porcentagens. Assim, por exemplo, ciano (180 ° 100% 50%) sairia como $ h = 0,5, $ s = 1 e $ l = 0,5.
Em seguida, encontre o valor do matiz oposto, ou seja, aquele que está a 180 ° ou 0,5, de distância (tenho certeza que os matemáticos têm uma maneira mais elegante de mostrar isso, mas):
Calcular a matiz oposta, $ h2
$h2 = $h + 0.5;
if ($h2 > 1)
{
$h2 -= 1;
};
O valor HSL da cor complementar está agora em $ h2, $ s, $ l. Então, estamos prontos para convertê-lo novamente em RGB (novamente, minha versão PHP da fórmula EasyRGB.com). Observe que os formatos de entrada e saída são diferentes desta vez, veja meus comentários na parte superior do código:
A entrada é o valor HSL da cor complementar, mantida em $ h2, $ s, $ l como frações de 1 A saída é RGB no formato normal 255 255 255, mantida em $ r, $ g, $ b A matiz é convertida usando a função hue_2_rgb, mostrada no final deste código
if ($s == 0)
{
$r = $l * 255;
$g = $l * 255;
$b = $l * 255;
}
else
{
if ($l < 0.5)
{
$var_2 = $l * (1 + $s);
}
elset
{
$var_2 = ($l + $s) - ($s * $l);
};
$var_1 = 2 * $l - $var_2;
$r = 255 * hue_2_rgb($var_1,$var_2,$h2 + (1 / 3));
$g = 255 * hue_2_rgb($var_1,$var_2,$h2);
$b = 255 * hue_2_rgb($var_1,$var_2,$h2 - (1 / 3));
};
// Function to convert hue to RGB, called from above
function hue_2_rgb($v1,$v2,$vh)
{
if ($vh < 0)
{
$vh += 1;
};
if ($vh > 1)
{
$vh -= 1;
};
if ((6 * $vh) < 1)
{
return ($v1 + ($v2 - $v1) * 6 * $vh);
};
if ((2 * $vh) < 1)
{
return ($v2);
};
if ((3 * $vh) < 2)
{
return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6));
};
return ($v1);
};
E depois dessa rotina, finalmente temos $ r, $ ge $ b no formato 255 255 255 (RGB), que podemos converter em seis dígitos hexadecimais:
$rhex = sprintf("%02X",round($r));
$ghex = sprintf("%02X",round($g));
$bhex = sprintf("%02X",round($b));
$rgbhex = $rhex.$ghex.$bhex;
$ rgbhex é a nossa resposta - a cor complementar em hexadecimal.
Como o fundo colorido é azul ou 0,0.255, o HSL é
Matiz (H): 240 graus / Saturação (S): 100% / Luminosidade (L): 4,9%
oposto de 240 é 60 em um círculo, em seguida, converter de volta para RGB dá um valor de # 181800