eli siis tarkooituksena ois yrittää saada Red Green Blue jutskat qbasicciin.. onnistuisko ja oisko miten vaikeeta? voisko joku laittaa koodia tuosta kun itse en saanu mitään aikaseks.
Onnistuu kyllä. Kannattaa käyttää näyttötilaa 13, jolloin värejä voi olla yhtä aikaa 256. Värit kytketään värinumeroihin, joita silloin on 0 - 255. QBasicin oma keino on PALETTE-komento, mutta nopeampi (ja myös helpompi) tapa on asettaa värit OUT-komennon avulla. Huomaa, että värien asteikko VGA-tilassa on 0 - 63 eikä siis 0 - 255.
https://www.ohjelmointiputka.net/keskustelu/2177-paletti
https://www.ohjelmointiputka.net/keskustelu/1072-paletti-qb
https://www.ohjelmointiputka.net/koodivinkit/
https://www.ohjelmointiputka.net/koodivinkit/
no tässä samalla kysyn: miten qbasicissa saa kaksoispuskuroinnin päälle ja mitä se auttaa?
Löytyy myös tällainen:
https://www.ohjelmointiputka.net/koodivinkit/
Claw kirjoitti:
no tässä samalla kysyn: miten qbasicissa saa kaksoispuskuroinnin päälle ja mitä se auttaa?
QB omilla komennoilla taitaa olla melko mahdotonta QB hitauden ja sopivien funktioiden puutumisen takia.
Mutta konekielistä kirjastoa käyttämällä tuo onnistuu, esim. fawksin LameVGA hoitaa homman.
Eräissä näyttötiloissa (kuten SCREEN 7) QB tarjoaa tuplapuskuroinnin sivutuksen kautta (ks. PCOPY-komento) ihan suoraan. Muuten onkin sitten ehkä järkevämpi käyttää jotain kirjastoa. Pitäisi varmaan jossain vaiheessa koettaa vääntää tuohon LameVGA:n komento jolla QB:n omat piirto -ja lukukomennot voisi ohjata LameVGA:n bufferiin, näin tuplapuskuroinnin voisi lisätä jo olemassaoleviin ohjelmiin mahdollisimman helposti.
Kaksoispuskurointi auttaa siten, että sen avulla näyttö päivitetään vasta, kun uusi kuva on piirretty. Näin vältetään välkkymistä yms. Sitä ei tosiaan saa parempaan kuin SCREEN 7 tilaan. Pistät SCREEN-käskyn: SCREEN 7, 0, 0, 1
Ja sitten kun haluat päivittää piirretyn kuvan näytölle, pistät: PCOPY 0, 1
RGB:n löytää ainaki qbx:n ohjeesta screen-käskyn tienoilta. Jos on QBX, kirjoita screen ja paina f1 ja mene detailsiin ja skrollaa alas päin.
edit: oho ei löydäkään :D yritän ettiä sen teille...
editedit: se olikin PALETTE:n jelpissä. Tossa noin:
File Edit View Search Run Debug Calls Utility Options Help ┌────────────── HELP: PALETTE, PALETTE USING Statements Details ───────────┤↑├─┐ │ ■ To calculate a VGA color value, select the intensities of red, green, ↑ │ and blue. The intensity of a color is a number from 0 (low intensity) ░ │ to 63 (high intensity). Then use the following formula to calculate ░ │ the actual color number: ░ │ ░ │ color number = 65536 * blue + 256 * green + red ░ │ ░ │ This formula yields integer values from 0 to 4,144,959, but ░ │ because there are gaps in the range of color numbers, you should ░ │ use the formula rather than just select a number. ░ │ ■ When used with the IBM Analog Monochrome Monitor, the VGA color ░ │ values are converted to a gray-scale value by taking a weighted sum ░ │ of the red, blue, and green intensities: ░ │ ░ │ gray value = 11% blue + 59% green + 30% red ░ │ ░ │ For example, if the blue, green, and red intensities are 45, 20, │ and 20, the gray intensity value calculation would be ░ │ ░ │ gray value = (.11 * 45) + (.59 * 20) + (.30 * 20) = 22 ↓ ├───────────────────────────────── Untitled ───────────────────────────────┤↑├─┤ ├───────────────────────────────── Immediate ──────────────────────────────────┤ <Shift+F1=Help> <F6=Window> <Esc=Cancel> <Ctrl+F1=Next> <Alt+F1=Back> │ N
Tein kerran ihan omaa säätöä millä laskea tuon harmauden. Tein sen niin, että laskee RGB-värien keskiarvon ja katsoo sitten paljonko värit heittävät keskiarvosta, laskee ne yhteen ja siitä sain harmauden, mutta se kai ei aivan toimi niin.
Siis tarkoitat värin saturaatiota? Mäki oon joskus koittanu laskee sitä, mut se menee yli mun ymmärryksen (luultavasti liian helppo kaava). Etsin kaavoja jostain, mutta en tajunnut niistä paskaakaan.
Ideasi kuulostaa hyvältä... täytyypi koettaa joskus!
Toinen mysteeri on kuvan muuttaminen "grey scale" muotoon, eli harmaisiin väreihin. Tuotakaan en ole koskaan sisäistänyt, koska esim sininen on lähes musta, ja keltainen vaalea. Perus logiikalla sen pitäisi mennä niin että laskee värien keskiarvon, ja jokaiselle väriarvolle tulisi se keskiarvon väriarvo.
Jos joku tietää miten lasketaan RGB arvosta HUE ja SAT arvot, niin kertokoon minulle, tarvitsen sitä niin perkeleesti.
Niin ja eikös Windows-grafiikkaohjelmat näytä aina väristä ominaisuudet "sävy", "kirkkaus" ja "harmaus". Tuon harmauden nyt siis voi laskea tuolla kaavalla, mutta lasketaanko kirkkaus yksinkertaisesti laskemalla jokaisen värin kirkkaus yhteen. Tuohon sävyyn ei varmaan ole mitään kaavaa, koska sävyjen numerothan on sovittu, vai?
Värin valoisuuden saa: (suurin väriarvo + pienin väriarvo) / 2
Hmm... meni varmaan 6 tuntii keksiä tuo aikoinaan :P
Edit: kaikenlisäksi unohdan tuon jatkuvasti :D (äskenkin piti keksiä tuo uudelleen)
kaipaan vielä niitä HUE/SAT arvojen laskemisia ;>
Mitä ne on? en oo ikinä kuullukkaan niistä..
HSI: Hue Saturation Lightness. RGB to HLS (Foley and VanDam) max = maximum of RGB min = minimum of RGB l = (max+min) / 2 if max = min, S = 0, H = undefined ########## TÄMÄ if l <= 0.5, S = (max-min)/(max+min) else, S = (max-min)/(2 - max - min) delta = max-min if R = max, H = (G-B)/delta if G = max, H = 2 + (B-R)/delta if B = max, H = 4 + (R-G)/delta H = H * 60 if H < 0, H = H + 360 HLS to RGB (Foley and VanDam) if L <= 0.5, m2 = L * (1+S) else m2 = L + S - L * S m2 = 2 * L - m2 if S = 0 and H = undefined, R = G = B = L ########## TÄMÄ R = value(m1,m2,h+120) G = value(m1,m2,H) B = value(m1,m2,h-120) where value(a,b,c) is the following function value(n1,n2,hue) if hue > 360, hue = hue - 360 else if hue < 0, hue = hue + 360 if hue < 60, value = n1 + (n2 - n1) * hue / 60 else if hue < 180, value = n2 else if hue < 240, value = n1 + (n2 - n1) * (240 - hue) / 60 else value = n1 return value
Nuo merkityt rivit joku voisi kääntää PHP kielelle. Ja kaikki muut mitkä meni vituiks (jos meni?)
Ekassa merkityssä:
if max = min, S = 0, H = undefined
tarkoittaako tuo samaa kuin:
if(max == min){
S = 0;
H = undefined;
}
Tokasta merkitystä rivistä ei ole harmainta aavistustakaan... Tarkoitan tuota kohtaa missä on: R = G = B = L
Tässä se mitä sain aikaiseksi:
<?php $v[R] = 124; $v[G] = 53; $v[B] = 178; // RGB to HSL -> $max = max($v); $min = min($v); $L = ($max+$min)/2; if($max == $min){ $S = 0; $H = ""; } if($L <= 0.5){ $S = ($max-$min)/($max+$min); }else{ $S = ($max-$min)/(2-$max-$min); } $delta = $max-$min; if($v[R] == $max){ $H = ($v[G]-$v[B])/$delta; } if($v[G] == $max){ $H = 2+($v[B]-$v[R])/$delta; } if($v[B] == $max){ $H = 4+($v[R]-$v[G])/$delta; } $H = $H * 60; if($H < 0){ $H = $H + 360; } print"Hue: $H<br>Sat: $S<br>Light: $L"; // HSL to RGB -> if($L <= 0.5){ $m2 = $L * (1+$S); }else{ $m2 = $L + $S - $L * $S; } $m2 = 2 * $L - $m2; if($S == 0 && $H == ""){ $R = $G; $G = $B; $B = $L; } $R = value($m1, $m2, $H+120); $G = value($m1, $m2, $H); $B = value($m1, $m2, $H-120); print"<br><BR>R: $R<br>G: $G<br>B: $B<br>"; function value($n1, $n2, $hue){ if($hue > 360){ $hue = $hue - 360; }elseif($hue < 0){ $hue = $hue + 360; } if($hue < 60){ $value = $n1 + ($n2 - $n1) * $hue / 60; }elseif($hue < 180){ $value = $n2; }elseif($hue < 240){ $value = $n1 + ($n2 - $n1) * (240 - $hue) / 60; }else{ $value = $n1; } return $value; } ?>
Tulostaa:
Hue: 274.08 Sat: -0.54585152838428 Light: 115.5 R: 30.104 G: B: 53
Ainoastaan light toimii oikein.
Eli joku joka osaa, näyttäköön miten tuo oikeasti hoituu.
En nyt hirveän tarkasti katsonut koodiasi läpi mutta kyllä se suunnilleen kunnossa näyttäisi olevan. Kannattaa vaan muistaa, että R, G ja B arvot tulee antaa väliltä [0, 1], kuten myös L ja S. H eli hue sen sijaan annetaan (ja tulostetaan) kulmana (asteita) väliltä [0, 360]. Eli jos haluat nuo siihen perinteiseen 0-255 asteikkoon joudut tekemään pienen muutoksen jälkeenpäin.
lainaus:
Tokasta lihavoidusta rivistä ei ole harmainta aavistustakaan... Tarkoitan tuota kohtaa missä on: R = G = B = L
Se tarkoittaa vain sitä että R, G ja B kaikki saavat arvon L.
Kiitoksia paljon!
Nyt tuo RGB to HSL toimii moitteetta, vielä pitäisi saada tuo HSL to RGB toimimaan. Ideoita?
Tässä koodi:
<?php $H = (194/255)*360; // 273.882353 $S = 138/255; // 0.541176471 $L = 116/255; // 0.454901961 function value($n1, $n2, $hue){ if($hue > 360){ $hue = $hue - 360; }elseif($hue < 0){ $hue = $hue + 360; } if($hue < 60){ $value = $n1 + ($n2 - $n1) * $hue / 60; }elseif($hue < 180){ $value = $n2; }elseif($hue < 240){ $value = $n1 + ($n2 - $n1) * (240 - $hue) / 60; }else{ $value = $n1; } return $value; } if($L <= 0.5){ $m2 = $L * (1+$S); }else{ $m2 = $L + $S - $L * $S; } $m2 = 2 * $L - $m2; $R = value($m1, $m2, $H+120); $G = value($m1, $m2, $H); $B = value($m1, $m2, $H-120); if($S == 0 && $H == ""){ $R = $L; $G = $L; $B = $L; } print"<br><BR>R: $R<br>G: $G<br>B: $B<br>"; ?>
Tulostaa:
R: 0.11786525544474 G: B: 0.20871972318339
Jostain "oudosta" syystä G:n arvo ei tule ollenkaan.
Edit: ei näytä nuo muutkaan (R ja B) arvot olevan oikein.
Edit: $R = value($m1, $m2, $H+120);
$m1 muuttujaa ei edes aseteta koko scriptissä, miten helkutissa tuo voi sitten edes toimia :|
Aihe on jo aika vanha, joten et voi enää vastata siihen.