Skip to content

Instantly share code, notes, and snippets.

@bhugueney
Created April 7, 2016 14:22
Show Gist options
  • Save bhugueney/31d28ded6b46b0fd94e26f4f1f961c4e to your computer and use it in GitHub Desktop.
Save bhugueney/31d28ded6b46b0fd94e26f4f1f961c4e to your computer and use it in GitHub Desktop.
import math
import turtle
def rotate(a, v):
(x, y)= v
return (math.cos(a)*x - math.sin(a)*y, math.sin(a)*x + math.cos(a)*y)
def demo0(n):
angle_step= 2*math.pi/n
p= (0,100)
turtle.up()
for i in range(n+1):
turtle.goto(p)
p= rotate(angle_step, p)
turtle.down()
#TODO spirals !
#demo0(5)
#demo0(int(turtle.numinput("rotations", "combien de côtés ?")))
def add(v0, v1):
(x0, y0)=v0
(x1, y1)=v1
return (x0+x1, y0+y1)
def mult_scalar(k, v):
(x, y)= v
return (k*x, k*y)
def sub(v0, v1):
return add(v0, mult_scalar(-1, v1))
def rotate_around(c, a, v):
return add(c, rotate(a, sub(v, c)))
def demo1_helper(c, p, n):
turtle.up()
for i in range(n+1):
turtle.goto(p)
p= rotate_around(c, 2*math.pi/n, p)
turtle.down()
def demo1(n):
demo1_helper((50, 25), (0,100), n)
#demo1(int(turtle.numinput("rotations", "combien de côtés ?")))
def demo2(n0, n1):
p= (0, 100)
c= (0, 50)
for i in range(n0):
demo1_helper(c, p, n1)
c= rotate(2*math.pi/n0, c)
#demo2(int(turtle.numinput("rotations", "combien de polygones ?")), int(turtle.numinput("rotations", "combien de côtés ?")))
def demo3(r0, r1):
p0= (0, r0)
p1= (0, r0+r1)
n= 512
a_step= 2*math.pi/n
i_range=range(n)
turtle.up()
for i0 in i_range:
p1= rotate_around(p0, a_step*-3, p1)
turtle.goto(p1)
turtle.down()
p0= rotate(a_step, p0)
#demo3(50, -45)
def three_arms(rv0, rv1, rv2):
(r0, v0)= rv0
(r1, v1)= rv1
(r2, v2)= rv2
p0= (0, r0)
p1= (0, r0+r1)
p2= (0, r0+r1+r2)
n= 512
a_step= 2*math.pi/n
a=0
turtle.up()
for i0 in range(n):
turtle.goto(rotate(a*v0, rotate_around(p0, a*v1, rotate_around(p1, a*v2, p2))))
turtle.down()
a+= a_step
def demo4(size):
#size = L + M + S
# S= L/6
# M= L/2
l= size/(1+1/2+1/6)
three_arms((l,1), (l/2,4), (l/6,16))
def demo5(size, n):
c= size*15/200 # n =10
# c= size*4/200 # n= 8
# c= size*10/200 # n= 9
# c= size*25/200 # n= 20
# size= L + M + S
# L= M+S+C
# 2*size= 2*L + C
l=(size+c)/2
m_size= 1 + math.sqrt(2)/2
s_size= (2-math.sqrt(2))/4
m_s_ratio= m_size/s_size
# size- L = M (1+S/M)
m= (size - l)/(1+s_size/m_size)
s= (m/ m_size) * s_size
three_arms((l,1),(m,-n),(s, 4*n))
def demo6(size):
# size= L + M + S = 3*M + 2*S=(3+1/3)M
# L= 2*M + S
# S=M/6
m= size/(3+1/3)
s= m/6
three_arms((2*m+s,1), (m,-12), (s, 12*6))
#demo5(200, 10)
#demo4(300)
demo6(200)
# 11/12 * 2 * math.pi
turtle.exitonclick()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment