diff options
Diffstat (limited to 'graphics/circuit_macros/examples/extras/Orbits.m4')
-rw-r--r-- | graphics/circuit_macros/examples/extras/Orbits.m4 | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/graphics/circuit_macros/examples/extras/Orbits.m4 b/graphics/circuit_macros/examples/extras/Orbits.m4 new file mode 100644 index 0000000000..ef85d27935 --- /dev/null +++ b/graphics/circuit_macros/examples/extras/Orbits.m4 @@ -0,0 +1,74 @@ +.PS +# Orbits.m4 +threeD_init +NeedDpicTools + + crad = 1.0 + g = 0.65 + +# `orbitpos(long,lat,rad,ang)' +define(`orbitpos', + `rot3Dx((`$2')*dtor_,rot3Dz((`$1')*dtor_,rot3Dy(-(`$4')*dtor_,`$3',0,0)))') + +define(`PO',`B.C+(Project(orbitpos(orbitlong,orbitlat,orbitrad,`$1')))') + +define vis { X: PO($1) + if (distance(X,B.C)>crad) || \ + (dot3D(View3D,orbitpos(orbitlong,orbitlat,orbitrad,$1))>0) \ + then {$2 = 1} else {$2 = -1} } + +# `orbit(long,lat,rad)' +define(`orbit', + `[da = 3 + orbitlong = `$1' + orbitlat = `$2' + orbitrad = `$3' + define(`decorated',`ifelse(`$4',,,`outlined `$4'')') + arrow from PO(0) to PO(da*3) decorated + n=0 + P[n]: PO(0) + vis(0,v) + for d=da to 360 by da do { + vis(d,x) + if x*v < 0 then { + findroot(vis,d-da,d,1e-6,x) + n+=1; P[n]: PO(x) + if v < 0 then { fitcurve(P,n,dashed decorated) } \ + else { fitcurve(P,n,decorated) } + P[0]: P[n] + n = 0; v = -v } + n +=1; P[n]: PO(d) + } + if v < 0 then { fitcurve(P,n,dashed decorated) } \ + else { fitcurve(P,n,decorated) } + ] with .c at B.C') + +# ball(rad,highlight rad,highlight degrees) +define(`ball',`[ + lt = linethick bp__ + C: circle invis rad `$1' at (0,0) + D: C+(Rect_(`$2',`$3')) + rm = `$1'+distance(C,D) + a = 1 # fade rate parameter + for r=lt to rm by lt do { + u = 1-(r/rm*(a*r/rm+(1-a))) + if r < (1-g)*`$1' then { circle outlined rgbstring(u,u,u) rad r at D } \ + else { arc cw outlined rgbstring(u,u,u) from Cintersect(D,r,C,`$1') \ + to Cintersect(D,r,C,`$1',R) with .c at D + } + } + circle rad C.rad at C + ]') + + linethick = 0.8 + B: ball(crad,crad*g,110) + + azimuth = 0 + elevation = 0 + setview(azimuth,elevation) + + orbit(10, 30,crad*1.3,"red") + orbit(10,-30,crad*1.3,"blue") + orbit(10,-90,crad*1.3,"cyan") + +.PE |