Moi.
Teen ohjelmaa mikrokontrollerille, ja pitäisi piirtää ympyrä
graaffiseen LCD-näyttöön (128X128).
Kuinka lasken "sytytettävien" pikseleiden paikat (x ja y)?
Koordinaatteina syötetään ympyrän keskipisteen x ja y, sekä
ympyrän säde.
Tällä samalla kaavalla olisi tarkoitus saada myös 4 viivaa
ympyrän kehän laidalle, kuvaamaan kompassisuuntia (N,S,W,E).
Syötteeksi tuolle annataan siis kompassi suunta asteina.
Teen ohjelmaa PICC:llä, joten sin ja cos yms. ovat mahdollisia. Matikka ei ole vahvaa alaa, joten tietäjät kehiin ja vinkkejä antamaan.
Kiitos.
Ympyrän piirtohan nyt on ainaki sinillä ja cosilla älyttömän helppo.
Jonkummoista pseudoo hatusta:
/* sade on siis säde. Annan tässä kulman trigonometreille ** asteina, mutta radiaankis saa aste * pi / 180 */ wanha_x = keski_x + sade; wanha_y = keski_y; for (kulma = 0; kulma < 360; kulma++) { x = sade * cos(kulma); y = sade * sin(kulma); /* PiirraViiva on joku viivanpiirto. (alkux, alkuy, x, y) ** jos piirrettäs vaan pisteitä niin sitte pitäs kulma += 0.1 tms ** muuten tulee epätarkkaa */ PiirraViiva(wanha_x, wanha_y, x, y); wanha_x = x; wanha_y = y; }
Tota tokaa ongelmaas en oikein tajunnu...
Kenties jotenkin näin?
Nuo neljä viivaahan onnistuvat helposti vaikkapa jotenkin näin:
PiirraViiva(keski.x-sade-15, keski.y, keski.x-sade+15, keski.y); //tämä piirsi nyt sitten vasempaan reunaan 30 pikseliä pitkän viivan, tähän tapaan muutkin
No sin ja cos on vähän huono tapa, tulee ylimääräsiä pikseleitä tai reikiä mut kokeilepa vaikka Bresenhamin ympyrää
Miksei Pythagoraan lauseella ja for-silmukalla?
for X := 0 to Sade do begin Y := sqrt((Sade * Sade) - (X * X)); PiirraPikseli(KeskiX + X, KeskiY + Y); PiirraPikseli(KeskiX - X, KeskiY + Y); PiirraPikseli(KeskiX + X, KeskiY - Y); PiirraPikseli(KeskiX - X, KeskiY - Y); PiirraPikseli(KeskiX + Y, KeskiY + X); PiirraPikseli(KeskiX - Y, KeskiY + X); PiirraPikseli(KeskiX + Y, KeskiY - X); PiirraPikseli(KeskiX - Y, KeskiY - X); end;
Tuossa nyt jotkut pikselit piirretään kahteen kertaan, mutta haitanneeko tuo. Kauniita ympyröitä sillä ainakin saa. Harmi, että siellä on tuo neliöjuuri. Tietenkin tuota voi vielä optimoida.
sooda kirjoitti:
Tota tokaa ongelmaas en oikein tajunnu...
Ympyrän piirto on nyt OK. Kiitos kaikille.
Mutta sitten ne "asteviivat".
Eli ympyrän kehälle pitäisi piirtää pohjoinen, etelä, itä ja länsi viivat.
Syötteenähän on käytössä kopassilukema asteina (0-360 astetta), ympyrän säde, ympyrän keskipisteen x ja y.
Nuo viivat siis muuttavat paikkaansa kun asteluku muuttuu.
Löytyyköhän "helppoa" ratkaisua.
Toinenvaihtoehto on tehdä taulukko x ja y arvoista esim. 2 asteen välein. Tähän olen nyt päätymässä...
Helppo ratkaisu = trigonometria.
X = sin(Kulma); Y = cos(Kulma); // Eteen PiirraViiva(X * (Sade - 5), Y * (Sade - 5), X * (Sade + 5), Y * (Sade + 5)); // Taakse PiirraViiva(-X * (Sade - 5), -Y * (Sade - 5), -X * (Sade + 5), -Y * (Sade + 5)); // Oikealle PiirraViiva(Y * (Sade - 5), -X * (Sade - 5), Y * (Sade + 5), -X * (Sade + 5)); // Vasemmalle PiirraViiva(-Y * (Sade - 5), X * (Sade - 5), -Y * (Sade + 5), X * (Sade + 5));
Tein sattumalta tänään just ympyrän piirto aliohjelman vb:llä ihan vaan huvikseen.
public sub pallukka(x as single, y as single, r as single) pi=3.14 for i = 0 to 2*pi step 1/r x1=cos(i)*r y1=sin(i)*r pset (x+x1,y+y1) next i end sub
Kääntynee tarvitsemalle kielelle.
Metabolix kirjoitti:
Helppo ratkaisu = trigonometria.
Jostain syystä tuo ei kokeilussani toiminut kuin 0-asteella?
Lisäksi ainakin eteen ja taakse ristissä.
Pitänee siis tyytyä taulukkoon?
Muistat muuttaa ne asteet radiaaneiksi ennen trigonometriaa (ainakin niin pitää yleensä tehdä): Radiaanit = Asteet * (Pii / 180);
Ristissä voi olla, mutta onko se nyt ongelma, vaihdat niiden paikkoja vain. Ne menevät ristiin puhtaasti sen takia, että tyhmät ihmiset eivät ole voineet kaikki käyttää samaa koordinaatistoa, kun on pitänyt koneille laittaa se nurinpäin (eli Y kasvaa alas).
Metabolix kirjoitti:
Muistat muuttaa ne asteet radiaaneiksi ennen trigonometriaa (ainakin niin pitää yleensä tehdä): Radiaanit = Asteet * (Pii / 180);
No tuostahan se tietysti johtuu!?!?
Syötin uunona suoraan asteen...
Aamulla kokeilen uudestaan...
PS. Ei se ristissä olo haittaa, ja kiitos.
Molskis.
Joko tuo kontrolleri ei (tosin ei exelissäkään luvut täsmää) laske oikein, tai sitten puhutaan eri asiasta.
Eli haen "kaavaa" jolla lasken ympyrän kehälle ilmansuunta
viivat. Kompassi suunnalla 0-astetta, pohjoinen on ylhäällä,
etelä alhaalla jne. Tämä toimii OK Metabolixen kaavoilla.
Kun kompassi suunta on esim. 45-astetta, pohjoisviivan pitäisi siirtyä vasemmalle 45-astetta jne.
Tätä en saanut toimimaan. Pitäisikö kuitenkon ko. kaavoilla onnistua?
Itse ympyrän piirrän tuolla Bresenhamin jutulla...
Taisin keksiä!
Exelissä tämä näyttää hyvältä, pitää vielä testata
kontrollerilla.
X=(COS((ASTE*PII)/180)*SÄDE)+SÄDE Y=SÄDE-(SIN((ASTE*PII)/180)*SÄDE) X1=(COS((ASTE*PII)/180)*(SÄDE-5))+(SÄDE-5) Y1=(SÄDE-5)-(SIN((ASTE*PII)/180)*(SÄDE-5)) PIIRRÄVIVA(X,Y,X1,Y1)
Ei tuo kontrolleri kykene oikein laskemaan noita arvoja.
Saampahan tuolla kaavalla luvut taulukkoon.
Kiitos kaikille osallistujille.
Päätän raporttini täältä tähän...
Miks kaikki pitää tehä niin vaikeaks..?
esim. vb:ssä:
'alussa alustetaan sinit ja kosinit hakutaulukkoon dim s(359) as single dim c(359) as single dim pi as single pi=atn(1)*4 'tai 3.14.. 'asetetaan piille arvo for i = 0 to 359 'käydään kaikki asteet läpi s(i)=sin(i*(pi/180)) 'lasketaan i kulmaa vastaava sinin arvo c(i)=cos(i*(pi/180)) 'sama kosinille next i 'sitten piirretään ympyrä jonka keskipiste on kohdassa(x,y) ja jonka säde on r circle (x, y), r 'ja viimesenä piirretään joka viidennelle kulmalle viiva ympyrän kehällä for i = 0 to 359 step 5 pituus=5 x1=x+cos(i)*r 'piste kehällä y1=y+sin(i)*r x2=x+cos(i)*(r+pituus) 'piste kehän ulkopuolella y2=y+sin(i)*(r+pituus) line (x1, y1)-(x2, y2) next i
Pitäis toimia, mutta kun en ehtinyt kokeilemaan, niin en tiedä.
dooDle kirjoitti:
Miks kaikki pitää tehä niin vaikeaks..?
Koska se on nopeampaa.
jjude kirjoitti:
Pitäisikö kuitenkon ko. kaavoilla onnistua?
Kyllä, juuri sitä varten se kaava on olemassa. Ilmeisesti ei vain jostakin syystä toimi juuri sinulla juuri tuossa kontrollerissa.
Ja kun dooDle ei näköjään tajunnut, tässä ei ollut VB:stä kyse vaan jostakin mikrokontrollerista, jossa ei valmista ympyräfunktiota ole. Ja kiinnostaisi tietää, mitä järkeä on laskea kaikille tasa-asteille sini ja kosini taulukkoon, kun niitä taulukon arvoja ei edes käytetä missään?
Hups! :D
VBllä tein kyllä ihen tarkotuksella("esim. vb:ssä"). Luulis kaikkien osaavan kääntää tarvittavalle kielelle. Mutta unohdimpa tuon taulukko jutun. Ois pitäny käyttää niitä taulukoita, mutta kun muisti on niin hatara. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.