Grafika żółwia
Janusz Sobieraj - 28 LO

Trójkąt Sierpińskiego - algorytm z wykorzystaniem grafiki żółwia

Żół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:
st=0 - całą figurę wykonamy budując "segment" A
   tzn "idę skręcając w prawo"
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); 
}