Tervehdys kaikki,
Tömäsin pieneen laskennalliseen ongelmaan tekiessäni histogrammi näkymää softaani.
Elikkäs ajatellaan kuvitteelinen histogrammi näkymä joka piirtää dataa vastaavaa käyrää. Sanotaan, että data luetaan char taulukosta jonka koko on 100 -tavua.
Seuraavaks piirretään taulukossa oleva data käyräksi. Skaalaamisen olen ajatellut laskettavan ( leveys / taulukon_koko ). Eli sanotaan että ikkunan koko on 566.
Yhden pisteiden väliksi saamme koon 5.66. Piirrossa pikseli tosin piirretään kohtaan 5. Tämä tarkottaa sitä, että skaalaus ei mene oikein, koska ( 5 * 100 ) = 500. Elikkäs 66 pikseliä jää yli.
Kysymys kuuluukin. Millä lasku algoritmillä viivat saataisiin skaalattua oikein?
Tuskin siihen mitään algoritmiä tarvitaan vaan ihan ala-asteella opitulla jakolaskulla jaat "ikkunan koon" "sataan osaan". Eri asia on sitten haluatko pyöristää luvut alas-, ylöspäin vaiko miten haluatkaan tasapikseleille.
EI se niin voi olla. Mitä sitten jos lasku ei mee tasan? Kuten esimerkissäni oikeaan reunaan jää 66 pikselin rako! Ei ole hyvä näin.
Vai tarkotatko, että pisteiden etäisyys on staattisesti se 100 pikseliä esim.
Vinkki: 98 * 5,66 = 554,68 ~= 555.
kayttaja-3842: no tietenkin jos lasket jo valmiiksi "pyöristetyillä" luvuilla niin lopputulos ei voi olla kuin väärä.
Tässä siis esimerkkikuvat mainitsemallani tavalla sadalla pisteellä ja eri kokoisina:
http://games.terolepisto.net/graafi/
edit:
ja tietenkin itse voit käyttää pisteiden sijaan yhteneväistä viivaa, palkkeja, ympyröitä tai vaikka paloautoja.
Siis ideani pointtini olikin ettei pikseliä voi piirtää desimaaliin, mutta asiaan. Sain itse tuon toimimaan kuitenkin. Ja ratkaisu on skaalari kerroin. :)
Lebe80 kirjoitti:
Eri asia on sitten haluatko pyöristää luvut alas-, ylöspäin vaiko miten haluatkaan tasapikseleille.
Hö, älä tietenkään pyöristä sitä laskettua pikselin väliä.
Siis 5.66 * n = Xpaikka. Ainakaan VB:ssä ei tarvitse tuloakaan pyöristää vaan näyttö tekee sen automaattisesti.
jtha kirjoitti:
Ainakaan VB:ssä ei tarvitse tuloakaan pyöristää vaan näyttö tekee sen automaattisesti.
Minkä merkkinen/mallin näyttö?
kayttaja-3842 kirjoitti:
Siis ideani pointtini olikin ettei pikseliä voi piirtää desimaaliin, mutta asiaan. Sain itse tuon toimimaan kuitenkin. Ja ratkaisu on skaalari kerroin. :)
Kuulostaa purkalta. Datalla ei ole mitään tekemistä piirtämisen kanssa, eli voit laskea kaiken liukulukuina ja muuntaa koordinaatit vain piirtofunktiota kutsuessasi.
x = 123.456; y = 234.567; piirra((int) x, (int) y);
Voit laskea koko skaalauksen samalla kertaa:
piirra( (int) (piirto_x0 + piirto_w * (x - data_x0) / data_w), (int) (piirto_y0 + piirto_h * (y - data_y0) / data_h) );
Tässä siis x0 ja y0 ovat pienimmät arvot (kuvaajan kulma) ja w ja h ovat käytettävä lukuväli (kuvaajan koko).
tkok kirjoitti:
jtha kirjoitti:
Ainakaan VB:ssä ei tarvitse tuloakaan pyöristää vaan näyttö tekee sen automaattisesti.
Minkä merkkinen/mallin näyttö?
hmm, "näyttö" oli huono sana :-) Varmaan se pyöristyy jo esim. print-funktiossa. Kuitenkaan desimaaleista ei tarvitse välittää piirrettäessä VB:ssä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.