All pastes #918489 Raw Edit

Someone

public text v1 · immutable
#918489 ·published 2008-02-26 03:27 UTC
rendered paste body
partno spirograph
$$ generate a spirograph figure by the following
$$ parametric equations:
$$ x	=	x_0[mcost+acos(nt)]-y_0[msint-asin(nt)]	
$$ y	=	y_0[mcost+acos(nt)]+x_0[msint-asin(nt)]
$$ Eric W. Weisstein."Spirograph."From MathWorld-A Wolfram Web Resource.
$$ see http://mathworld.wolfram.com/Spirograph.html
clprnt
machin/dxf
machin/pmill
theta=0 $$ 
t=0 $$parametric variable
pi=3.1416
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$ adjust these variables for varying shapes and positions, etc.
$$ p=2,q=3,a=.2,aend=.5,ainc=.03 gives a graph similar to the
$$ mathworld.wolfram.com site
p=2 
q=3 
a=.2 $$starting value of a 
aend= .5$$end value of a
ainc=.03 $$ incr value of a - aend/ainc=number of individual spirographs
$$ overlaid on one another
inc=5 $$the t increment-controls the smoothness of the curve
$$  There is no checking of when the loop closes
$$  you will have to adjust endt manually
endt=2*360 $$ endt/inc =number of lines of g-code or dxf entities per graph
scl= 1 $$use this variable to scale the output
rot=0 $$use this variable to rotate the output
xtrans=0 $$x and y locations of center of graph
ytrans=0
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
m=(q-p)/q
n=(q-p)/p
x0=cosf(theta)
y0=sinf(theta)
mat1=matrix/scale,scl
mat2=matrix/xyrot,rot
mat3=matrix/mat2,mat1
mat4=matrix/transl,xtrans,ytrans
mat5=matrix/mat4,mat3
rapid
tracut/mat5
goto/(x0*(m*cosf(t)+a*cosf(n*t))-y0*(m*sinf(t)-a*sinf(n*t))),$
     (y0*(m*cosf(t)+a*cosf(n*t))+x0*(m*sinf(t)-a*sinf(n*t))),(.1/scl)
godlta/0,0,(-.11/scl)
loopst
agn) 		x=x0*(m*cosf(t)+a*cosf(n*t))-y0*(m*sinf(t)-a*sinf(n*t))
		y=y0*(m*cosf(t)+a*cosf(n*t))+x0*(m*sinf(t)-a*sinf(n*t))
		goto/x,y,(-.01/scl)
		t=t+inc
		if(endt-t)quit,quit,agn
	quit)a=a+ainc
	t=0
	rapid
	godlta/0,0,(.11/scl)
	rapid
	goto/(x0*(m*cosf(t)+a*cosf(n*t))-y0*(m*sinf(t)-a*sinf(n*t))),$
	     (y0*(m*cosf(t)+a*cosf(n*t))+x0*(m*sinf(t)-a*sinf(n*t))),(.1/scl)
if(aend-a)quit2,agn,agn
quit2) loopnd
tracut/nomore

fini