- Wstęp
- Mam wzór
- Trójkąt Sierpińskiego - 4 algorytmy
- Zbiór Mandelbrota
- Algorytm IFS
- Autor
|
Żółw ( w LOGO) idzie rysując (lub nie), obraca się w lewo (kąt dodatni) lub obraca się w prawo (kąt ujemny).
Nasz algorytm narysuje trójkąt Sierpińskiego, idąc rysując bez przerw, zaczynając w punkcie początkowym P (czerwony) kończąc w K (niebieski) po drodze stosując obroty o kąty ±60°.
Algorytm rysujący cały trójkąt zdefiniujemy obserwując aplet po lewej, dla wartości:
1° st=0 - całą figurę wykonamy budując "segment" A
tzn "idę skręcając w prawo"
2° st=1 - okazuje się, że "segment" A ma budowę rekurencyjną:
wg schematu:
A = + B - A - B +
natomiast "segment" B tzn "idę skręcając w lewo"
B = - A + B + A -
We wzorach na segment A i B przyjęto oznaczać obroty: + = O+60° i - = O-60°
Oto implementacja tego algorytmu
Typy parametrów:Graphics g, pkt2d p, double a, double fi, int st
int ramie_A(g, p, a, fi, st)
{
if(st==0)
{
fi+=Math.PI/3;
lo28.kursor(g,p);
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi-=Math.PI/3;
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi-=Math.PI/3;
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi+=Math.PI/3;
return 1;
}
fi+=Math.PI/3;
ramie_B(g,p,a/2,fi,st-1);
fi-=Math.PI/3;
ramie_A(g,p,a/2,fi,st-1);
fi-=Math.PI/3;
ramie_B(g,p,a/2,fi,st-1);
return 1;
}
|
int ramie_B(g, p, a, fi, st)
{
if(st==0)
{
fi-=Math.PI/3;
lo28.kursor(g,p);
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi+=Math.PI/3;
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi+=Math.PI/3;
p.x=p.x+0.5*a*Math.cos(fi);
p.y=p.y+0.5*a*Math.sin(fi);
lo28.kreska(g,p);
fi-=Math.PI/3;
return 1;
}
fi-=Math.PI/3;
ramie_A(g,p,a/2,fi,st-1);
fi+=Math.PI/3;
ramie_B(g,p,a/2,fi,st-1);
fi+=Math.PI/3;
ramie_A(g,p,a/2,fi,st-1);
return 1;
}
|
public void paint(g)
{
w.war(-7,-5);
ramie_A(g,w,bok,0,st);
}
|
|