Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Ympyrän piirto

Sivun loppuun

jjude [25.02.2005 12:25:11]

#

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.

sooda [25.02.2005 12:35:20]

#

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

hunajavohveli [26.02.2005 10:17:27]

#

Kenties jotenkin näin?

Heikki [26.02.2005 10:34:00]

#

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

tejeez [26.02.2005 10:53:58]

#

No sin ja cos on vähän huono tapa, tulee ylimääräsiä pikseleitä tai reikiä mut kokeilepa vaikka Bresenhamin ympyrää

Metabolix [26.02.2005 16:11:40]

#

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.

jjude [27.02.2005 14:24:53]

#

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ä...

Metabolix [27.02.2005 19:25:02]

#

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

dooDle [27.02.2005 19:40:37]

#

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.

jjude [27.02.2005 23:44:30]

#

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?

Metabolix [28.02.2005 00:06:02]

#

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).

jjude [28.02.2005 00:11:53]

#

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.

jjude [28.02.2005 13:21:44]

#

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

jjude [01.03.2005 10:48:50]

#

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)

jjude [01.03.2005 12:13:46]

#

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

dooDle [01.03.2005 14:35:14]

#

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ä.

hunajavohveli [06.03.2005 13:26:58]

#

dooDle kirjoitti:

Miks kaikki pitää tehä niin vaikeaks..?

Koska se on nopeampaa.

Metabolix [06.03.2005 14:20:33]

#

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?

dooDle [06.03.2005 18:08:29]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta