Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions minify.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import os
import python_minifier

SOURCE_DIRECTORY = "src"
EXCLUDED_DIRECTORIES = ["src/visual/examples"]


# Iterate through every file in our source directory
for subdirs, dirs, files in os.walk(SOURCE_DIRECTORY):
canContinue = True
for excluded in EXCLUDED_DIRECTORIES:
# If subdir is inside of one of the excluded directories, skip it
if os.path.commonpath([subdirs, excluded]) == excluded:
canContinue = False
break

if not canContinue:
continue

for file in files:
# We only care about minifying .py files that aren't already minified
if file.split(".")[-1] == "py" and not file.endswith(".min.py"):
outputFilename = file.split(".")
outputFilename.insert(len(outputFilename) - 1, "min")
outputFilename = ".".join(outputFilename)
inputFp = open(os.path.join(subdirs, file))
outputFp = open(os.path.join(subdirs, outputFilename), "w")
outputFp.write(python_minifier.minify(inputFp.read()))
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
kandinsky==2.7.2
ion-numworks==2.1
ion-numworks==2.1
python-minifier==2.11.3
1 change: 1 addition & 0 deletions src/visual/__init__.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from visual.visual import*
Empty file.
1 change: 1 addition & 0 deletions src/visual/extensions/ellipses/__init__.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from.ext_ellipses import*
9 changes: 9 additions & 0 deletions src/visual/extensions/ellipses/ellipses_example.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from visual import Point
from ext_ellipses import draw_ellipses,fill_ellipses
A=Point(50,50)
B=Point(270,172)
def example_1():fill_ellipses(A,B,'red',alpha=.5);draw_ellipses(A,B,'black')
example_1()
A=Point(125,50)
B=Point(195,172)
def example_2():fill_ellipses(A,B,'red',alpha=.5);draw_ellipses(A,B,'black')
14 changes: 14 additions & 0 deletions src/visual/extensions/ellipses/ext_ellipses.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from visual import Point,set_pixel,alpha_pixel
def draw_ellipses(P1,P2,color='0'):
D=color;B=P2;A=P1;C,E=abs(B.x-A.x),abs(B.y-A.y);F=E&1;H,G=4*(1-C)*E*E,4*(F+1)*C*C;I=H+G+F*C*C
if A.x>B.x:A.x,B.x=B.x,A.x+C
if A.y>B.y:A.y=B.y
A.y+=(E+1)//2;B.y=A.y-F;C*=8*C;F=8*E*E
while A.x<=B.x:
set_pixel(B.x,A.y,D);set_pixel(A.x,A.y,D);set_pixel(A.x,B.y,D);set_pixel(B.x,B.y,D);J=2*I
if J<=G:A.y+=1;B.y-=1;I+=G;G+=C
if J>=H or 2*I>G:A.x+=1;B.x-=1;I+=H;H+=F
while A.y-B.y<E:set_pixel(A.x-1,A.y,D);set_pixel(B.x+1,A.y,D);set_pixel(A.x-1,B.y,D);set_pixel(B.x+1,B.y,D);A.y+=1;B.y-=1
def fill_ellipses(P1,P2,color='0',alpha=1.):
A,B,C=abs(P2.x-P1.x)//2,abs(P2.y-P1.y)//2,Point((P1.x+P2.x)//2,(P1.y+P2.y)//2)
for(D,E)in[(A,C)for A in range(-A,A+1)for C in range(-B,B+1)]:alpha_pixel(C.x+D,C.y+E,color,alpha)if D**2/A**2+E**2/B**2<=1 else None
1 change: 1 addition & 0 deletions src/visual/extensions/grapher/__init__.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from.ext_grapher import*
192 changes: 192 additions & 0 deletions src/visual/extensions/grapher/ext_grapher.min.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/visual/extensions/lines/__init__.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from.ext_lines import*
25 changes: 25 additions & 0 deletions src/visual/extensions/lines/ext_lines.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
_A=True
from visual import Point,set_pixel,fill_circle,interpolate,distance
def draw_lines(line,color='0',thickness=1):
L=thickness;K=color;J=False
if isinstance(K,list):
for((A,C),(M,N))in zip(line,K):
H,I=_A if C.y>A.y else J,_A if C.x>A.x else J;D,E=C.y-A.y if H else A.y-C.y,C.x-A.x if I else A.x-C.x;F=_A if D<=E else J;G=D/E if F and(E!=0 or D!=0)else E/D;O=interpolate(M,N,round(distance(A,C)))
for B in range(E if F else D):fill_circle(Point(int(round(A.x+B)if I else round(A.x-B))if F else int(round(A.x+G*B)if I else round(A.x-G*B)),int(round(A.y+G*B)if H else round(A.y-G*B))if F else int(round(A.y+B)if H else round(A.y-B))),L,O[B])
else:
for(A,C)in line:
H,I=_A if C.y>A.y else J,_A if C.x>A.x else J;D,E=C.y-A.y if H else A.y-C.y,C.x-A.x if I else A.x-C.x;F=_A if D<=E else J;G=D/E if F and(E!=0 or D!=0)else E/D
for B in range(E if F else D):fill_circle(Point(int(round(A.x+B)if I else round(A.x-B))if F else int(round(A.x+G*B)if I else round(A.x-G*B)),int(round(A.y+G*B)if H else round(A.y-G*B))if F else int(round(A.y+B)if H else round(A.y-B))),L,K)
def draw_lines_AA(line):
for(A,E)in line:
B,C,H,I=abs(E.x-A.x),abs(E.y-A.y),1 if A.x<E.x else-1,1 if A.y<E.y else-1;G,D,J,F=B-C,0,0,1 if B+C==0 else(B*B+C*C)**.5
while _A:
set_pixel(A.x,A.y,tuple(int(255*abs(G-B+C)/F)for A in range(3)));D,J=G,A.x
if 2*D>=-B:
if A.x==E.x:break
if D+C<F:set_pixel(A.x,A.y+I,tuple(int(255*(D+C)/F)for A in range(3)))
G-=C;A.x+=H
if 2*D<=C:
if A.y==E.y:break
if B-D<F:set_pixel(J+H,A.y,tuple(int(255*(B-D)/F)for A in range(3)))
G+=B;A.y+=I
15 changes: 15 additions & 0 deletions src/visual/extensions/lines/lines_example.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
_A='yellow'
from ext_lines import draw_lines_AA,draw_lines
from visual import Point
A,B,C=Point(20,10),Point(160,35),Point(300,10)
draw_lines([(A,B),(B,C)],'black',thickness=0)
D,E,F=Point(20,50),Point(160,75),Point(300,50)
draw_lines([(D,E),(E,F)],[(_A,'red'),('red',_A)],thickness=1)
G,H,I=Point(20,90),Point(160,115),Point(300,90)
yellow,red=(255,255,0),(255,0,0)
draw_lines([(G,H),(H,I)],[(yellow,red),(red,yellow)],thickness=3)
J,K,L=Point(20,130),Point(160,155),Point(300,130)
draw_lines_AA([(J,K),(K,L)])
M,N,O=Point(20,170),Point(160,195),Point(300,170)
blue,orange,yellow=(0,0,255),(255,134,24),(255,255,0)
draw_lines([(M,N),(N,O)],[(blue,orange),(orange,yellow)],thickness=10)
1 change: 1 addition & 0 deletions src/visual/extensions/turtle/__init__.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from.ext_turtle import*
77 changes: 77 additions & 0 deletions src/visual/extensions/turtle/ext_turtle.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
_H='SecondaryText'
_G='PrimaryText'
_F='SecondaryColor'
_E=None
_D=False
_C='PrimaryColor'
_B=True
_A='Background'
from visuel import Vector,fill_rect,set_lines,draw_string
from math import sin,atan2,degrees,radians
import kandinsky as kd
try:from ext_lines import draw_lines
except:pass
class Screen:palette={_A:(248,252,248),_C:(0,0,0),_F:(200,200,200),_G:(0,0,0),_H:(248,252,248),_C:(0,0,0),_F:(200,200,200),'ThirdColor':(235,235,235)}
class Turtle:
def __init__(A,position=Vector(x=160,y=111),color=Screen.palette[_C],angle=Vector(x=1,y=0),pensize=1):A._color,A._penup,A._pendown,A._pensize,A._position,A._angle=color,_B,_D,pensize,position,angle
@staticmethod
def _lines(lines,color,pensize):C=pensize;B=color;A=lines;set_lines(A,B)if C==1 else draw_lines(A,B,C)
def forward(A,l):B=A._position+A._angle*l;B.round();Turtle._lines([(A._position,B)],A._color,A._pensize)if A._pendown else _E;A._position=B
def backward(A,l):B=A._position+A._angle*-l;B.round();Turtle._lines([(A._position,B)],A._color,A._pensize)if A._pendown else _E;A._position=B
def pendown(A):A._pendown,A._penup=_B,_D
def penup(A):A._penup,A._pendown=_B,_D
def right(A,a):A._angle=A._angle.rotate(a)
def left(A,a):A._angle=A._angle.rotate(-a)
def goto(A,x,y):A._position=Vector(x=x,y=y)
def pensize(A,t):A._pensize=abs(int(t))
def pencolor(A,color):A._color=color
def setx(A,x):A._position.x=x
def sety(A,y):A._position.y=y
def setheading(A,a):A._angle=A._angle.rotate((a-A.heading()+360/2)%360-360/2)
def write(A,text,color=Screen.palette[_G],background=Screen.palette[_H]):draw_string(text,A._position.x,A._position.y,color,background)
def reset(A):fill_rect(0,0,320,222,Screen.palette[_A]);Screen.palette[_A],A._color,A._penup,A._pendown,A._pensize,A._position,A._angle='white',Screen.palette[_C],_B,_D,1,Vector(x=160,y=111),Vector(x=1,y=0)
def home(A):A.goto(160,111);A.setheading(0)
def position(A):return A.xcor(),A.ycor()
def distance(A,x,y):return abs(Vector(x=x,y=y)-A._position)
def towards(A,x,y):x,y=Vector(x=x,y=y)-A._position;return degrees(atan2(y,x))%360
def heading(A):B,C=A._angle;return round(degrees(atan2(C,B)),10)
def isdown(A):return A._pendown==_B
def xcor(A):return A._position.x
def ycor(A):return A._position.y
def circle(C,radius,extent=360,steps=_E):
G=extent;F=radius;D=steps
if D is _E:D=1+int(min(11+abs(F)/6.,59.)*(abs(G)/360))
B=G/D;A=.5*B;E=2*F*sin(radians(A));E,B,A=(-E,-B,-A)if F<0 else(E,B,A);C.left(A)
for H in range(D):C.forward(E);C.left(B)
C.left(-A)
DefaultTurtle=Turtle()
def forward(*A,turtle=DefaultTurtle,**B):turtle.forward(*A,**B)
def backward(*A,turtle=DefaultTurtle,**B):turtle.backward(*A,**B)
def pendown(*A,turtle=DefaultTurtle,**B):turtle.pendown(*A,**B)
def penup(*A,turtle=DefaultTurtle,**B):turtle.penup(*A,**B)
def right(*A,turtle=DefaultTurtle,**B):turtle.right(*A,**B)
def left(*A,turtle=DefaultTurtle,**B):turtle.left(*A,**B)
def goto(*A,turtle=DefaultTurtle,**B):turtle.goto(*A,**B)
def pensize(*A,turtle=DefaultTurtle,**B):turtle.pensize(*A,**B)
def pencolor(*A,turtle=DefaultTurtle,**B):turtle.pencolor(*A,**B)
def setx(*A,turtle=DefaultTurtle,**B):turtle.setx(*A,**B)
def sety(*A,turtle=DefaultTurtle,**B):turtle.sety(*A,**B)
def setheading(*A,turtle=DefaultTurtle,**B):turtle.setheading(*A,**B)
def write(*A,turtle=DefaultTurtle,**B):turtle.write(*A,**B)
def reset(*A,turtle=DefaultTurtle,**B):turtle.reset(*A,**B)
def home(*A,turtle=DefaultTurtle,**B):turtle.home(*A,**B)
def circle(*A,turtle=DefaultTurtle,**B):turtle.circle(*A,**B)
def position(*A,turtle=DefaultTurtle,**B):return turtle.position(*A,**B)
def distance(*A,turtle=DefaultTurtle,**B):return turtle.distance(*A,**B)
def towards(*A,turtle=DefaultTurtle,**B):return turtle.towards(*A,**B)
def heading(*A,turtle=DefaultTurtle,**B):return turtle.heading(*A,**B)
def isdown(*A,turtle=DefaultTurtle,**B):return turtle.isdown(*A,**B)
def xcor(*A,turtle=DefaultTurtle,**B):return turtle.xcor(*A,**B)
def ycor(*A,turtle=DefaultTurtle,**B):return turtle.ycor(*A,**B)
def bgcolor(color):Screen.palette[_A]=kd.color(color);fill_rect(0,0,320,222,Screen.palette[_A])
def clear():fill_rect(0,0,320,222,Screen.palette[_A])
color,fd,rt,lt,pos,color,background,width=pencolor,forward,right,left,position,pencolor,bgcolor,pensize
bk=back=backward
setpos=setposition=goto
pu=up=penup
pd=down=pendown
77 changes: 77 additions & 0 deletions src/visual/extensions/turtle/ext_turtle_for_computer.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
_H='SecondaryText'
_G='PrimaryText'
_F='SecondaryColor'
_E=None
_D=False
_C='PrimaryColor'
_B=True
_A='Background'
from visuel import Vector,fill_rect,set_lines,draw_string
from math import sin,atan2,degrees,radians
import kandinsky as kd
try:from ext_lines import draw_lines
except:pass
class Screen:palette={_A:(248,252,248),_C:(0,0,0),_F:(200,200,200),_G:(0,0,0),_H:(248,252,248),_C:(0,0,0),_F:(200,200,200),'ThirdColor':(235,235,235)}
class Turtle:
def __init__(A,position=Vector(x=160,y=111),color=Screen.palette[_C],angle=Vector(x=1,y=0),pensize=1):A._color,A._penup,A._pendown,A._pensize,A._position,A._angle=color,_B,_D,pensize,position,angle
@staticmethod
def _lines(lines,color,pensize):C=pensize;B=color;A=lines;set_lines(A,B)if C==1 else draw_lines(A,B,C)
def forward(A,l):B=A._position+A._angle*l;round(B);Turtle._lines([(A._position,B)],A._color,A._pensize)if A._pendown else _E;A._position=B
def backward(A,l):B=A._position+A._angle*-l;round(B);Turtle._lines([(A._position,B)],A._color,A._pensize)if A._pendown else _E;A._position=B
def pendown(A):A._pendown,A._penup=_B,_D
def penup(A):A._penup,A._pendown=_B,_D
def right(A,a):A._angle=A._angle.rotate(a)
def left(A,a):A._angle=A._angle.rotate(-a)
def goto(A,x,y):A._position=Vector(x=x,y=y)
def pensize(A,t):A._pensize=abs(int(t))
def pencolor(A,color):A._color=color
def setx(A,x):A._position.x=x
def sety(A,y):A._position.y=y
def setheading(A,a):A._angle=A._angle.rotate((a-A.heading()+360/2)%360-360/2)
def write(A,text,color=Screen.palette[_G],background=Screen.palette[_H]):draw_string(text,A._position.x,A._position.y,color,background)
def reset(A):fill_rect(0,0,320,222,Screen.palette[_A]);Screen.palette[_A],A._color,A._penup,A._pendown,A._pensize,A._position,A._angle='white',Screen.palette[_C],_B,_D,1,Vector(x=160,y=111),Vector(x=1,y=0)
def home(A):A.goto(160,111);A.setheading(0)
def position(A):return A.xcor(),A.ycor()
def distance(A,x,y):return abs(Vector(x=x,y=y)-A._position)
def towards(A,x,y):x,y=Vector(x=x,y=y)-A._position;return degrees(atan2(y,x))%360
def heading(A):B,C=A._angle;return round(degrees(atan2(C,B)),10)
def isdown(A):return A._pendown==_B
def xcor(A):return A._position.x
def ycor(A):return A._position.y
def circle(C,radius,extent=360,steps=_E):
G=extent;F=radius;D=steps
if D is _E:D=1+int(min(11+abs(F)/6.,59.)*(abs(G)/360))
B=G/D;A=.5*B;E=2*F*sin(radians(A));E,B,A=(-E,-B,-A)if F<0 else(E,B,A);C.left(A)
for H in range(D):C.forward(E);C.left(B)
C.left(-A)
DefaultTurtle=Turtle()
def forward(*A,turtle=DefaultTurtle,**B):turtle.forward(*A,**B)
def backward(*A,turtle=DefaultTurtle,**B):turtle.backward(*A,**B)
def pendown(*A,turtle=DefaultTurtle,**B):turtle.pendown(*A,**B)
def penup(*A,turtle=DefaultTurtle,**B):turtle.penup(*A,**B)
def right(*A,turtle=DefaultTurtle,**B):turtle.right(*A,**B)
def left(*A,turtle=DefaultTurtle,**B):turtle.left(*A,**B)
def goto(*A,turtle=DefaultTurtle,**B):turtle.goto(*A,**B)
def pensize(*A,turtle=DefaultTurtle,**B):turtle.pensize(*A,**B)
def pencolor(*A,turtle=DefaultTurtle,**B):turtle.pencolor(*A,**B)
def setx(*A,turtle=DefaultTurtle,**B):turtle.setx(*A,**B)
def sety(*A,turtle=DefaultTurtle,**B):turtle.sety(*A,**B)
def setheading(*A,turtle=DefaultTurtle,**B):turtle.setheading(*A,**B)
def write(*A,turtle=DefaultTurtle,**B):turtle.write(*A,**B)
def reset(*A,turtle=DefaultTurtle,**B):turtle.reset(*A,**B)
def home(*A,turtle=DefaultTurtle,**B):turtle.home(*A,**B)
def circle(*A,turtle=DefaultTurtle,**B):turtle.circle(*A,**B)
def position(*A,turtle=DefaultTurtle,**B):return turtle.position(*A,**B)
def distance(*A,turtle=DefaultTurtle,**B):return turtle.distance(*A,**B)
def towards(*A,turtle=DefaultTurtle,**B):return turtle.towards(*A,**B)
def heading(*A,turtle=DefaultTurtle,**B):return turtle.heading(*A,**B)
def isdown(*A,turtle=DefaultTurtle,**B):return turtle.isdown(*A,**B)
def xcor(*A,turtle=DefaultTurtle,**B):return turtle.xcor(*A,**B)
def ycor(*A,turtle=DefaultTurtle,**B):return turtle.ycor(*A,**B)
def bgcolor(color):Screen.palette[_A]=kd.color(color);fill_rect(0,0,320,222,Screen.palette[_A])
def clear():fill_rect(0,0,320,222,Screen.palette[_A])
color,fd,rt,lt,pos,color,background,width=pencolor,forward,right,left,position,pencolor,bgcolor,pensize
bk=back=backward
setpos=setposition=goto
pu=up=penup
pd=down=pendown
15 changes: 15 additions & 0 deletions src/visual/extensions/turtle/turtle_example.min.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
_A='magenta'
from ext_turtle import*
from time import sleep
def infinity():setheading(0);pendown();color('blue');pensize(3);pendown();left(90);circle(50,180);home();right(90);circle(50,180)
def rosace():
setheading(0);pendown();pensize(1);colors=['red',_A,'blue','cyan','green','white','yellow']
for _ in range(6):
for col in colors:pencolor(col);circle(50);left(10)
def von_koch():
def _von_koch(n,L):
if n==0:forward(L)
else:_von_koch(n-1,L/3);left(60);_von_koch(n-1,L/3);right(120);_von_koch(n-1,L/3);left(60);_von_koch(n-1,L/3)
setheading(0);pendown();color(_A);pensize(1)
for i in range(6):clear();penup();goto(0,111);pendown();_von_koch(i,320);sleep(1)
von_koch()
Loading