» »

[JAVA] [naloga]Rekurzivna metoda

[JAVA] [naloga]Rekurzivna metoda

dellorto ::

Lep pozdrav!
Z programiranjem sem se začel ukvarjati šele pred kratkim in potrebujem pomoč pri tejle nalogi(mi nekako ne rata:D );

Sestavi applet, ki kot parameter dobi naravno število n, ter nariše sliko reda n. Na spodnjih slikah so prikazane slike redov 0, 1 in 2. Največji krog naj ima središče v sredini appleta, polmer pa takšen, da je od najbližjega roba oddaljen 10 točk.

blaz_ ::

Zivjo

Tole je bila ena izmed nalog na FMF.
Kot pomoc pa naj ti povem le, da se da to nalogo resiti v 35-ih vrsticah in ni tezka.

Primercek rekurzije:

public static void(Graphics g, int n, int x, int y, int r){
g.drawOval(x,y,r,r);
if (n > 0)
{ //Kličemo rekurzije...
ovalR(g,(int)(n-1),x+5,y+5,r-10);
}
}

kaj naredi ta metoda pogruntaj sam. :)

Vec ne smem izdati.

lp blaz
Ko tehnologija odpove, uporabi macolo.

Minotaurus ::

Zivijo!

Da se ga v 25 :D in manj.

Tele graficne rekurzije najbolje napises takole. (Skusal sem napraviti nekaksen kuharski recept ;)

1. korak: Najprej napisi metodo, ki ti narise sliko reda 0. To je preprosta metoda, ki ji pac podas Graphics g, x0, y0 in r in ti narise krog s temi podatki (r je radij kroga). To ne bi smelo biti tezko. Potem v definiciji metode dodas se parameter n (public static void Krogi(Graphics g, int x0, int y0, int r, int n)).

2. korak: Potem glede na x0, y0 in r skusas dolocit nove x0, y0 in r iz katerih bos klical novo rekurzijo. To najbolje naredis, ce primerjas sliko reda 0 in 1 in se vprasat, kam moras postaviti nove kroge in s kaksnim radijem, da bos dobil novo sliko. V tem primeru si bos moral pomagati z enakostranicnim trikotnikom (visina je 0.5 * a * koren iz 3, ce je a stranica trikotnika).

3. korak: Napises klice nove rekurzije, s parametri g, xn, yn, r in n-1 (n-1 zato, da bos lahko v naslednjem koraku lahko poskrbel, da se ti rekurzija zakljuci).

4. korak: Poskrbis, da se ti rekurzija konca. To naredis s pomocjo n - ja. Pred klicem rekurzij dodas stavek, ki ti klice rekurzije samo takrat, ko je n>0. N bo namrec z vsakim novim klicem manjsi in ko bo n = 0, se bo rekurzija nehala klicati in se bo ustavila.

Za demonstracijo bom citiral blaza (ce lahko):

public static void ovalR(Graphics g, int n, int x, int y, int r){
g.drawOval(x,y,r,r); // to je prvi korak (s tem da pomeni T(x,y) zgornji levi kot in ne sredisca kroga!
if (n > 0){ //dodamo if stavek, da se rekurzija sploh konca - 4. korak
//Tukaj bos moral izracunati nove koordinate sredisca in radij - 2. korak
//Kličemo rekurzije... - 3. korak
ovalR(g,(int)(n-1),x+5,y+5,r-10);
}
}

5. korak: Na koncu poklicemo iz metode Paint tole Rekurzijo z zacetnimi parametri (x0, y0 - koordinati sredisca, r - zacetni radij in n stopnja).

public void paint(Graphics g)
{
int n=2;
int x0 = 200;
int y0 = 200;
int r = 200;
ovalR(g,n,x0,y0,r);
}

Upam da sva ti dovolj pomagala.

LP, Minotaurus

dellorto ::

Hval za izčrpne odgovore.
Vprašal bi še tole:
-kako narišeš krog čez cel applet(da je lepo na sredini tudi ko applet razširiš)
-kako napisat koordinate notranjih krogov, ker drawOval zahteva int

OwcA ::

kako narišeš krog čez cel applet(da je lepo na sredini tudi ko applet razširiš)

Malo pogledaš dogodke za applet in ugotoviš, kaj se zgodi, ob spremembi velikosti, nato ustrezno ukrepaš (in seveda applet "povprašaš" po novih dimenzijah).

kako napisat koordinate notranjih krogov, ker drawOval zahteva int

Pretvoriš v ustrezen tip (in s tem tudi zaokrožiš).
Otroška radovednost - gonilo napredka.

Minotaurus ::

Za postavljanje na sredino uporabis metodi getWidth in getHeight, ki ti povesta visino in sirino appleta. Ce hoces, da je krog na sredini, moras vzeti polovico. Za r pa seveda vzames tistega, ki je manjsi.

int x0 = getWidth()/2;
int y0 = getHeight()/2;

Zaokrozevanje si bi pa lahko prebral v knjigi oz. poslusal na predavanjih.

g.drawOval((int)x0, (int)y0 ...); //ti odbije decimalke

(int) x0+0.5; //ti pa zaokrozi
There is no place like /home.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# - domača naloga

Oddelek: Programiranje
162105 (1646) IceBoX
»

4 v vrsto [java pomoč]

Oddelek: Programiranje
81416 (1243) Spura
»

java minolovec

Oddelek: Programiranje
71465 (1316) xordie
»

[Java] Liha potenca

Oddelek: Programiranje
81782 (1676) bijonda
»

[Java] Grafika

Oddelek: Programiranje
91419 (1186) SkIDiver

Več podobnih tem