losowanie 3 liczb spełniających zależność
seth: Pół matematyczne − pół informatyczne zadanie:
Chciałbym wylosować kolor o zadanej jasności. Kolor kodują trzy liczby r,g,b w zakresie 0−255
Formuła na jasność: j=√0.299r2 + 0.587g2 + 0.114b2 lub dla uproszczenia:
j=√αr2 + βg2 + γb2
Jak łatwo policzyć, j może być również w zakresie 0−255
Mogę wylosować jedną liczbę podając zakres losowania, np. 0−255. Pytanie: jak wylosować te 3
liczby tak, by spełniały zależność tej formuły? Czyli, jakie kolejno zakresy podać podczas
losowania tych trzech liczb?
Wg mojego rozumowania, należy to wykonać w 3 krokach:
1.losowanie r − zakres musi uwzględniać j
2.losowanie g − zakres musi uwzględniać j oraz wylosowane r
3.podstawienie j,r,g do formuły − powstaje równanie z 1 niewiadomą, z którego obliczamy b
22 sie 16:23
daras: mozesz losować w ciemno
22 sie 16:58
seth: ok losuję w ciemno:
j=0
losowanie: r=255, g=255
obliczam b
b=√j2−0,299r2−0,587g20,114=√0−0,299*65025−0,587*650250,114≈√−505369,73
Otrzymujemy pierwiastek z l. ujemnej − sprzeczność
22 sie 17:08
daras: przecież nie możesz wylosowac 2x tej samej liczby
22 sie 17:12
seth: dlaczego nie? zresztą gdybym wylosował 255 i 254 to również otrzymałbym pierwiastek z ujemnej.
22 sie 17:14
daras: chyba masz sprzeczność w rachunkach
jak z dowolnych 3 dodatnich liczb, w dodatku podnoszonych do
2 może wyjść coś ujemnego
22 sie 17:14
daras: przecież każde liczby z tego przedziału spełniają tę formułę, sam stwierdziłeś , ze łatwo to
policzyć
22 sie 17:15
seth: wcale tego nie napisałem.
To był warunek podstawowy − dziedzina. Żeby liczba miała sens jako składnik koloru, musi być w
zakresie 0−255. Ale to nie oznacza, że każde 3 dowolne liczby z tego zakresu będą spełniać to
równanie dla każdego j.
22 sie 17:17
Trivial:
Skąd masz ten wzór na jasność. On chyba wygląda tak:
J = 0.299R + 0.587G + 0.114B
22 sie 17:17
22 sie 17:19
Trivial:
Można wylosować 3 liczby R,G,B ∊[0,255] a potem przeskalować zgodnie ze wzorem żeby się
zgadzała jasność.
22 sie 17:30
seth: ee, zgodnie z jakim wzorem? Tym moim? W jaki sposób przeskalować?
22 sie 17:31
Trivial:
Policzyć jasność dla wylosowanych R,G,B:
L
2 = 0.299R
2 + 0.587G
2 + 0.114B
2
Chcemy mieć kolor o jasności J, skalujemy wylosowane liczby o faktor c:
J
2 = 0.299c
2R
2 + 0.587c
2G
2 + 0.114c
2B
2
Skąd:
| J2 | |
|
| = 0.299R2 + 0.587G2 + 0.114B2 = L2 |
| c2 | |
22 sie 17:38
seth: Dzięki, to wygląda na bardzo proste i eleganckie rozwiązanie. Wypróbuję w praktyce.
22 sie 17:44
22 sie 17:52
Trivial: Hmm to podejście nie do końca działa gdy c > 1. Hmm...
22 sie 18:03
asdf: Formuly ktora wskazal Trivial o 17:17 jest chyba najodpowiedniejsza, po co przesadzac,
kombinowac? J − jasnosc...to dziala tez jako robienie obrazu czarnobialego, np.
piksel−kolorowy = x = [r, g, b];
chcesz zrobic czarnobialy:
piksel−czarnobialy = [r*0.299, g*0.587, b*0.114]
ja bym tu nie kombinowal, bo zadanie jest na tyle proste, ze az nie warto!
25 sie 20:58
Trivial: asdf, gdzie tutaj jest sposób generowania piksela o zadanej jasności?
25 sie 21:23
asdf: aha...oj, zle przeczytalem zadanie − na szybkiego napisalem. to co napisalem to badziewie!
25 sie 23:11