From fa7c8f1367772f565ca859e00297f6480a8dc429 Mon Sep 17 00:00:00 2001 From: Ryan Lay <30853424+totally-not-frito-lays@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:51:28 -0800 Subject: [PATCH] Add examples and refactored code from the workshop --- act1_cowabunga.py | 25 ++++++++++++++ carl.png | Bin 0 -> 4751 bytes demo.py | 50 +++++++++++++++++++++++++++ driver.py | 37 ++++++++++++++++++++ ex_arrow.py | 29 ++++++++++++++++ ex_dragon.py | 29 ++++++++++++++++ ex_fern.py | 30 +++++++++++++++++ ex_weave.py | 28 ++++++++++++++++ main.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++ panAndZoom.py | 2 +- 10 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 act1_cowabunga.py create mode 100644 carl.png create mode 100644 demo.py create mode 100644 driver.py create mode 100644 ex_arrow.py create mode 100644 ex_dragon.py create mode 100644 ex_fern.py create mode 100644 ex_weave.py create mode 100644 main.py diff --git a/act1_cowabunga.py b/act1_cowabunga.py new file mode 100644 index 0000000..ba370f6 --- /dev/null +++ b/act1_cowabunga.py @@ -0,0 +1,25 @@ +# CHANGEME +# turn angle 90 +replacementRules = { + "x": "x+yf+", + "y": "-fx-y", + "+": "+", + "-": "-", + "f": "f" +} + +def generateCowabunga(generations): + print("initialized and running") + # CHANGEME + axiom = "fx" + structure = "" + for _ in range(generations): + print(f"gen {_} starting") + if (structure): + axiom = structure + structure = "" + for _ in axiom: + print(f"{structure}") + structure += replacementRules[_] + axiom = structure + return structure \ No newline at end of file diff --git a/carl.png b/carl.png new file mode 100644 index 0000000000000000000000000000000000000000..68a59dbbef0f795241b26dbb46a05c184b77edb2 GIT binary patch literal 4751 zcmb7IS2!Dh!ll&So1$Wrn6bAILCqSeRii><)ZTm4D4L2Hu1&R6YZkHh)(~RWs6C6S z-BN%5r~7;#&iKyr`Od>hGB(norr@9;ARwUDeGE1Ir)&QYGNOM>?!o(*fPj$9*Z`(= zcX!t@p&bwfmXMGLex)u96c-bd5D^ydp3?S@1h-*T0%O3w;b0*_@s_VLtyra=X`OGI z#qI&BGO{286IpW`d1X~eO>Jr4a7DKOpz%{Vgr~9qpZMx-t&YBot&<}Dd&&b=F#xyt z!B4D5u%xT63T9aAxwF#o>D=zofTEHl7$S9kwbMUsGd$;3)uFk0(4L;_zPY_LJvWq+ zr}5|JbZRAOVIzNizcIH0($Q0qQ{>;>U-jyZ87(bsQo4P46ErqO8M_#kSps2W5G$`r z{#2K?vO2x6uwZFnt!>DGKp^(^_JV?fDn6DzwS6=^G@`Dq9{olgm1|nx;ln^7R$Spz z-e68tC-8}YfF7a?)qn-(9~LB;Zz!-N_=tMd738?bedgC<;8Bm(i>`&;uXx{9j&KY` ztlSxD{}Nt6iw()auqRPQMdD4x6Bbjp{>*`a6wJb~3gZ$;{QqPk)vBu1)RvYbI=b51 zZ>a9t?tUL09c^5Gy5u&0)cQL(=&qSIAUJq_kQf|SAcQ9lRPEv_V z2b8!D*MQ#w?k;rK)9Q(30GAS7UGfj6P-9)sq9I~0p)ywAqvl!`z2^Micz-~oT>V8_ zpm1FxrMg10(zc1*8(YfNL&|ufSBx3PoSTqDwysXr)vZp&d!Slm&LJZCp!Qb0bEDFu zEg08;$z3ATe}6mS1%CQ)iOsNpJjCNe;kQ3t9UDu>VO_RRN{DD=c zNi9Cv!(fQ>_qfw{r9TM$#Qq54!ZG-1^AqHW7Y_$DB5Z%M!x$b|Hz6xYir$^^>8Qi0 z18vkDXsYh32k~4}0rz4((aIv~YZ*e@udldB-JA0&R_XxixYSZy?u#Lp``7E>(|hf` zgrwrdAb)aL@%VP@rlZP8%4DeP-eq`c-qQzuXN3=#TKj)KEe?Pdp_s1RRruMgB}8es z{Q%+9GKMCi$*My}ykPPx;$o`X3}z|Ba~%-t;p@=gB5M5pF8uO$zKF%A8NEgoTld*9 zi$wCM3`$GdWwEvDFRV@m9z(fbFfmhqZ9`i(Vx{|^ZmW#cI~d4I=ymK6nv%SG^{pGj z6CbLl{3@k`%H%}x#ZBNhaICjY1Vg#B9A>#s0L-ns*$V?Gm-Z;5D-&oED6xat!fh01Fc! z1c~2O9M3ep@Gnfa%~4(Q1YV3yZudDKv_hZ76FXwGq$s!o9%v86g)d+4-HI`+^QB}> zIBlYHdqFb8iOwVK{buNQ6wlS}-GdYff2<~7CU{q{B*I<$^$EOMoFJCnP#ZomNt(MK ziQP11@|Y^X=3#p@e0;|3P)JX#Q&%w(abmP-NJUq@+zo4oX zMBZuNII(~EBtt^OrUsb^ie18QNb)+hg;{va(y1^%l-Xbufs_09jrv8>JR#)!odRUv zz@Jvhv2&&^B!hZ(iS<6abTQ$oiDLH8GZ;4?ZHF13&gycBSzXD#o{@jDAeZ;|;th^j z8BT7%36=4;t;Ae#3~w2_Sp)mmh>Berb%UPg*|}dMhmA?WSc23Ig2j~NviX-MWs*N; zGt;?R`c+uG;m=HXFnESo`iU)3vT~%+yG`yPT`W|~QT{G#c#pxWf5X6Fc!YAB(G-h*-H zV+N3Ox_ofppy7aBaF&^G`skP>3l%C`qaRp!g%n~8;qZdW-gnUT>ouD?YzyHv7yTSQ z4_Ie!F`DipA$-7Iqx$1P9Q#1xN#5JVM{*0VaHnkj$8{OElHU~JFn4Ers4+2z{jdqlkT%KLND38Xk_;gFPKR$`%^6$?>eS|tlm*Ox zNl0dXqG55|v5H!f0+>9KMYDCY-WjM-V&tM2n_odSFXTH}6fDHgR}s4wBD3p&!C z*)LF-B!;~= z2pY*6Y&Nx=Ka5DUhw%HXZ zixQ5qkyn_Brlj9a^I}Z5^y?~E2G>08IBg`#lrd}TO2FmiH|ZV2 z`9caMcqn9bW!i_pxwuUA-C7p#J(Sbw3ylct=-~E8!?)TI^?uBECOL}D+9YvqIur!x z2Jj2zm%e0usK~AJuAz6)`0Te^;Y;`~l{!E!K65CyTl$edt>h9HX=L?nk(9;x_Abrg z)rvuxwg>zJ$FF)dmg~g+xtfn$L=-WLUl!;X@UZ%4+z%&4ofUYtV1tz+7uyfAwa`VP zYLEZ+Dj61RggQ*tg1QkwO6Z{vt#u=F6NZwQt5RdD@R=}yy=)Ral= zB!)jO{Az|d{5>g+z8CNNqhOI5)AoFwbFWzrSr?E;tg#{_NA;FX2IiKiM zjwW{fIrkNJ+(903bpB0gb2f|r4c(&w(fh@-bRad8T{?M!R}r4m#e?&^e>)2&k^0jO z056$i1hrk=d@im%EtYj99xYKy#xR9y-g3qKkNTGyERnVeVBGs?+(*pIJE&t9KZW-cwtrte5MS-vK4=|ihSCB0vf9LtkDa|1&M zRt6iEzg%cKOe1I>OG02b=3HG{jY|Ro&|trUAB#-q8kVq{--JPdrETJG_sm{WX@O@_ z_+@D0m<2DqQHL3HmFiWp&(dqeo-*|w%f!h}s}1=J{M+T*`uX1I$A}R7DsnZbHiUT{ zxU6k^8MLg|%hOIZP4n_|lGk;zn?%wdlP@;Aa>fdtY4LQ8$3e<|BT=Vvzm7bD9m67Z zL6x&PS!}B^M!i?m9yF6-!2PwkR%}nwjHjO7^ugI5d}d)rYy3Ki(!~RDy zwDEN3XyHaHXB2I$=3YBfKvm8xEW=)w;y`t>efaUZa$|~4#W$x^k9*W}rQHCP2sLCg zN42Wyv7Hm%mP34pPOr+Lr>L!ozgQ^OJnw4)b})aA{=xeU`^-3Vvp2iiPaCowIi6Q* zZ{}x^7oV)f%0Fus5YBzWdff?1zG$vcGb2BhDgDu?E#eoIKgO#de@&R5pBAZQ_V-Ow zn36+^woGj-6i0P*lje;Jys`5$O>VLN)`@-VS?Nf)?#uHlz(VbGLgV>W9!YMsP`d~1YxL?!2V59B(2kRC9HV^}i04yCN0 z(L1>m_wHon6+l@hemqt+X(Uq~PQX9WG{Q}J&sVu7kGd=9^k}x0g?ih^T|P_` zMf~{vjK*DbJbixM=aj4!sS@! zU&SHiLG#z$p?YH$pVBBL1)+Sc%EG|HCL3tkMjE$dP15M}{CM(Z!&>PWFpYZ>c0upv ze_$-7vaia50wDm90$=vFNJUjZnHkz=_6rkpZfofHEYjB(=IXBGE}h|8I>Y;mzrUx` z^|;nZ%nzDYXVy&OHpo9=+~aolNAehjli~HQHTw8Kwv{i-Y7F+CKxr|knN^imh%G+c zR5Y#VGjR3XwPi*0Lw?NlnOnT_&sIklTT%tyFVy%BLy`}B@Gn+;9Xw*>Jx{tN+~p{T zUo<_V-yz-7J8ysTStLOe9RNUBMP_I^v270hEdpAIWSuV4{>6wnR0wMABoQw2S;2Ec~*oWG$vUB zxlRSoA`<4{VejWHP6AtJ_Rr3C`vwL)y1MlDw^vsYL71qp@NvlS*`^i6ob!o9pRv_v zyV`anANq2+dogqm?hR-DP%`kF!W`q4BtYPV%yG1hj29DsYm3{y{|r$FrA1D-Gh4li zW@mA9qX$>95s|)x8N~eywZ;xM-QI_G%gm&)C1ggYR<#b?d=(!TR#Ps$&41S)@{AVP z>6V=d>XBA%RrFI~`V9_>WMrkh4&Xcvn3oIM&fZ|y3_u&9QY1XRBvMce^;X}oAj-uO zdFwxRCt`PUf|~CA+nu6y#JnR2EjLMi7F`>)zRbs0UrpZtM&XrWi*P>rA*Siq{(`q$p z4Y@`B#&xOf2nQ05s9 0: + main = modules[0] + locals = {attr: getattr(main, attr) for attr in dir(main)} + +sys.ps1 = "\u001b[33m\uEEA7\u001b[00m " +code.interact(local=locals, banner='') + +screen.mainloop() diff --git a/ex_arrow.py b/ex_arrow.py new file mode 100644 index 0000000..eac84a1 --- /dev/null +++ b/ex_arrow.py @@ -0,0 +1,29 @@ +""" + FX Axiom + X -> YF+XF+Y Rule 1 + Y -> XF-YF-X Rule 2 + angle = 60 +""" + +replacementRules = { + "x": "yf+xf+y", + "y": "xf-yf-x", + "+": "+", + "-": "-", + "f": "f" +} + +def generateArrow(generations): + print("initialized and running") + axiom = "fx" + structure = "" + for _ in range(generations): + print(f"gen {_} starting") + if (structure): + axiom = structure + structure = "" + for _ in axiom: + print(f"{structure}") + structure += replacementRules[_] + axiom = structure + return structure \ No newline at end of file diff --git a/ex_dragon.py b/ex_dragon.py new file mode 100644 index 0000000..95c3a23 --- /dev/null +++ b/ex_dragon.py @@ -0,0 +1,29 @@ +""" +AXIOM: fx +RULES: + +x -> x+yf+ +y -> -fx-y + +""" + + +replacementRules = { + "x": "x+yf+", + "y": "-fx-y", + "+": "+", + "-": "-", + "f": "f" +} + +def generateDragon(generations): + axiom = "fx" + structure = "" + for _ in range(generations): + if (structure): + axiom = structure + structure = "" + for _ in axiom: + structure += replacementRules[_] + axiom = structure + return structure diff --git a/ex_fern.py b/ex_fern.py new file mode 100644 index 0000000..fbb1edc --- /dev/null +++ b/ex_fern.py @@ -0,0 +1,30 @@ +""" + Axiom X + F --> FF + X --> x[-fff][+fff]fx + ø = 22.5 +""" + +replacementRules = { + "x": "y[-fff][+fff]fy", + "y": "yfx[+y][-y]", + "+": "+", + "-": "-", + "f": "f", + "[": "[", + "]": "]" +} + +def generateFern(generations): + axiom = "yy" + structure = "" + for _ in range(generations): + print(f"gen {_}") + if (structure): + axiom = structure + structure = "" + for _ in axiom: + structure += replacementRules[_] + print(structure) + axiom = structure + return structure diff --git a/ex_weave.py b/ex_weave.py new file mode 100644 index 0000000..f40420a --- /dev/null +++ b/ex_weave.py @@ -0,0 +1,28 @@ +""" + Axiom F+F+F+F + F --> FF+F-F+F+FF + ø = 90 +""" + +replacementRules = { + "x": "", + "y": "", + "+": "+", + "-": "-", + "f": "ff+f-f+f+ff" +} + +def generateWeave(generations): + print("initialized and running") + axiom = "f+f+f+f" + structure = "" + for _ in range(generations): + print(f"gen {_} starting") + if (structure): + axiom = structure + structure = "" + for _ in axiom: + print(f"{structure}") + structure += replacementRules[_] + axiom = structure + return structure \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..36f7005 --- /dev/null +++ b/main.py @@ -0,0 +1,84 @@ +# File for running all turtle code and generating structure +import turtle +from act1_cowabunga import generateCowabunga +from ex_dragon import generateDragon +from ex_fern import generateFern +from ex_arrow import generateArrow +from ex_weave import generateWeave + +# initialization +t = turtle.Turtle() +t.shape("turtle") +t.speed(10) +t.left(90) + +# This variable determines how far the turtle +# moves everytime we call the goForward function +moveDistance = 10 +# The angle at which the turtle runs +turnAmount = 22.5 +# Fancy Computer-Sciency data structure that helps us +# keep track of all the coordinates we visit while generating structures with turtle +stack = [] + + +#Enables the turle to go forward by the distance, moveDistance +def goForward(): + t.forward(moveDistance) + + +# Turns the turtle left by the turn amount +def goLeft(): + t.left(turnAmount) + + +# Turns the turtle right by the turn amount +def goRight(): + t.right(turnAmount) + + +# 10 points if you can guess what this does! +def doNothing(): + pass + + +# Put stuff onto the stack (fancy CS data strucutre) +def pushStack(): + coor = t.position() + stack.append(coor) + # print(f"pushed {coor}") + + +# Get stuff out of the stack (fancy CS data strucutre) +def popStack(): + coor = stack.pop() + t.penup() + t.goto(coor) + t.pendown() + # print(f"popped {coor}") + + +# Map stuff from our replacement rules to the functions above +actions = { + "f": goForward, + "+": goLeft, + "-": goRight, + "x": doNothing, + "y": doNothing, + "[": pushStack, + "]": popStack +} + +# Generates the structure according to the given code +def run(structure): + for i in structure: + actions[i]() + + +# # Run this! +# run(generateCowabunga(5)) +# examples +# run(generateDragon(10)) #angle = 90 +run(generateFern(5)) #angle = 22.5 +# run(generateArrow(7)) #angle = 60 +# run(generateWeave(3)) #angle = 90 \ No newline at end of file diff --git a/panAndZoom.py b/panAndZoom.py index edab31b..0b11165 100644 --- a/panAndZoom.py +++ b/panAndZoom.py @@ -45,4 +45,4 @@ def setListens(): def initialize(): setListens() - listen() + listen() \ No newline at end of file