배경을 덜 유사하게 만들기 위해 색상을 수정하는 알고리즘


23

나는 배경이 단색으로 채워져 서로 튀는 20 개의 공 데모를 만들고 있습니다. 각 볼의 색상은 각 randint(0, 255)R, G, B 튜플 구성 요소에 대해 임의로 선택됩니다 .

문제는 일부 공이 배경과 매우 유사한 색으로 끝나서보기가 어렵다는 것입니다. 선택한 색상이 너무 비슷 하면 다른 색상을 굴려서 (주어진 임계 값 내에서) 또는 배경 색상에서 멀리 떨어 뜨려서이를 피하고 싶습니다 .

임계 값으로 사용할 유사성 지수 를 계산하는 방법은 무엇입니까? 또는 색상을 덜 청색 으로 만들기 위해 색상을 변환하는 방법은 무엇입니까?

명백한 면책 조항 : 나는 색 이론에 대해 아무것도 모르므로 위의 개념이 존재하는지 모르겠습니다!

파이썬으로 코딩하고 있지만 개념과 전략을 찾고 있으므로 의사 코드는 훌륭합니다 (또는 이론).

편집하다:

몇 가지 요점을 명확히하려면 :

  • 각 공에는 고유 한 임의의 색이 있습니다. 가능한 한 무작위로 유지하고 가능한 한 많은 색상 공간을 탐색하고 싶습니다 (RGB 또는 HSV, pygame색상 정의를 위해 두 가지 형식 모두 허용)

  • 각 색상이 배경에 "너무 가까워"있는 것을 피하고 싶습니다. 문제는 단지 색조에 관한 것이 아닙니다 : 나는 진한 파란색 배경에 밝은 하늘색 공 (또는 "백색"청색에 대한 "풀 블루")으로 완벽하게 괜찮습니다.

  • 지금은 공이 다른 공과 비슷한 색으로 (또는 심지어 동일한) 색으로 끝나도 상관 없습니다. 이를 피하는 것은 보너스이지만 사소한 문제입니다.

  • 배경색은 일정한 단일 RGB 색입니다. 지금은 "basic"blue을 사용 (0, 0, 255)하고 있지만 그 해결 방법은 없습니다. 따라서 배경은 임의의 색상 (임의의 색조, 밝기, 채도 등)으로 간주하십시오 .

EDIT2 :

TL, DR 버전 : 임의의 (단일 및 일정한) 색상의 배경에 대해 "너무 희미 해지지"않도록 X 임의의 색상을 만드는 방법을 제공하십시오.



1
각 공 주위에 외곽선을 두는 것이 어떻습니까?
ashes999

1
그런 다음 두 배경과 공 색상 구별의 윤곽선 색을 만들기에 문제가있을 수 있습니다)
Kromster 지원 모니카 말한다

1
@AlexM .: "임의의 색을 피하는 임의의 색을 생성하는"쉬운 해결책이 없다고 생각하기 어렵다
MestreLion

1
@MestreLion은 윤곽선에 검은 색 만 사용하고 최소 RGB 값이 128 인 색상을 생성합니다.
ashes999

답변:


33

색이 (3 차원) 색 공간을 구성하고이 색 공간의 거리를 계산한다는 사실을 사용할 수 있습니다. 그런 다음 두 색상 사이의 거리를 찾으려면이 색상 공간에서 메트릭을 정의해야합니다.

예를 들어 두 점 x = (x1, x2, x3)과 y = (y1, y2, y3) 사이의 유클리드 공간에서의 거리는 d (x, y) = sqrt ((y1-x1) * (y1- x1) + (y2-x2) * (y2-x2) + (y3-x3) * (y3-x3)).

이제 공 색과 배경 색 사이의 거리를 계산할 수 있으며 너무 작 으면 새로운 임의의 색을 만들고 다시 테스트하십시오.

RGB 나 HSV도이 작업에 적합한 색상 공간이 아닙니다. 색상 차이에 대한 Wikipedia 기사L a b 색상 공간을 사용하며 몇 가지 가능한 메트릭을 제공합니다.

주제 에 대한 stackoverflow 에 대한 토론 도 있습니다 .


그것은 아주 좋은 접근법입니다, 나는 그것을 할 수 있습니다 :) 감사합니다! 또한 적절한 "최소 거리"임계 값을 찾는 방법에 대해 좀 더 자세히 설명하고 싶으십니까? RGB가 충분하지 않으면 L a b 로 변환하는 방법은 무엇입니까? 나는 정확한 인식 메트릭스를 위해 노력하고 있지 않으므로 "충분히 좋은"기본값이 될 것입니다.
MestreLion

1
이 방정식을 좋아하고, 필요한 방정식과 참고 자료를 제공하면서 과제를 수행하는 방법에 대해 잘 설명하고 잘 설명하십시오. 좋은 첫 대답입니다.
Tom 'Blue'Piddock

1
인간 인식의 "충분히 좋은"근사치를 찾고 있다면 RGB에서 직접 변환되는 YUV 색 공간 을 살펴볼 수 있습니다 .
trm

5
약간의 시간을 절약하고 제곱근을 사용하지 마십시오 (비싸다). 사각형과 비교할 최소 색 거리 값을 설정하십시오.
Chris Cudmore

1
@MestreLion L a b * 색 공간은 지각 적으로 균일하게 발명되었습니다. 즉, 두 색 사이의 인식 거리는 색 공간의 실제 거리와 같습니다. RGB 색상은 장치에 따라 다르므로 Lab과 RGB간에 직접 변환 할 수 없습니다. 그러나 특정 절대 RGB 색 공간을 사용하는 경우이를 변환 할 수 있습니다. 이 기사 참조 : en.wikipedia.org/wiki/SRGB_color_space 및이 기사 : en.wikipedia.org/wiki/Lab_color_space
jwir3

8

UN 웹 접근성 표준 페이지 ( http://www.un.org/webaccessibility/1_visual/13_colourcontrast.shtml )는 일부 사용자가 색맹임을 염두에두고 웹 사이트에서 텍스트의 적절한 대비 를 보장하기위한 표준을 나타냅니다 . 일부 사용자는 색맹 일 수도 있기 때문에 특히 중요 할 수 있습니다 (동일한 휘도를 가진 녹색 배경에서 빨간 공을 구별하기 어려울 수 있습니다).

UN 페이지는 ( http://juicystudio.com/services/luminositycontrastratio.php#specify ) 의 Juicy Studios Luminosity 색 대비 비율 분석기를 가리키며 백그라운드의 텍스트는 4.5 : 1의 대비 비율을 가져야합니다. 귀하의 경우와 유사하다고 생각하십시오 :

  • 큰 텍스트 : 큰 텍스트 및 큰 텍스트 이미지의 대비 비율은 3 : 1 이상입니다.

이제 명암비 란 무엇입니까? 하이퍼 링크를 더 따라 가면 (재미 있습니다!) 다음과 같이 대비 비율을 정의하는 W3 페이지로 이동합니다.

Contrast Ratio = (L1 + 0.05)/(L2 + 0.05)

여기서 L1과 L2는 색상의 상대 휘도입니다. L1은 휘도 가 높은 색상이고 L2는 휘도가 낮은 색상입니다. 다시, 우리는 다음을 지정하는 동일한 W3 페이지에 대한 링크를 따릅니다.

L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:

if RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
if GsRGB <= 0.03928 then G = GsRGB/12.92 else G = ((GsRGB+0.055)/1.055) ^ 2.4
if BsRGB <= 0.03928 then B = BsRGB/12.92 else B = ((BsRGB+0.055)/1.055) ^ 2.4
and RsRGB, GsRGB, and BsRGB are defined as:

RsRGB = R8bit/255
GsRGB = G8bit/255
BsRGB = B8bit/255

참고 : 위 의 캐럿 기호 ^ 는 지수 (x²)를 나타냅니다.

우리는 대조 알고리즘을위한 꽤 좋은 프레임 워크를 가지고 있습니다 (색맹 친화적입니다!)

  • 각 색상에 대한 R, G, B 값 결정
  • 각 색상의 휘도 결정
  • 더 높은 휘도의 색상과 가장 낮은 휘도의 색상의 대비 비율이 3보다 작 으면 다시 롤업하십시오!

2
^는 지수화되어야한다는 점에 주목할 수 있습니다. 우리에게 미친 C와 같은 사용자에게는 xor를 의미합니다 (정말로 부동 소수점 값에 대해 비트 연산을하려고한다고 생각했습니다).
Pharap

그것은 놀라운 접근법입니다, 나는 그것을 좋아합니다! :)
MestreLion

그리고 걱정하지 마십시오 ^.이 맥락에서 비트 XOR에 대해서는 결코 생각하지 않을 것입니다. (또는 실제로. C'mon C phreaks) ^는 의사 코드의 지수화를위한 사실상의 **
상징물입니다

1
오타를 고치기 만하면됩니다. 또한 한 사람이 ^에 문제가 있으면 미래에 다른 사람도 가능할 수 있습니다. 구체적으로 아프지 않습니다.
John

1
@ 존 걱정하지 마세요. 혼란이 어디에서 유래했는지 확실하지 않습니다 (즉, 어느 언어가 먼저 어떤 목적으로 사용 되었는가). 나는 ^가 VB에 대한 경험 때문에 지수에 사용되는 경우가 있음을 알고 있습니다 (지수로 사용하는 다른 언어는 모르지만 아마도 일부가 있습니다). 헤드 업과 마찬가지로 당근 기호가 아닌 캐럿 기호입니다. 누군가가 야채 (특히 제곱근 관련)로 프로그래밍하는 것에 대해 신이 끔찍한 농담을하기 전에 그것을 바꾸고 싶을 수도 있습니다.
Pharap

2

0-255각 구성 요소에 대해 임의의 값을 생성하여 RGB 값을 사용 하면 배경과 유사한 색상을 만들 수있을뿐만 아니라 볼과 매우 유사한 색상으로 끝날 수도 있습니다.

나는 덜 무작위적인 접근법을 선택하고 대신 다른 색을 보장하는 색상을 만들 것입니다. 색조 범위에서 ~ 32 도마 다 색상을 만들고 밝기 또는 채도를 대체 할 수 있습니다 (RGB 대신 HSV 색상 모델 사용).

그래서 이런 식으로 :

numColors = 20;
stepSize = 360 / (numColors / 2 + 1); // hue step size
for(i = 0; i < numColors; i++){
    color = HSV(i / 2 * stepSize, 0.5 + (i % 2) * 0.5, 1.0) 
}

20 가지 색상을 만들 수 있습니다. 이것은 당신이 정수 연산을 사용하고, 그래서 가정 i = 0i = 1같은 색상 값을 생성합니다.

물론 이것은 너무 잘 맞지 않습니다. 100 개의 색상 값을 만들면 색조 간격이 충분하지 않아 비슷한 색상으로 다시 끝나게됩니다. 이 경우 V(밝기) 값을 변경할 수도 있습니다 .

배경색이 무엇인지 모르지만 HSV를 사용하면 색상을 쉽게 비교할 수 있습니다 (3 가지 구성 요소를 비교하고 HUE가 원형임을 잊지 마십시오 (0 == 360)).

최신 정보:

나는 실제로 당신의 질문에 대답하지 않고 다른 접근법을 제공했기 때문에 임의의 배경과 완전히 임의의 색깔의 공에 대한 알고리즘이 어떻게 보일 수 있습니까?

// background color, currently equals RGB(0, 0, 255)
bg = HSV(240, 1.0, 1.0)

// number of colors to create is equal to the amount of balls
numColors = balls.length

// set threshold to compare colors. you can tweak this to your liking
threshold = 0.15

for(i = 0; i < numColors; i++){
    do {
        // assuming rnd returns a random float 0-1 inclusive
        color = HSV(rnd() * 360, rnd(), rnd())
        // calculate delta values, normalize hue to 0-1
        dH = (180 - abs(abs(bg.h - color.h) - 180)) / 360
        dS = bg.s - color.s
        dV = bg.v - color.v
        // "distance" between bg and color
        difference = sqrt(dH * dH + dS * dS + dV * dV)
    } while(difference < threshold)

    ball[i].color = color
}

알고리즘에 대해 배경색을 어떻게 고려합니까?
MestreLion

현재 배경색을 고려하지 않고 있습니다 ... 마지막 단락에서 설명한대로 생성 된 색상을 비교하여 조정 한 다음 다른 색상으로 생성 할 수 있습니다 V(현재 알고리즘은 변경하지 않음).
bummzack

@MestreLion 대체 알고리즘으로 업데이트 추가
bummzack

좋은 전략 인 것 같습니다. 무차별 대입은 괜찮습니다. 게임 루프가 아닌 초기화시 색상이 한 번만 생성됩니다. HSV의 일반 유클리드 거리와 함께 René와 동일한 접근 방식을 사용하고있는 것 같습니다. HSV에 적합한 임계 값에 대한 언급이 있습니까? H, S 및 V의 무게는 RGB와 같은 거리에서 동일합니까?
MestreLion

@MestreLion 네, 두 번째 알고리즘은 René가 그의 답변에서 설명한 것과 거의 같습니다. 슬프게도 색상 변화가 균일하게 인식되지 않기 때문에 좋은 임계 값에 대한 확실한 가치는 없습니다. 우리는 녹색보다 훨씬 빠르게 녹색의 변화를 인식합니다. 따라서 녹색 톤의 경우 더 작은 임계 값은 작동하지만 다른 색상에는 충분하지 않습니다. HSV 색 공간으로 원하는 결과를 얻지 못하면 가장 적합 할 수 있습니다.
bummzack

1

고정 배경을 가지고 있다고 언급 했으므로 공의 색은 여전히 ​​임의적 일 수 있지만 여전히 배경을 보완하는 특정 범위에 속해야합니다.

기초. 그렇게하기 전에 기본 사항을 알아야합니다. 다음 색상을 고려하십시오.

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)

색상 혼합 RGB [(0..255), (0..255), (0..255)]는 위와 같이 새 색상을 만듭니다.

네거티브 컬러 계산 네거티브 컬러 계산은 시안 색, 녹색, 자주색, 파란색의 노랑색 변환과 같습니다.

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)

보색

보완 색상 계산에 대한 참조에 따라 http://serennu.com/colour/rgbtohsl.php

HSL 소개

HSL은 색조, 채도 및 밝기 측면에서 색상을 표현하여 색상의 세 가지 속성 각각에 대해 숫자를 제공합니다.

색조는 휠의 360 °를 나타내는 0 ° ~ 359 °의 각도로 표시되는 컬러 휠의 색상 위치입니다. 0 °는 적색, 180 °는 적색의 시안 색 등입니다.

채도는 색상의 강도, 얼마나 흐리거나 밝은 지입니다. 채도가 낮을수록 색상이 더 흐릿하게 (회색으로) 나타납니다. 이것은 100 %가 완전 채도이고 가장 밝고 0 %가 채도없는 회색 인 백분율로 표시됩니다.

밝기는 색상이 얼마나 밝은 지입니다. 채도와 약간 다릅니다. 색상이 흰색 일수록 밝기 값이 높을수록 검은 색 일수록 밝기가 낮아집니다. 따라서 100 % 밝기는 색상을 흰색으로, 0 % 밝기는 색상을 검정색으로, "순수한"색상은 50 % 밝기입니다.

설명하는 것보다 채도와 밝기의 차이를 보는 것이 더 쉽습니다. 명확하게하려면 색상 계산기 페이지에서 명도 및 채도 변형을보고 시작 색상으로 밝은 색상을 선택하십시오.

따라서 HSL 표기법은 다음과 같이 색조, 채도 및 밝기 값을 다음과 같은 순서로 제공합니다.

빨간색 : 0 ° 100 % 50 % 옅은 분홍색 : 0 ° 100 % 90 % 시안 : 180 ° 100 % 50 % 다음 단계는 다음과 같습니다.

  1. 색상을 HSL로 변환하십시오.

  2. 색조 값을 반대쪽 색조의 값으로 변경하십시오 (예 : 색조가 50 ° 인 경우 반대쪽 바퀴의 230 °-180 ° 더 먼 거리).

  3. 채도와 명도 값을 그대로 둡니다.

  4. 이 새로운 HSL 값을 원래 색상 표기법 (RGB 또는 기타)으로 다시 변환하십시오.

EasyRGB.com과 같은 사이트는 RGB에서 HSL로 또는 그 반대로 일반 변환을 수행 할 수 있습니다.

참조에 따라 PHP에서 수행 된 프로그래밍 예제

RGB에서 HSL로 변환

Blue # 0000FF rgb (0,0,255) 위의 값은 Red Hexadecimal 00 + Green Hexadecimal 00 + Blue Hexadecimal FF로 표시 될 수 있습니다.

$redhex  = substr($hexcode,0,2);
$greenhex = substr($hexcode,2,2);
$bluehex = substr($hexcode,4,2);

빨강 10 진수 0 + 녹색 10 진수 0 + 파랑 10 진수 255로 표시 될 수도 있습니다.

$var_r = (hexdec($redhex)) / 255;
$var_g = (hexdec($greenhex)) / 255;
$var_b = (hexdec($bluehex)) / 255;

이제이 값을 rgb2hsl 루틴에 연결하십시오. 아래는 해당 PHP 버전의 EasyRGB.com 일반 코드입니다.

입력 값은 위의 $ var_r, $ var_g 및 $ var_b입니다. 출력은 HSL $ h, $ s 및 $ l과 동일합니다. 입력 값과 같이 1의 분수로 다시 표시됩니다.

$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;
        };
};

이제 변수 $ h, $ s 및 $ l에서 색상을 HSL 값으로 사용합니다. 이 세 가지 출력 변수는이 단계에서도 및 백분율이 아닌 1의 분수로 다시 유지됩니다. 예를 들어 청록색 (180 ° 100 % 50 %)은 $ h = 0.5, $ s = 1 및 $ l = 0.5로 나타납니다.

다음으로 반대쪽 색조, 즉 180도 또는 0.5 거리의 값을 찾으십시오 (수학자에게는이를 수행하는보다 우아한 방법이 있지만 확실합니다).

반대 색조, $ h2 계산

            $h2 = $h + 0.5;

            if ($h2 > 1)
                    {
                            $h2 -= 1;
                    };

보색의 HSL 값은 이제 $ h2, $ s, $ l입니다. 그래서 우리는 이것을 RGB로 다시 변환 할 준비가되었습니다. 이번에는 입력 및 출력 형식이 다릅니다. 코드 상단의 내 의견을 참조하십시오.

입력은 보색의 HSL 값이며 $ h2, $ s, $ l은 1의 분수이므로 출력은 보통 255255255 형식의 RGB이고 $ r, $ g, $ b로 유지됩니다. 색조는 hue_2_rgb 함수를 사용하여 변환됩니다. 이 코드의 끝에서

    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);
    };

그리고 그 루틴이 끝나면 마침내 255255255 (RGB) 형식의 $ r, $ g 및 $ b가 6 자리 16 진수로 변환 될 수 있습니다.

    $rhex = sprintf("%02X",round($r));
    $ghex = sprintf("%02X",round($g));
    $bhex = sprintf("%02X",round($b));

    $rgbhex = $rhex.$ghex.$bhex;

$ rgbhex는 우리의 해답입니다 – 16 진수의 보색입니다.

색상 배경이 파란색 또는 0,0,255이므로 HSL은

색조 (H) : 240도 / 채도 (S) : 100 % / 밝기 (L) : 4.9 %

240의 반대는 60 원이고, 다시 RGB로 변환하면 값은 # 181800입니다.


감사! 그러나이 링크는 자체 의 "보완적인 색상"(무엇이든) 생성에 대해 설명 합니다 . 나는 여전히 내 문제를 해결하기 위해 그것을 사용하는 방법에 대한 실마리가 없다. 각각의 임의의 색이 배경색과 비슷하지 않아야한다. 배경색은 일정하고 단색이며 여러 개의 공이 있습니다.
MestreLion

감사합니다 @MestreLion, 배경이 일정하기 때문에 여전히 배경을 보완하는 공의 범위를 지정할 수 있습니다.
에이스 Caserya

현재 내 대답을 설명하고 있습니다.
에이스 Caserya

끝난. 나는 충분히 설명 되었기 때문에 사이트 설명에서 많이 바꿀 것이 없습니다. EasyRGB.com에서 사람들에게 크레딧
Ace Caserya


1

@ ashes999의 개요 작성 아이디어를 확장하고 싶습니다.

내 코드는 내가 머리 꼭대기에서 할 수있는 것처럼 파이썬과 비슷할 것입니다 (평생 동안 한 줄의 파이썬을 쓰지 않았지만 한두 번 책을 보았습니다).

def lerp(a,b,value): # assuming your library was not kind enough to give you this for free
    return a + ((b - a) * value);

def drawRandomBall(bgColour,radius,point):
    var ballColour = Colour(random(0,255),random(0,255),random(0,255);
    var outlineColour = Colour(lerp(bgColour.R,255 - ballColour.R,0.5),lerp(bgColour.G,255 - ballColour.G,0.5),lerp(bgColour.B,255 - ballColour.B,0.5));
    fillCircle(point,radius+1,outlineColour);
    fillCircle(point,radius,ballColour);

특히 예쁘지 않을 수도 있고 프로덕션 코드에는 이상적이지는 않지만 빠른 수정으로 충분합니다. 코드를 테스트하기 위해 절단 할 수있는 "화면 주위에 튀는 공"프로그램이 없기 때문에 코드를 테스트하지 않았습니다.


편집하다:

실제 사용중인 코드를 확인하면 상황이 바뀌 었습니다. 대신이 솔루션을 제공합니다.

276-284 행을 다음과 같이 바꾸십시오.

# Colour generator
def generateColourNonBG(leeway):
    color = (randint(0,255), randint(0,255), randint(0,255))
    while color[0] >= BG_COLOR[0]-leeway and color[0] =< BG_COLOR[0] + leeway and
    color[1] >= BG_COLOR[1]-leeway and color[1] =< BG_COLOR[1] + leeway and
    color[2] >= BG_COLOR[2]-leeway and color[2] =< BG_COLOR[2] + leeway:
        color = (randint(0,255), randint(0,255), randint(0,255))

# Ball generator
def generateBall():
    Ball(generateColourNonBG(5),
                   radius=randint(10, radius),
                   position=[randint(100, screen.get_size()[0]-radius),
                             randint(100, screen.get_size()[0]-radius)],
                   velocity=[randint(50, 50+vel[0]), randint(50, 50+vel[1])],
                   )                       

# Create the balls
balls = pygame.sprite.Group()
for _ in xrange(BALLS):
    balls.add(generateBall())

이 새로운 단순화 된 버전에서 팩토리 메소드는 공을 뱉어 내고 특수 메소드는 색상을 생성합니다. 색상 생성기는 임의로 생성 된 색상을 테스트하여 배경 색상과의 특정 범위 내에 있는지 확인합니다. 세 가지 색상 채널이 leeway모두 BG의 양쪽에있는 경우 색상이 BG 색상과 너무 가까운 것으로 간주됩니다 . 따라서 leeway가 0이면 BG와 정확히 일치하는 색상 만 거부됩니다. 나는 BG 색상과 5 색상을 거부하는 기본값으로 5를 선택했습니다. BG 색상이 흰색이므로 숫자가 줄 바꿈되어 검은 색이 거부되는지 확실하지 않습니다. 최소 및 최대 기능을 사용하면 피할 수 있지만 간결성을 위해 생략했습니다.


나는 어떤 전략이든 열려 있습니다 :) 잘라내 는 프로그램에 관해서 는, 당신에게 줄 수 있습니다 : github.com/MestreLion/rainballs 관련 라인은 279-284
MestreLion

pygame도서관으로 사용 하고 있습니다. Lerp 없음, 기본 RGB-HSV-CYMK 변환 : pygame.org/docs/ref/color.html
MestreLion

@MestreLion Oh lordy, 이제 pygame과 python을 설치하여 테스트해야합니다. 이 XP로 발을 딛었습니다. Lerping은 쉽습니다. lerp제 대답 의 기능은 모든 것입니다. 왼쪽은 '선형 보간'을 의미합니다.
Pharap

@MestreLion 약간 비틀 거리고, 내 파이썬 버전은 괄호없이 인쇄가 호출되는 것을 좋아하지 않는 것으로 나타났습니다. 수정되었지만 이제 파이 게임에서 올바른 라이브러리를 찾을 수없는 오류가 발생했습니다. 나는 당신이 가진 것에 맞게 코드를 다시 작성하지만 파이 게임을 고칠 때까지 테스트 할 수 없습니다. 아직 파일을 추가하지 않은 경우 질문에 파일을 추가하는 것이 좋습니다 (누군가가 파이썬을 쓸 정도로 기분이 좋은 경우).
Pharap

당신은 print파이썬 3 사용하고, 나는 파이썬 2에 여전히 해요 그리고 만약 내가 확실하지 않다 때문에 다른 pygame아직 Py3에 이식했다. 결론 : 귀찮게하지 마십시오 :) 색상에 관한 질문입니다, 당신은 주위에 튀는 실제 공이 필요하지 않습니다 :)
MestreLion

1

RGB 형식의 경우 이것은 충분히 작동하는 것으로 보이며 사소합니다.

다양성 _ 점수 = (abs (r1-r2) + abs (g1-g2) + abs (b1-b2)) / 765.0

점수는 0.0에서 1.0 사이입니다. 낮을수록 두 가지 색상을 구분하기가 더 어려워집니다.

명백해야하지만 완전성을 기하기 위해 r, g, b 값은 먼저 부동 소수점 숫자로 캐스트되어야하며 최대 값은 255라고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.