Zasady rysowania rekurencyjnego.

0

Miałem ostatnio kolosa z PI i mieliśmy w pseudokodzie narysować fraktal używając komend turn(kat) , move(dlugosc) oraz rekurencji.W domu używałem do ćwiczenia fraktali biblioteki http://apcsteacher.com/reference/cpp/turtle_setup.htm.

Mieliśmy narysować takie drzewo

4

aha

0

Miałem ostatnio kolosa z PI i mieliśmy w pseudokodzie narysować fraktal używając komend turn(kat) , move(dlugosc) oraz rekurencji.W domu używałem do ćwiczenia fraktali biblioteki http://apcsteacher.com/reference/cpp/turtle_setup.htm.

Mieliśmy narysować takie drzewo user image gdzie funkcja jako argument pobiera stopnień rozgałęzienia oraz długość gałęzi początkowej.

Ja napisałem takie coś


#include "turtle.h"

void rysuj(turtle t,double bok,int n);

double k = 0.5;

int main()
{
   
	turtle t;

	rysuj(t,100,4);
	t.waitForMouseClick();
	return 0;
	
	system("pause");
}

void rysuj(turtle t,double bok,int n)
{
     if(n>0)
     {
            t.turn(90);
            sleep(200);
            t.move(bok);
            rysuj(t,bok*k,n-1);
            t.turn(180);
            sleep(200);
            t.move(2*bok);
            rysuj(t,bok*k,n-1);
             
     }
} 

I na komputerze wszystko mi działało jednak dostałem 3.
Byłem u Pani doktor się odwoływać ale ona stwierdziła

Sprawdziłam Pana (i pozostałych z Państwa) algorytm w Javie. Efekty są w załączniku.
Nie wiem na jakiej zasadzie działa biblioteka do C++, której Państwo użyli...ale nie jest to zgodne z zasadami rekurencyjnego rysowania...

Według niej kod powinien wyglądać tak:

 

WYWOŁANIE alg.koloTree(100, 3, 90, (float)0.7);
public void koloTree(int bok, int n, int alpha, float dim ){
if (n < 1) {
return;
}
right(alpha);
forward(bok);
koloTree((int)(bokdim), n-1, alpha, dim);
right(2
alpha);
forward(2bok);
koloTree((int)(bok
dim), n-1, alpha, dim);
back(bok); right(90);
}


I teraz mam pytanie czy biblioteka której ja używałam w rzeczywiście nie rysuje zgodnie z zasadami rekurencyjnego rysowania ?
0

ja na pewno bym Ci obniżył całą ocenę za to:
void rysuj(turtle t,double bok,int n);

powinno być przynajmniej tak:
void rysuj(turtle& t,double bok,int n);

za to kolejna ocena niżej:

        return 0;
 
        system("pause");

za zmienną globalną kolejna ocena w dół:
double k = 0.5;

myślę, że zasłużenie dostałeś 3.

0

Ale oceniała tylko algorytm rysowania. Całą reszta nie musiała być. Wiec czy ten algorytm jest dobry ?

0

jeśli te dwa parametry co są w jej wzorcowym programie, a w Twoim nie ma (int alpha, float dim) były w treści polecenia, to myślę, że o to właśnie chodzi. Jeśli algorytm rysuje prawidłowo dla większych liczb to prawie na pewno jest dobry. Jednak mimo wszystko odjąłbym Ci ocenę za kopiowanie rekurencyjnie obiektów.

0

Krw dzięki za pomoc ale tak jak pisałem chodziło o sam algorytm i ona sama powiedziała że według niej mój algorytm nie jest zgodny z zasadami rysowania rekurencyjnego. Według doktor to rysowanie z Javy jest prawidłowe. Cała reszta w tym wypadku dla nauczyciel jest nie istotna. Zamierzam dalej walczyć o poprawność mojego algorytmu. Tylko nie wiem jakie podać argumenty na to że mam racje. I czy w ogóle istnieją jakieś ogólne zasady rysowania rekurencyjnego o których doktor wspomniała.
W treści było polecenie jedyne że napisać pseudokod funkcji rekurencyjnej która przyjmuje długość boku początkowego i liczbę rozgałęzień

0

może spytaj jak ten kod powinien wyglądać w C++. Wykonujesz funkcję rekurencyjnie, w środku malujesz. Jeśli ocenia tylko algorytm rysujący, to poza brakiem tych dwóch parametrów wygląda tak samo. Może w Twoim głosie wyczuła, że kod skądś skopiowałeś.

0

Nawet nie było kopiować bo pisaliśmy to na kartkach. Zresztą więcej osób miało podobny problem. No nic pogadam jeszcze z drugim nauczycielem. Dzięki wielkie

0

tak w ogóle, to jak w zadaniu masz napisać funkcję która używa funkcji: turn(kat) , move(dlugosc) to używaj tych funkcji jakbyś już je miał/a i nie pisz całego kodu tylko funkcję rekurencyjną i sposób jej wywołania, a nie cały program. Czyli dokładnie tak jak podała Twoja nauczycielka.

0

Niestety ale po wprowadzeniu twojego algorytmu do programu grafiki żółwia figura nie jest malowana tak jak powinna, natomiast algorytm napisany przez panią doktor działa. W twoim algorytmie brakuje wywołania

back(bok);
right(90);

po drugim wywołaniu funkcji rekurencyjnej. Dodanie tego do twojego kodu działa.

0

Patrząc na ten kod, to on działa, ponieważ przekazuje się kopię aktualnego "żółwia" do kolejnych wywołań rekurencyjnych, dzięki czemu nie trzeba się wracać (lub algorytm jest niewłaściwy, mimo dobrego rysowania, bo używa więcej niż jednego żółwia).

1 użytkowników online, w tym zalogowanych: 0, gości: 1