10371
Comment:
|
14162
|
Deletions are marked like this. | Additions are marked like this. |
Line 9: | Line 9: |
{{{ | {{{#!sagecell#!sagecell |
Line 51: | Line 51: |
{{{ | {{{#!sagecell |
Line 121: | Line 121: |
{{{ | {{{#!sagecell |
Line 134: | Line 134: |
{{{ | {{{#!sagecell |
Line 157: | Line 157: |
{{{ | {{{#!sagecell |
Line 163: | Line 163: |
}}} {{{#!sagecell |
|
Line 174: | Line 176: |
{{{ | {{{#!sagecell |
Line 185: | Line 187: |
== Interactive 2d Plotting == | == Interactive 2D Plotting == |
Line 187: | Line 189: |
{{{ | {{{#!sagecell |
Line 220: | Line 222: |
{{{ | {{{#!sagecell |
Line 239: | Line 241: |
== Spirograph == {{{#!sagecell #---------------------------# # Javier Pérez Lázaro # # Logroño (Spain) # # [email protected] # #---------------------------# #introduction html('<h1><center>Spirograph</center></h1>') text1='Spirograph is a tool for drawing hypotrochoids and epitrochoids.' text2='Assume that a A is a point attached to a circle. A can be attached to the boundary of the circle or to any exterior or interior place. If the circle rolls around the outside of a fixed circle, the curve traced by the point A is called an epitrochoid. In case the circle rolls around the inside of a fixed circle, the curve is an hypotrochoid.' text3='If the quotient between the radii of the circles is a rational number, then the curves are periodic.' #the code @interact def fun( tex1=text_control(text1), tex2=text_control(text2), tex3=text_control(text3), h=('Select:',list(['epitrochoid','hypotrochoid'])), tex4=text_control('Radius of the circle. Should be a rational number with shape p/q.'), b=input_box(default=7/30,label='radius'), tex5=text_control("Rate between the distance of the point to the circle's center and the radius."), rate=input_box(default=1), u=selector(['Plot the curve. Slider of % below enabled.', 'Build an animation of the plot with the number of frames specified below.'],label='Choose:'), per=slider(0,100,1,default=100,label='graph %'), frames=100, cir_bool=checkbox(True, "Show circles?"), auto_update=false): draw=True if h=='hypotrochoid' and (b>=1 or b<=0): print "In a hypotrochoid, radius must be between 0 and 1." draw=False if h=='epitrochoid' and b<=0: print "In a epitrochoid, radius must be positive" draw=False if draw==True: if h=='hypotrochoid': b=-b var('t') cx=(1+b)*cos(t*b/(1+b)) cy=(1+b)*sin(t*b/(1+b)) px=cx-b*rate*cos(t) py=cy-b*rate*sin(t) axeM=1+max([0,b+abs(b)*rate]) if u=='Plot the curve. Slider of % below enabled.': tMax=pi*denominator(b/(b+1))*per/50 L=parametric_plot((px,py),(t,0,max([0.001,tMax])),plot_points=10*rate*tMax) if cir_bool: p=point((px(t=tMax),py(t=tMax)),pointsize=30,color='blue') c=point((cx(t=tMax),cy(t=tMax)),pointsize=30,color='red') cir=circle((cx(t=tMax),cy(t=tMax)),b,color='red') lin=line([(cx(t=tMax),cy(t=tMax)),(px(t=tMax),py(t=tMax))]) L+=circle((0,0),1)+cir+lin+p+c show(L,aspect_ratio=1,xmin=-axeM,xmax=axeM,ymin=-axeM,ymax=axeM) if u=='Build an animation of the plot with the number of frames specified below.': tMax=2*pi*denominator(b/(b+1)) step=tMax/(frames-1) curva=Graphics() v=[] for a in srange(step,tMax,step): curva+=parametric_plot((px,py),(t,a-step,a)) L=curva if cir_bool: cx_a=cx(t=a) cy_a=cy(t=a) px_a=cx_a-b*rate*cos(a) py_a=cy_a-b*rate*sin(a) p=point((px_a,py_a),pointsize=30,color='blue') c=point((cx_a,cy_a),pointsize=30,color='red') cir=circle((cx_a,cy_a),b,color='red') lin=line([(cx_a,cy_a),(px_a,py_a)]) L+=circle((0,0),1)+cir+lin+c+p v.append(L) animate(v,xmin=-axeM,xmax=axeM,ymin=-axeM,ymax=axeM,aspect_ratio=1).show() }}} {{attachment:interactive_animate_spirograph.png}} |
Sage Interactions - Graphics
goto interact main page
Contents
Curves of Pursuit
by Marshall Hampton. {{{#!sagecell#!sagecell npi = RDF(pi) from math import cos,sin def rot(t):
return matrix(cos(t),sin(t)],[-sin(t),cos(t))
def pursuit(n,x0,y0,lamb,steps = 100, threshold = .01):
paths = [x0,y0] for i in range(1,n):
- rx,ry = list(rot(2*npi*i/n)*vector([x0,y0]))
paths.append(rx,ry)
diffs = oldpath[(j+1)%n][0]-oldpath[j][0],oldpath[(j+1)%n][1]-oldpath[j][1 for j in range(n)] npath = oldpath[j][0]+lamb*diffs[j][0],oldpath[j][1]+lamb*diffs[j][1 for j in range(n)] for j in range(n):
- paths[j].append(npath[j])
- rx,ry = list(rot(2*npi*i/n)*vector([x0,y0]))
html('<h3>Curves of Pursuit</h3>') @interact def curves_of_pursuit(n = slider([2..20],default = 5, label="# of points"),steps = slider([floor(1.4^i) for i in range(2,18)],default = 10, label="# of steps"), stepsize = slider(srange(.01,1,.01),default = .2, label="stepsize"), colorize = selector(['BW','Line color', 'Filled'],default = 'BW')):
- outpaths = pursuit(n,0,1,stepsize, steps = steps) mcolor = (0,0,0) outer = line([q[0] for q in outpaths]+[outpaths[0][0]], rgbcolor = mcolor) polys = Graphics() if colorize=='Line color':
- colors = [hue(j/steps,1,1) for j in range(len(outpaths[0]))]
- colors = [(0,0,0) for j in range(len(outpaths[0]))]
- colors = [hue(j/steps,1,1) for j in range(len(outpaths[0]))] polys = sum([polygon([outpaths[(i+1)%n][j+1],outpaths[(i+1)%n][j], outpaths[i][j+1]], rgbcolor = colors[j]) for i in range(n) for j in range(len(outpaths[0])-1)]) #polys = polys[0] colors = [(0,0,0) for j in range(len(outpaths[0]))]
}}}
Catalog of 3D Parametric Plots
Interactive rotatable raytracing with Tachyon3d
Interactive 3d plotting
Somewhat Silly Egg Painter
by Marshall Hampton (refereed by William Stein)
Plot Coloring
by Timothy Clemans
Interactive 2D Plotting
by Timothy Clemans
Interact with matplotlib
Spirograph