Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP, VBA: RBG qbasicille ?

Sivun loppuun

Claw [06.04.2004 17:50:01]

#

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.

Antti Laaksonen [06.04.2004 18:11:57]

#

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/23854-qb-paletin-käyttöä
https://www.ohjelmointiputka.net/koodivinkit/23435-qb-nopea-paletin-muuttaminen

Claw [06.04.2004 19:57:33]

#

no tässä samalla kysyn: miten qbasicissa saa kaksoispuskuroinnin päälle ja mitä se auttaa?

Jogge [06.04.2004 20:00:09]

#

Löytyy myös tällainen:
https://www.ohjelmointiputka.net/koodivinkit/23759-qb-pieni-värihöskä-qb-lle

zacura [07.04.2004 20:03:59]

#

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.

thefox [07.04.2004 20:22:13]

#

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.

hunajavohveli [07.04.2004 20:27:53]

#

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

sooda [08.04.2004 08:55:30]

#

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

hunajavohveli [08.04.2004 14:14:45]

#

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.

T.M. [08.04.2004 14:28:09]

#

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.

hunajavohveli [08.04.2004 14:31:25]

#

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?

T.M. [08.04.2004 15:32:46]

#

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

Claw [08.04.2004 22:56:01]

#

Mitä ne on? en oo ikinä kuullukkaan niistä..

thefox [09.04.2004 00:24:00]

#

http://wwwzenger.informatik.tu-muenchen.de/lehre/vorlesungen/graphik/info/csc/COL_26.htm

T.M. [09.04.2004 00:45:18]

#

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.

thefox [10.04.2004 00:07:31]

#

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.

T.M. [10.04.2004 12:35:13]

#

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 :|


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta