Miten lasketaan korkeuden tasainen pieneneminen?

Teen yhtä kuvaa Microsoft Paintilla. Lähtökuvion korkeus on 44 px, viimeisen kuvion korkeuden tulee olla 2 px. Näiden kahden koon välillä on 46 kuviota.

Toiveenani olisi korkeuden vähittäinen tippuminen 44 pikselistä 2 pikseliin siten, että välissä olevat 46 kuviota pienenisivät tasaisella (kiihtyvyydellä? / mikä on vastaava termi laskevien arvojen suhteen)? Vähän logaritmisen laskemisen tai Gaussin käyrän pienenemisen tapaan (en ole kovin hyvä matemaattisissa termeissä).

Tuleeko kellään ideoita mieleen, miten nuo voisi laskea? Pahoittelen, jos selitys oli sekava, voin vastata lisäkysymyksiin tarvittaessa.
7<50
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

PS: Nuo 46 tasaisesti pienenevää kuviota tulisivat yhteen pötköön alueelle, jonka korkeus on 310 px.

Päällimmäisenä olisi siis 44 px korkuinen neliö, sen alla nuo 46 neliötä, ja alimmaisena 2 px korkuinen neliö.

Äänestä

välejä on 47, joten laskeuma kullakin välillä on 42/47 pikseliä - pyöristettynä aina kokonaispikseliin, jos et käytä vektorigrafiikkaa.

Äänestä

Tulisko näin hyvät:

//y=44e^(-x^b / (45^b/ln(22)))
var b = 0.407;
var f = x=>Math.round(44*Math.exp(-(x**b)/((45**b)/Math.log(22))));
var a = new Array(46).fill(0).map((_,i)=>f(i));
console.log(a);

Tuo on siis Javascript koodia; voit suorittaa sitä selaimen consolissa (joka aukeaa F12:lla) ja vaihdella parametreja. Mutta tuo nykyinen siis tulostaa tällaiset luvut:

[44, 23, 18, 16, 14, 12, 11, 10, 10, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2]

Olisko sopivat?

Äänestä
  • Tajusin juuri, että tuon funktion f voi sieventää muotoon

    f(x) = 44*(1/22)^(x/45)^b

    Vakiota b vaihtelemalla saa eri muotoisia, mutta arvelin kun puhuit että korkeutta olisi 310px varattuna koko tornille, niin varmaan haluat niiden summautuvat tuohon arvoon ja näin käy b:n arvolla 0.407.

    Äänestä

  • minkkilaukku kirjoitti:

    Tajusin juuri, että tuon funktion f voi sieventää muotoon

    f(x) = 44*(1/22)^(x/45)^b

    Vakiota b vaihtelemalla saa eri muotoisia, mutta arvelin kun puhuit että korkeutta olisi 310px varattuna koko tornille, niin varmaan haluat niiden summautuvat tuohon arvoon ja näin käy b:n arvolla 0.407.

    Vai meneekö ne päällekkäin?
    No tässä vielä arvolla b=2 saatavat luvut:

    [44, 44, 44, 43, 43, 42, 42, 41, 40, 39, 38, 37, 35, 34, 33, 31, 30, 28, 27, 25, 24, 22, 21, 20, 18, 17, 16, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2]

    Sievennetty koodi on

    var b = 2;
    var f = x=>Math.round(44*(1/22)**(((x/45)**b)));
    var a = new Array(46).fill(0).map((_,i)=>f(i));
    console.log(a);

    Kopioi tuo konsoliin ja muuta b:n arvoa ja paina enter, niin se tulostaa luvut.

    Äänestä

  • Joo, tuo 30.12.2018 11:08 lähettämäsi kaava vastasi ainakin pikatarkastelulla sitä, millaista olin hakemassa.

    Kiitos avusta ja vinkeistä vastaisuuden varalle!

    Äänestä

Jos sä ihan perus paraabelia haluat käyttää niin voit selvittää kaavan vaikka Wolfram Alphalla:

https://www.wolframalpha.com

syöttämällä

interpolating polynomial( (0, 44) , (22, b), (45, 2) )

Tässä siis tuota keskimmäistä pistettä varioimalla saadaan erilaisia. Siis b:n arvo tarkoittaa minkä kokoinen keskimmäinen neliö on ja sitten neliöt asettuvat paraabelille.

Sehän antaa kaavan:

-(b x^2)/506 (45 b x)/506 (16 x^2)/345 - (1042 x)/345 44

Esim, jos b=30, niin:

-(49 x^2)/3795 - (1337 x)/3795 44

ja saadaan pisteet
[44, 44, 43, 43, 42, 42, 41, 41, 40, 40, 39, 39, 38, 37, 37, 36, 35, 34, 33, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 18, 17, 16, 15, 13, 12, 11, 9, 8, 6, 5, 4, 2]

Äänestä

Kommentoi aloitusta


Kuvankäsittelijä kirjoitti:

Teen yhtä kuvaa Microsoft Paintilla. Lähtökuvion korkeus on 44 px, viimeisen kuvion korkeuden tulee olla 2 px. Näiden kahden koon välillä on 46 kuviota.

Toiveenani olisi korkeuden vähittäinen tippuminen 44 pikselistä 2 pikseliin siten, että välissä olevat 46 kuviota pienenisivät tasaisella (kiihtyvyydellä? / mikä on vastaava termi laskevien arvojen suhteen)? Vähän logaritmisen laskemisen tai Gaussin käyrän pienenemisen tapaan (en ole kovin hyvä matemaattisissa termeissä).

Tuleeko kellään ideoita mieleen, miten nuo voisi laskea? Pahoittelen, jos selitys oli sekava, voin vastata lisäkysymyksiin tarvittaessa.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu