Draws filled circles (using turtle pensize technology). Parameters mimic those of SVG. Set scl=1 to use pixels, or scale drawings.
# Type your text """ Graphics library. Currently just circles. Functions: Moves moveto Functions: Shapes circle Functions: Text texts (simplified text) title Functions suffixed X execute drawings in pixels. Functions prefixed g. Eg Circle. The savage shape <circle cx="600" cy="200" r="100" fill="red" stroke="blue" stroke-width="10" /> </svg> can be mimiced by => gcircle(600,200,100,"red","blue",10) when scaling is used. Color: syntax is one of "red": native color ("": current turtle color) [r,g,b] (or red after red=...) None or "none": transparent Scaling: scl=1 => pixels, 0.5=>shrink """ __version__ = "0.1" crid = "gcircle V"+__version__+" © 2023 SteveG1CMZ" from turtle import * from time import * #half screensize common to most calculators xscreen=int(318/2) yscreen=int(186/2) #common #customise showme=True #execute main hasclock=True #inhibit if necessary lineheight=18 #use in your code #show turtle drawing (but moves omitted) showtu=False #default scaling (1=>pixels) if showme: scl=xscreen/500 else: scl=1 #svg #opacity (affects drawing and gtext) opacity=1 #0..1 (imp: Boolean) #end custom #common maths #end common maths #initialise constants none="none" rendered=0 #render timing lastfc="black" lastsc="black" #svg mimic functions #move functions def gmoveto(x,y): """Mimic SVG move to. """ xi=gscaler(x,scl) yi=gscaler(y,scl) gmovetox(x,y) #shape functions def gcircle( cx=0,cy=0,r=0,fill="black",stroke="black",width=1): """ Mimic SVG circle. Draw a circle (mimic savage parameters). cx,cy: Centre position (None=0 TBD) r: radius fill,stroke: None or "" or color width: of stroke cx cy r width: In real Pixels (when scl=1). Imp: fill uses pensize. So radius > 70 will memory fail on Numworks. (Or even less) """ if r>0: #print( cx,cy,r,fill,stroke,width) cxi=gscaler(cx,scl) cyi=gscaler(cy,scl) ri=gscaler(r,scl) widthi=gscaler(width,scl) gcirclex(cxi,cyi,ri,fill,stroke,widthi) #text functions def gtitle(text): """Title to appear outside graphics screen. Imp: print (assume it doesn't block graphics). """ print(text) def gtexts(x=0,y=0,text=""): """Simplified text. No color. No deltax. Use gtext instead if you need color TBD. Imp: The position of text is scaled, not it's size. """ xi=gscaler(x,scl) yi=gscaler(y,scl) gtextsx(xi,-yi,text) #negated #execute move functions def gmovetox(x,y): """Mimic SVG moveto. Penup Hideturtle and goto. """ penup() hideturtle() goto(x,y) #execute shape functions def gcirclex(cx,cy,r,fill,stroke,width=1): """Mimic SVG circle. """ global lastfc,lastsc if r>0: #,cx cy None->0 tbd cxi=gscaler(cx,1) cyi=gscaler(cy,1) ri=gscaler(r,1) widthi=gscaler(width,1) #print("X",scl,cxi,cyi,ri,fill, stroke,width,widthi) oldpensize=pensize() oldcolor=color() wasdown=isdown() if not(fill==None or fill==none): #fill gmovetox(cxi,-cyi) # negated pensize(round(ri*2)) #filler if not(fill==""): color(fill) gpendown() forward(1) # draw something lastfc=color() if not(stroke==None or stroke==none): #stroke (outline) #should begin at 3, but begin at 6 posn gmovetox(cxi,-cyi-ri) #negated pensize(widthi) if not(stroke==""): color(stroke) if showtu: showturtle() gpendown() circle(ri) lastsc=color() #restore pensize(oldpensize) color(oldcolor) if not(wasdown): penup() #turtlepos tbd #execute text def gtextsx(x=0,y=0,text=""): """Simplified text. No color. No deltax. Use gtext instead of you need color TBD. Imp: The position of text is scaled, not it's size. """ gmoveto(x,y) if opacity: write(text) #supporting graphic routines def gpendown(): """Prepare to draw, unless not opaque. """ if opacity: pendown() def gscaler(num,scl): """Round and scale a number (but keep 1 pixel). """ if num==0: return 0 nums = num*scl if nums<1: return 1 #at least 1 pixel #return scaled and rounded number return round(nums) #end SVG mimics def svgexamples(): scl=xscreen/float(600) gtextsx(0,yscreen,"SteveG1CMZ") #gtextw(0,yscreen-18,"Lin2") gtextsx(-xscreen,-yscreen,"examples") gcircle( 0,0,60,"blue","blue",6) gcircle(50,50,50) #default colours gcircle(600,200,100,"red","blue",10) #example #gcircle(0,-120,60,"yellow","yellow",2) #gcircle(0,0,60,"blue",[255,0,0],1) def circlestest(): """Circle test is based on SVG test. """ gtitle(">shapes-circle-01") lime="green" #approximate missing color #gtexts(100,100,"A") gcircle (cx=100, cy=100, r=50, fill="none",stroke="black") #gtexts(220,100,"B") gcircle (cx=220, cy=100, r=35, fill="red",stroke="black") #gtexts(340,100,"C") gcircle (cx=340, cy=100, r=20, fill="black",stroke=lime, width=4) #gtexts(100,260,"D") gcircle ( cx=100, cy=260, r=20, stroke=lime,fill="yellow", width=4) #gtexts(220,260,"E") gcircle (cx=220, cy=260, r=35, stroke="none",fill="blue") #gtexts(340,260,"F") hideturtle() gcircle (cx=340, cy=260, r=50, stroke="red",fill="none", width=10) #return gtitle(">shapes-circle-02") # color "green" stroke="#000000" fc = "green" sc = "#000000" #gtexts(0,0,"a") gcircle (r=50, fill=fc, stroke=sc) #gtexts(0,100,"b") gcircle (cy=100, r=50, fill=fc,stroke=sc) #gtexts(100,0,"c") gcircle (cx=100, r=50, fill=fc, stroke=sc) gcircle (cx=100, cy=100, r=0, fill="red",stroke=sc) #gtexts(100,100,"d") gcircle( cx=100, cy=100, r=50, fill=fc,stroke=sc) #print("tested") def main(): gtitle(crid) penup(); hideturtle() goto(-xscreen,yscreen) #-yscreen-20) write(crid) if hasclock: renderbegin=monotonic() #svgexamples() circlestest() if hasclock: rendered=monotonic() rendertakes=round(rendered-renderbegin,3) if True: print(" rendered in ",round(rendertakes),"s") if showme or __name__ == "__main__": main()