Jump to content

Sierpinski curve: Difference between revisions

m
m (→‎{{header|zkl}}: added code)
m (→‎{{header|zkl}}: generalize)
Line 427:
Uses Image Magick and
the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl
<lang zkl>sierpinskiArrowheadCurvesierpinskiCurve(5) : turtle(_,45,45); // n=5 --> 11,606 characters
 
fcn sierpinskiCurve(order){
fcn sierpinskiArrowheadCurve(n){ // Lindenmayer system --> Data of As & Bs
LSystem("F--XF--F--XF",Dictionary("X","XF+G+XF--F--XF+G+X"), order)
var [const] A="AF+G+AF--F--AF+G+A", B=""; // Production rules
}
var [const] Axiom="F--AF--F--AF";
fcn LSystem(axiom,rules,order){ // Lindenmayer system
buf1,buf2 := Data(Void,Axiomaxiom).howza(3), Data().howza(3); // characters
do(norder){
buf1.pump(buf2.clear(),fcn'wrap(c){ if(ca:=="A") A else ifrules.find(c=="B")) Ba else c });
t:=buf1; buf1=buf2; buf2=t; // swap buffers
}
buf1
buf1 // n=5 --> 11,606 characters
}
 
fcn turtle(curve,angle,startAngle){ // Turtle with that canangles turnin +-45*degrees
const D=10.0, a45=45;
dir:=startAngle;
dir:=a45; // start direction depends on order
img,color := PPM(800,800), 0x00ff00; // green on black
x,y := 15, img.h - x;
foreach c in (curve){ // A & B are no-op during drawing
switch(c){
case("F","G"){ // draw forward
Line 451 ⟶ 452:
img.line(x,y, (x+=a.round()),(y+=b.round()), color)
}
case("+"){ dir=(dir + a45angle)%360; } // turn left 45*angle
case("-"){ dir=(dir - a45angle)%360; } // turn right 45*angle
}
}
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.