-------------------- to main ; Carpet 3d_frame sphc -81 -81 0 7 draw 163 4 end to draw :side :level if :level<1[stop] repeat 4[shape rt 90] fill_it end to shape draw :side/3 :level-1 fd :side/3 draw :side/3 :level-1 fd 2*:side/3 end to fill_it pu rt 45 fd .7*:side setfc 5-:level fill bk .7*:side lt 45 pd end to procs ed[main draw shape fill_it procs] end -------------------- to main ; Cones 3d_frame setpc 6 pu for[rad 32 4 -2][draw :rad] end to draw :rad for[i 1 6][ seth :i*60 fd 2*:rad rt 45 pd arc 270 :rad pu home] setfc(se 8*:rad-1 0 0) fill end to procs ed[main draw procs] end -------------------- to main ; Arabesq 3d_frame sphc -77 -77 0 4 setpensize[5 5] draw 22 sphc -77 -77 0 7 setpensize[3 3] draw 22 sphc -77 -77 0 6 setpensize[1 1] draw 22 end to draw :s outer link inner end to outer u 3*:s r 2*:s jump r 4*:s d 3*:s l 3*:s u 2*:s jump u 4*:s r 3*:s d 3*:s l 2*:s jump l 4*:s u 3*:s r 3*:s d 2*:s jump d 4*:s l 3*:s end to link pu u :s r :s pd end to inner u :s r :s jump r 3*:s d :s l :s u :s jump u 3*:s r :s d :s l :s jump l 3*:s u :s r :s d :s jump d 3*:s l :s end to jump pu fd :s pd end to u :size seth 0 fd :size end to d :size seth 180 fd :size end to l :size seth 270 fd :size end to r :size seth 90 fd :size end to procs ed[main draw outer link inner jump u d r l procs] end -------------------- to main ; Bugs 3d_frame pu init 10 end to init :num make "bugs(array :num 0) for[i 0 :num-1][ fd 95 setitem :i :bugs pos bk 95 rt 360/:num] poly move 0 end to poly setpc 1 setpensize[2 2] for[current 0 :num-1][ pu setpos item :current :bugs pd setpos item next :bugs] setpc 6 setpensize[1 1] end to move :current go item :current :bugs item next :bugs fd 1 if equalp :num 1+:current[ if lessp distance[0 0] 1.5[stop]] setitem :current :bugs pos move next end to go :pos :head pu setpos :pos seth towards :head pd end to next op remainder 1+:current :num end to procs ed[main init poly move go next procs] end -------------------- to main ; Sin_Cos by Olga 3d_frame setpc 4 patterns 3 4 2 end to patterns :a :b :s form.arrays draw 8 end to form.arrays ; forms arrays of x-y coordinates ; according the to trig formulas make "xarr(array 361 0) make "yarr(array 361 0) for[i 0 360][ setitem :i :xarr 90*(sin 5*:i)*(cos :a*:i) setitem :i :yarr 90*(cos 5*:i)*(sin :b*:i)] end to draw :k ; each i-th point is joined with ; point number i+k, thus ; different parterns are formed for[i 0 360-:k][ setxy item :i :xarr item :i :yarr setxy item :i+:k :xarr item :i+:k :yarr] end to procs ed [main patterns form.arrays draw procs] end -------------------- to main ; Cardio 3d_frame setpc 6 draw 35 end to draw :rad sph 0 23 90 pu repeat 24[fd :rad pd circle distance se 0 23+:rad pu bk :rad rt 360/24] end to procs ed[main draw procs] end -------------------- to main ; Cubes 3d_frame sphc -77 -44 0 6 draw 15 end to draw :size repeat 2[lup] lt 60 fd 6*:size rt 60 fd 3*:size lup rup fd 3*:size lt 120 fd 3*:size rt 60 fd 3*:size rt 120 rup fd 3*:size lt 120 fd 3*:size rt 120 rup rup lup lt 120 fd 3*:size rt 60 lup rt 60 lup bk 3*:size lt 60 rup fd 3*:size lt 120 rup end to lup repeat 3[3lup pu bk 3*:size rt 120 fd :size lt 120 pd] end to 3lup ; 3 lines up repeat 3[1lup pu fd :size pd] end to 1lup repeat 2[fd :size rt 120 fd :size rt 60] end to rup ; row up repeat 3[3rup pu bk 3*:size rt 60 fd :size lt 60 pd] end to 3rup ; 3 rows up repeat 3[1rup pu fd :size pd] end to 1rup repeat 2[fd :size rt 60 fd :size rt 120] end to procs ed[main draw lup 3lup 1lup rup 3rup 1rup procs] end -------------------- to main ; Cubic by Olga 3d_frame setpensize[3 3] sphc -26 -23 0 4 draw 32 setpensize[1 1] sphc -26 -23 0 6 draw 32 end to draw :a hexa6 :a fd :a rt 60 fd :a lt 60 hexa6 :a lt 60 bk :a rt 60 bk :a hexa6 :a end to hexa6 :a repeat 6[hexa :a rt 60] end to hexa :a repeat 6[fd :a rt 60] end to procs ed[main draw hexa6 hexa procs] end -------------------- to main ; Yinyang 3d_frame draw 80 end to draw :rad setpc 6 circle :rad sph 0 :rad 90 arcr 180 :rad/2 arcl 180 :rad/2 setfc 1 sp 0 .75*:rad fill setfc 7 sp 0 -.75*:rad fill eyes end to eyes setfc 1 sp 0 -:rad/2 circle :rad/10 fill setfc 7 sp 0 :rad/2 circle :rad/10 fill end to procs ed[main draw eyes procs] end -------------------- to main ; Sun 3d_frame sphc 56 -80 0 7 repeat 9[draw 34 rt 160] fill_it end to draw :rad repeat 2[arcl 90 :rad arcr 90 :rad] end to fill_it pu home setfc 6 repeat 9[fd 40 fill bk 40 rt 360/9] setfc 1 repeat 9[fd 20 fill bk 20 rt 360/9] rt 15 setfc 3 repeat 9[fd 16 fill bk 16 rt 360/9] setfc 4 fill end to procs ed[main draw fill_it procs] end -------------------- to main ; Escher 3d_frame draw 45 fill_it end to draw :size setpc 6 pu setxy .75*:size -.75*:size pd repeat 3[part :size fd 1.5*:size lt 120] end to part :size fd 2*:size lt 120 fd 3*:size rt 120 fd :size/2 rt 60 fd 3.5*:size rt 120 fd 3*:size rt 120 fd :size/2 rt 60 end to fill_it sph 10 0 0 pu repeat 3[fd 51 setfc(se 63+repcount*64 0 0) fill bk 45 rt 120] end to procs ed[main draw part fill_it procs] end -------------------- to main ; Darts 3d_frame setpc 7 draw setfc 4 pu fill_it end to draw for[rad 90 30 -30][circle :rad setfc 14 fill] setpc 0 repeat 12[fd 90 bk 90 rt 30] ; rays end to fill_it repeat 6[seth 15+repcount*60 fd 45 fill home] repeat 6[seth 45+repcount*60 fd 15 fill fd 60 fill home] end to procs ed[main draw fill_it procs] end -------------------- to main ; Turtle 3d_frame do 70 end to do :size legs pu fd :size/2 pd repeat 5[top] eyes end to legs sph -.81*:size -.3*:size 18 repeat 5[pu fd :size/3 lt 108 penta :size/3 rt 108 pu fd 2*:size/3 rt 72] end to top fd :size/2 rt 72 fd :size/2 rt 90 fd .3718*:size rt 54 fd .3718*:size rt 54 fd .3718*:size rt 90 fd :size/2 rt 72 fd :size/2 end to eyes pu fd .85*:size rt 72 fd :size/4 penta :size/16 eyefill fd :size/5 penta :size/16 eyefill fill_it end to eyefill setfc 4 pu rt 36 fd 3 fill bk 3 lt 36 end to penta :size setpc 2 pd repeat 5[fd :size rt 72] end to fill_it setfc 10 pu home fill seth 36 repeat 5[fd :size/2 fill bk :size/2 rt 72] seth 0 repeat 5[fd :size fill bk :size rt 72] end to procs ed[main do legs top eyes eyefill penta fill_it procs] end -------------------- to main ; Gasket 3d_frame pu select rndvertex 0 end to select :pnt :count setxy x y if 5<:count[setpixel 4] select rndvertex 1+:count end to rndvertex op pick[ [-162 162][0 162][162 162] [-162 0] [162 0] [-162 -162][0 -162][162 -162]] end to x op(xcor+item 1 :pnt)/3 end to y op(ycor+item 2 :pnt)/3 end to procs ed[main select rndvertex x y procs] end -------------------- to main ; Corset 3d_frame setscrunch 1 .4 sphc -58 150 0 3 pu repeat 36[fd 6 rt 6] pd draw pos heading [-58 -150] 0 0 end to draw :pos1 :head1 :pos2 :head2 :counter if :counter>120[stop] setpos :pos1 seth :head1 fd 6 rt 6 draw :pos2 :head2 pos heading 1+:counter end to procs ed[main draw procs] end -------------------- to main ; Mgndvd2 by Olga 3d_frame setpc 3 setpensize[2 2] draw 155 100 end to draw :a :b repeat 6[rt_strip repcount lt_strip repcount] end to rt_strip :u pu home seth(:u-1)*60 bk :a/sqrt 3 rt 30 pd fd :a/3 pu fd h pd fd :a/3 fd :a/3-h pu home seth(:u-1)*60 bk :b/sqrt 3 rt 30 pd fd :b/3-h pu fd h pd fd 2*:b/3 end to lt_strip :u pu home seth(:u-1)*60 bk :a/sqrt 3 lt 30 pd fd :a/3 fd :a/3-h pu fd h pd fd :a/3 pu home seth(:u-1)*60 bk :b/sqrt 3 lt 30 pd fd 2*:b/3 pu fd h pd fd :b/3-h end to h op (:a-:b)/2 end to procs ed[main draw rt_strip lt_strip h procs] end -------------------- to main ; Lissajous 3d_frame setpc 6 lissa 80 18 19 end to lissa :mult :a :b for[x 0 360][ setxy :mult*sin :a*:x :mult*sin :b*:x] end to procs ed[main lissa procs] end -------------------- to main ; Jellyfish by Olga 3d_frame do 90 2 4 3 0 end to do :r :k :a :b :t if :t>360[stop] setpc(se random 256 random 256 random 256) sp 0 80 setxy x y setpensize[4 4] setpc 4 fd 0 setpensize[1 1] do :r :k :a :b :t+2*pi/10 end to x op :r*(sin :k*:t)*(cos :a*:t) end to y op :r*(cos :k*:t)*(sin :b*:t) end to procs ed[main do x y procs] end -------------------------------- to main ; Menorah by Olga 3d_frame sphc 0 -20 0 7 draw 51 end to draw :size stand waves candles end to stand pu rt 90 bk :size pd repeat 2[arcr 180 :size/2 bk 2*:size] rt 45 pu fd :size setfc 11 fill bk :size lt 45 end to waves setpc 3 rt 90 pu bk 2*:size/9 pd repeat 9[arcl 180 :size/9 rt 180] end to candles rt 270 pu bk :size/9 lt 90 setpc 6 repeat 8[stick] pd fd :size+:size/3 pu fd :size/9 flame ; Shamash rt 90 pu bk :size/3 lt 90 repeat 8[pu bk 2*:size/9 flame] end to stick pd fd :size rt 90 pu bk 2*:size/9 lt 90 bk :size end to flame pd setpc 6 seth 0 arcr 90 :size/5 arcl 90 :size/5 rt 180 arcr 90 :size/2.5 setfc 4 lt 30 pu bk :size/9 fill fd :size/9 rt 30 end to procs ed[main draw stand waves candles stick flame procs] end -------------------- to main ; Glass, Initial idea by Andrzej Baczynski 3d_frame setscrunch 1 .4 setpensize[1 1] base setpensize[2 2] cup setscrunch 1 1 end to base sp -40 -200 ;center it repeat 60[fd 4 rt 6 line []] setpc 7 ; white repeat 60[fd 4 rt 6]; rim end to cup sp -59 150 ;center it repeat 30[fd 6 rt 6 line []] setpc 7 ; white repeat 60[fd 6 rt 6]; rim end to line :ll push "ll pos push "ll heading setpc 1+random 15 setxy 0 -195 seth pop "ll setpos pop "ll end to procs ed[main base cup line procs] end -------------------- to main ; Nephro 3d_frame setpc 4 draw 46 end to draw :size pu repeat 32[ fd :size pd circle xcor pu bk :size rt 360/32] end to procs ed[main draw procs] end -------------------- to main ; Packman 3d_frame sphc 10 0 135 7 draw fill_it end to draw arc 270 70 ; head seth -45 fd 70 bk 70 lt 90 fd 71; mouth for[x -25 -75 -25][sp :x 0 circle 10] sp 5 40 circle 10 ; eye end to fill_it sp 50 0 setfc 4 fill ; head setfc 6 for[x -25 -75 -25][sp :x 0 fill] sp 5 40 fill ; eye end to procs ed[main draw fill_it procs] end -------------------- to main ; Chaos 3d_frame sp 0 -25 pu set_attractors 111 end to set_attractors :size for[pnt 1 3][ fd :size make :pnt pos bk :size rt 120] setpos :1 select 1+random 3 end to select :pnt setxy midx midy setpixel :pnt select 1+random 3 end to midx op(xcor+first thing :pnt)/2 end to midy op(ycor+ last thing :pnt)/2 end to procs ed[main set_attractors select midx midy procs] end -------------------- to main ; Flower by Olga 3d_frame setpc 7 flower 32 end to flower :size for[i 1 6][leaf fill_it rt 150] end to leaf setpc 7 arcr 90 :size arcl 90 :size rt 180 arcr 90 2*:size end to fill_it setfc :i pu lt 45 bk :size/2 fill fd :size/2 rt 45 pd end to procs ed[main flower leaf fill_it procs] end -------------------- to main ; Chain 3d_frame sqrl sqrr touch end to sqrl sphc -74 0 45 7 sqr 72 sph -55 0 45 sqr 45 sphc -70 0 0 6 setfc 6 fill end to sqrr sphc -27 0 45 7 sqr 72 sph -8 0 45 sqr 45 sphc -17 0 0 4 setfc 4 fill sp 70 0 setfc 4 fill end to sqr :size repeat 4[fd :size rt 90] end to touch sphc 0 15 -45 4 setfc 4 fill sp 0 9 fd 13 sp 9 19 fd 13 setpc 6 sp 0 -27 fd 12 sp 9 -17 fd 12 end to procs ed[main sqrl sqrr sqr touch procs] end -------------------- to main ; Heart 3d_frame for[ang 0 179 .5][ setxy(-2-60*sin :ang)(-25-100*cos :ang+60) draw] for[ang 180 359 .5][ setxy(-2-60*sin :ang)(-25-100*cos :ang-60) draw] end to draw pu setx xcor+15 pd setpc 7 setx xcor+2 setx xcor-2 ; right edge setpc 1 setx xcor-30 ; body color setpc 1 setx xcor-2 setx xcor+2 ; left edge setpc 7 setx xcor+15 ; body color end to procs ed[main draw procs] end -------------------- to main ; MgnDvd1 by Olga 3d_frame setpensize[2 2] sph -40 -23 30 draw 80 end to draw :amax repeat 6[do 1 :amax fd :amax rt 60] end to do :a :amax if :a>:amax[stop] setpc(se random 256 random 256 random 256) fd :a rt 120 fd :a+1 rt 120 fd :a+2 rt 120 do :a+3 :amax end to procs ed[main draw do procs] end -------------------- to main ; Iris 3d_frame setpc 7 pu setx -9 pd repeat 6[seth 60*(repcount-1) shape[]] pu home pd circle 79 pu fill_it end to shape :ll push "ll pos push "ll heading arcr 90 60 pu seth pop "ll setpos pop "ll pd arcr 60 9 end to fill_it repeat 6[fd 55 setfc repcount fill bk 55 rt 60] end to procs ed[main shape fill_it procs] end -------------------- to main ; muhammad 3d_frame sp 80 -80 setpc 4 setpensize[9 9] do 20 setpc 6 setpensize[4 4] do 20 end to do :size repeat 4[draw :size pu bk 4*:size rt 90 bk 2*:size pd] end to draw :size muh fd 2*:size rt 180 muh end to muh repeat 4[fd :size lt 90] lt 90 fd 2*:size rt 90 fd :size lt 90 fd 2*:size bk 2*:size rt 90 bk :size lt 90 fd 2*:size end to procs ed[main do draw muh procs] end -------------------- to main ; MD Star by Lev and Olga 3d_frame resett 85 repeat 3[ setturtle 0 move 1 3 rt 120 setturtle 1 move 2 4 rt 120] setturtle 0 setpc 1 lt 120 fd 1 rt 120 half_move 1 3 end to resett :a setturtle 0 pu home seth -60 fd :a seth 90 ht setpensize[0 15] pd setturtle 1 pu home seth 0 fd :a seth 150 ht setpensize[0 15] pd make "side :a * sqrt 3 make "step :side / 30 end to move :c1 :c2 repeat 15[ setpc :c1 fd :step setpc :c2 fd :step ] end to half_move :c1 :c2 repeat 7[ setpc :c1 fd :step setpc :c2 fd :step ] setpc :c1 fd :step end to procs ed[main resett move half_move procs] end -------------------- to main ; Trefoil Weave by Mike Sandy cs pu ht 3d_frame ;REMOVE THIS FOR LARGER PLOT aa 2 2 8 48 ;CURVE IN FRAME PARAMENTERS ;TRY aa 2 2 15 100 end to aa :pcol :c.incr :psize :size ; :pcol COLOUR OF 1ST CURVE ; :c.incr DETERMINES COLOUR OF NEXT CURVE ; :psize PENSIZE ; :size OVERALL SIZE OF PLOT ;The strands of a design are split into segments. At the centre of ;each segment lies an overlap, so that there are 2 segments per overlap; ;one for the upper strand (k=-1) and one for the lower one(k=1). ;The procedure firsts plots all those segments with k=1 and plots those ;with k=-1 on return from the recursion. ;Any number of curves can be included but they must be accessed within ;the weave procedure. do "x "y :pcol :psize :size*1.10 2 3 .8 0 1 1 end to do :fx :fy :pcol :psize :fsize :rs :rl :h :offset :t :k ; :fx :fy CURVE PROCEDURES X=F(ANGLE) Y=G(ANGLE) ; :rs :rs :h PARAMETERS OF CURVE ; :offset ANGLE OFFSET FOR START OF CURVE ; :t CONTROLS WHICH CURVE IS BEING PLOTTED ; :k DETERMINES WHETHER SEGMENT IS UNDERNEATH (+/-1) let[[psize.l (list 0 :psize)] [dr :rl-:rs] [dist 0] [a.incr 1] ;DETERMINES SMOOTHNESS OF SEGMENT. INCREASE ;FOR FASTER PLOTTING [pf 1.75] ;DETERMINES POSITION OF EDGING [a1 73][a2 98] [b1 64][b2 92] [seg.arr ifelse :t=1 [listtoarray (list 0 :a1 :a2 120 240-:a2 240-:a1 240 240+:a1 240+:a2 360 480-:a2 480-:a1 480 480+:a1 480+:a2 600 720-:a2 720-:a1 720)] [listtoarray (list 0 :b1 :b2 120 240-:b2 240-:b1 240 240+:b1 240+:b2 360 480-:b2 480-:b1 480 480+:b1 480+:b2 600 720-:b2 720-:b1 720)] ] [arr.len count :seg.arr] [rot.l []][rot1.l []] ] weave "x "y 1 :pcol :t :k end to rotate :x :y :ang op (list :x*(cos :ang)-:y*sin :ang :x*(sin :ang)+:y*cos :ang) end to weave :fx :fy :seg.num :pcol :t :k (if and :seg.num=:arr.len :t=2[stop]) (if :seg.num=:arr.len [;stop do "x "y :pcol+:c.incr :psize :size*1.22 :rs :rl .30 60 :t+1 1 stop]) localmake "posn (list pos heading) ;SAVES POSITION FOR RECURSION RETURN if :k=-1[(plot.curve "x "y item :seg.num :seg.arr item :seg.num+1 :seg.arr 0) weave :fx :fy :seg.num+1 :pcol :t -1*:k ] setpos first :posn seth last :posn (plot.curve :fx :fy item :seg.num :seg.arr item :seg.num+1 :seg.arr 1) ;SEGMENT PLOTTED IF k=1 OTHERWISE ;ON RETURN FROM RECURSION k=-1 AND ;PREVIOUSLY BLANK SEGMENT WILL ;NOW BE PLOTTED if :k=1[weave :fx :fy :seg.num+1 :pcol :t -1*:k stop ] end to plot.curve :fx :fy :a :ang.f :pen ;+/-1 ;PLOTS SEGMENT if :a>:ang.f[stop] plot.incr :fx :fy :a :pen plot.curve :fx :fy :a+:a.incr :ang.f :pen end to plot.incr :fx :fy :ang :pen (make "rot.l ;INCREMENT START COORDS rotate run (list :fx :ang) run (list :fy :ang) :offset) (make "rot1.l ;INCREMENT END COORDS rotate run (list :fx :ang+:a.incr) run (list :fy :ang+:a.incr) :offset) setpos :rot.l make "dist distance :rot1.l setpc :pcol setpensize (list 0 :psize) if :pen>0[pd] setpos :rot1.l pu ;PLOTS SEGMENT CENTRE setpc 0 setpensize [0 2] setpos :rot.l seth towards :rot1.l rt 90 fd :psize/:pf lt 90 if :pen>0[pd] fd :dist pu ;PLOTS EDGE setpos :rot.l lt 90 fd :psize/:pf rt 90 if :pen>0[pd] fd :dist pu ;PLOTS EDGE end to x :a op :fsize*((:dr*cos :a)+:h*cos (:dr/:rs*:a)) end to y :a op :fsize*((:dr*sin :a)-:h*sin (:dr/:rs*:a)) end .macro let :list if empty? :list [op []] op (list "local "first first :list "make "first first :list "run bf first :list "let bf :list) end to procs ed[main aa do rotate weave plot.curve plot.incr x y let procs] end -------------------- to main ;3d! EPITROCHOID by Mike Sandy ;THIS PLOT WAS RUN ON 32-BIT TRUE COLOR ;IT SHOULD RUN ON 16-BIT HICOLOR ;IF NOT TRY INCREASING THE FIRST PARAMETER ; OF setpc ch.col pc 5 50 IN THE PROC ; PLOT.SEG ;TYPE PROCS TO EDIT aaa 20 7 120 end to aaa :r :d.pa :size ; :r RADIUS OF LUNE ARCS ; :d.pa DISTANCE BETWEEN LUNES ; :size OVERALL SIZE OF PLOT ;IT IS A MATTER OF TRIAL AND ERROR TO FIND ;VALUES WHICH GIVE SATISFACTORY PLOTS ;THERE IS A POSSIBILITY THAT SOME WILL ;PRODUCE COLOUR LEAKAGE cs ht pu let[[fc.l {[0 255 0][0 255 0]}] ;CHANGE THE COLORS HERE ;TO GET DIFFERENT COLORED SEGMENTS ] reset cs ht pu setpensize[0 1] ;setsc[210 210 210] aa "x "y 1 1 :fc.l end to aa :fx :fy :k :t :fcol.l let[[rs 4][rl 3][h .7] ;PARAMETERS OF THE EPITROCHOID [dr :rl-:rs] [fc.num 1] [ff 1.15] [a.incr 5] ;ANGLE INCREMENT FOR EPITROCHOID [a1 55] [a2 105] [seg.arr listtoarray (list 0 :a1 :a2 240 480-:a2 480-:a1 480 480+:a1 480+:a2 720 960-:a2 960-:a1 960 960+:a1 960+:a2 1200 :rs*360-:a2 :rs*360-:a1 :rs*360) ] ;START ANGLES OF SEGMENTS [arr.len count :seg.arr] [cf 1.27] ] setpc [0 0 0] weave :fx :fy 1 :k :t :fc.num end to weave :fx :fy :seg.num :k :t :fn (if and :seg.num=:arr.len :t=1[stop]) local[store] make "store (list pos heading) if :k=-1[(plot.seg :fx :fy ;WILL PLOT OVERLAP SEGMENTS ON RETURN item :seg.num :seg.arr item :seg.num+1 :seg.arr 0) weave :fx :fy :seg.num+1 -1*:k :t :fc.num ] setpos first :store seth last :store make "fc.num :fn ;ENSURES THAT THE SEG. COLOUR ;IS MOSTLY! CORRECT ON RETURN (plot.seg :fx :fy item :seg.num :seg.arr item :seg.num+1 :seg.arr 1) if :k=1[weave :fx :fy :seg.num+1 -1*:k :t :fc.num stop ] end to plot.seg :fx :fy :ang1 :ang2 :pen if or :ang1>:ang2 :ang1=:ang2[stop] let[[x0 run (list :fx :ang1)] [x1 run (list :fx :ang1+:a.incr)] [y0 run (list :fy :ang1)] [y1 run (list :fy :ang1+:a.incr)] [posn (list :x1 :y1)] [posn0 (list :x0 :y0)]] setpos :posn0 seth towards :posn let[[dist distance :posn] [n 1+int (:dist/:d.pa-1)] [f :dist/:r/:n] [incr.ang arcsin :f/2] [a.ang 180+2*:incr.ang] [t.ang 90-:incr.ang]] setpc ch.col pc 5 50 ;INCREASE 1ST PARAMETER IF THE ;UNDERLYING SEGMENT SHOWS THRO' repeat :n[lune arc.centre :x0 :y0 :x1 :y1 :n repcount-1 arc.centre :x0 :y0 :x1 :y1 :n repcount -1*:a.ang :pen] plot.seg :fx :fy :ang1+:a.incr :ang2 :pen end to lune :posn1 :posn2 :a.ang :pen local[store] make "fc.num -1*:fc.num+3 setfc item :fc.num :fcol.l ;setpc ch.col pc 1 40 setpos :posn1 seth towards :posn2 if :pen=1[lt :t.ang pd arc :a.ang :r pu rt :t.ang] make "store (list pos heading) setpos :posn2 if :pen=1[lt :t.ang pd arc :a.ang :r pu rt :t.ang fd (:ff-:f)*:r ;pause (fill "true) ] setpos first :store seth last :store end to ch.col :list :x :n if emptyp :list[op[]] if :x=0[op :list] local[1st res div] make "1st first :list make "res remainder :x+:1st :n make "div int (:x+:1st)/:n op fput :res ch.col bf :list :x*:div :n end to arc.centre :x0 :y0 :x1 :y1 :n :k op (list ((:n-:k)*:x0+:k*:x1)/:n ((:n-:k)*:y0+:k*:y1)/:n) end to x :a op :size*((:dr*cos :a)+:h*cos (:dr/:rs*:a)) end to y :a op :size*((:dr*sin :a)-:h*sin (:dr/:rs*:a)) end .macro let :list if empty? :list [op []] op (list "local "first first :list "make "first first :list "run bf first :list "let bf :list) end to procs ed[main aaa aa weave plot.seg lune ch.col arc.centre x y let procs] end --------------------