Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Arvon skaalaus 2 arvon välille epälineaarisesti

Synomi [12.06.2012 12:17:39]

#

Olisi tarvetta skaalata arvo "järkevästi" kahden arvon välille, siten että kun arvo on suuri ei sen skaalatun arvon muutos kasva enään niin paljoa.

Eli käytännössä arvo jonka haluan skaalattavan on välillä 0-730 ja se pitää skaalata välille 40-415. Yleensä normaalisti arvo on kumminkin 0-300 luokilla joten haluaisin tuon välin vievän välistä 40-415 n. 75%, eli mitä suuremmaksi arvo siis menee sitä vähemmän se muuttuisi korkeammalla. Ei ole paljoa matiikkaa tullu pyöritettyä lähiaikoina niin on vähän pihalla mitä algoritmejä tuohon käyttäisi.

Eli suurinpiirtein siten että:
arvon ollessa 0 siitä skaalautuu arvo 40,
arvon ollessa 300 siitä skaalautuu arvo 320,
ja arvon ollessa 730 siitä skaalautuu arvo 415.

Tuo väli 40-415 on pixeleitä johon tietty elementti sijoittuu ruudulla korkeus suunnassa.

Grez [12.06.2012 12:20:38]

#

tulos = arvo<300 ? (40+arvo*28/30) : 320+(arvo-300)*95/430

Metabolix [12.06.2012 13:18:25]

#

Porrastuksen välttämiseksi käyttäisin itse murtopotensseja tai logaritmia.

Yleisesti ottaen skaalaus onnistuu niin, että keksit jonkin aidosti kasvavan funktion f(x) ja sovellat sitä näin:

min = 0
max = 730
tulos(min) = 40
tulos(max) = 415
tulos(x) = tulos(min) + (f(x) - f(min)) / (f(max) - f(min)) * (tulos(max) - tulos(min))

Esimerkiksi JavaScriptilla toteutus voisi olla tällainen:

function f(x) {
	return Math.pow(x, 0.3285155592603834)
}
function tulos(x) {
	var min = 0
	var max = 730
	if (x == min) return 40
	if (x == max) return 415
	return tulos(min) + (f(x) - f(min)) / (f(max) - f(min)) * (tulos(max) - tulos(min))
}
alert([tulos(0), tulos(300), tulos(730)])

Synomi [12.06.2012 13:21:04]

#

Grez kirjoitti:

tulos = arvo<300 ? (40+arvo*28/30) : 320+(arvo-300)*95/430

Joo kiitoksia tosta, näyttää toimivan tarpeen mukaisesti, eikä tuota >300 muutosta huomaa pahemmin kyseisessä sovelluksessa. Itse olisin aatellut että tarttee jotain potenssejakin, mutta näyttäähän se onnistuvan tuolleenkin sitten.

Lisäys:

Metabolix kirjoitti:

Porrastuksen välttämiseksi käyttäisin itse murtopotensseja tai logaritmia.

No joo kieltämättä tuommosta potensseihin perustuvaa systeemiä sitä etti, nuin monimutkanen sen en olisi aatellut kyllä olevan, tuosta kun ei paljoa tajua. Mutta hyvin se toimii et kiitos tuostakin.

Metabolix [12.06.2012 13:54:05]

#

Synomi kirjoitti:

No joo kieltämättä tuommosta potensseihin perustuvaa systeemiä sitä etti, nuin monimutkanen sen en olisi aatellut kyllä olevan, tuosta kun ei paljoa tajua.

Tein ratkaisun omasta mielestäni helpommalla tavalla, eli ensin kirjoitin geneerisen skaalausfunktion, jossa ainoat näkyvät luvut ovat antamasi välin päätepisteet, ja sitten kaivoin tuon maagisen vakion, jonka ansiosta tulos(300) = 320.

Tietenkin homman voi viimeistellä laskemalla valmiiksi kaiken paitsi kohdan f(x). Silloin kaavasta tulee aivan yksinkertainen:

function tulos(x) {
	return 40 + Math.pow(x, 0.3285155592603834) * 42.99175330121286
}

User137 [12.06.2012 21:37:12]

#

Itse käytän tällasta funktiota:

function Smoothen(n: single): single;
begin
  if n<0 then n:=0
  else if n>1 then n:=1;
  Smoothen:=0.5-cos(n*pi)*0.5;
end;

n on joku luku väliltä 0..1, ja paluuarvo on myös. Tuolla välillä funktion kuvaaja näyttäis aallolta joka alkaa ja loppuu "hitaasti". Et välttämättä halunnut käyrän alkavan hitaasti... Pikku muutoksella saa kyllä tuon kosinifunktion vaiheen siirrettyä. (tai ehkä sini toimis siihen suoraan)

lainaus:

0-730 ja se pitää skaalata välille 40-415

vastaus = 40+Smoothen(luku/730)*(415-40);

Synomi [12.06.2012 23:50:52]

#

Laitoin vähä vertauksee nuo miten ne toimii: http://q-q.name/skaalaustest

Punasen yli menevä ja keltaiset pallot on sitä ns. turhaa osuutta joka on pakollinen olla, mut harvemmin käytössä, tavote olisi siis saada tuo sitä ennen oleva osuus parhaiten tasasesti skaalattua, mutta viivan yli menevässä kohdassakaan ei saisi olla kovin suuri hyppy. Kylhän nuo iha hyviä käyriä tälläkin hetkellä. Kolmannessa nyt aika paljon turhaa keltasta on ennenkö menee punaselle.

Tietty tuossa tokassa vois alussa lähtä liikkeelle vähä hitaammin, näyttäis saavan pienilläki arvolla heti suhkot suuria arvoja, mutta voi mennä hankalaks.

Vastaus

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

Tietoa sivustosta