diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4')
-rw-r--r-- | Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4 | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4 b/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4 new file mode 100644 index 00000000000..9344bd2ddad --- /dev/null +++ b/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4 @@ -0,0 +1,175 @@ +.PS +# Planes.m4 +threeD_init +NeedDpicTools + +# These 3D diagrams are like many others: define the surface facets, +# use normal vectors to determine visibility, sort and plot the visible +# facets from back to front. + +# Store a point as x_[i], y_[i], z_[i] +define(`mktriple',` + x_[$1] = $2 + y_[$1] = $3 + z_[$1] = $4') +# Recover point coordinates +define(`triple',`x_[$1], y_[$1], z_[$1]') + +define(`facetnormal',`cross3D( + diff3D(triple($1*3+1),triple($1*3)), + diff3D(triple($1*3+2),triple($1*3+1)))') + +define(`facetcenter',`sprod3D(0.5,sum3D(triple($1*3),triple($1*3+2)))') + +# Create npositive, arrays dcosine[1..npositive] +# and index ix[1..npositive] of sorted facets +# Uses macros facetnormal(i) and facetcenter(i) +define(`processfacets',` + npositive = 0 + for i=1 to `$1' do { + mktriple(0,facetnormal(i)) + dx = dot3D(triple(0),View3D) + if dx > 0 then { + dcosine[i] = dx/length3D(triple(0)) # direction cosine normal wrt View3D + npositive +=1 + dist[npositive] = dot3D(facetcenter(i),View3D) # distance + ix[npositive] = i + } + } + dpquicksort(dist,1,npositive,ix) ') + +ifelse(1,1,` +Threeplanes: [ +# Size parameters + a = 3/2 + b = 0.4 + d = 1 +# Define intersecting lines in the plane + A0: -a,-b + A1: a,-b + B0: Rot_(A0,120) + B1: Rot_(A1,120) + C0: Rot_(A0,240) + C1: Rot_(A1,240) + +# Intersections +define(`lintersect',`intersect_(`$1'0,`$1'1,`$2'0,`$2'1)') + AB: lintersect(A,B) + BC: lintersect(B,C) + CA: lintersect(C,A) + +# Facets are rectangles here; store 3 corners +define(`mkfacet',` + mktriple((`$1')*3, 0,`$2'.x,`$2'.y) + mktriple((`$1')*3+1, 0,`$3'.x,`$3'.y) + mktriple((`$1')*3+2,-d,`$3'.x,`$3'.y) + ') +# Define the facets + mkfacet(m4inx,A0,CA) mkfacet(m4inx,CA,A0) + mkfacet(m4inx,CA,AB) mkfacet(m4inx,AB,CA) + mkfacet(m4inx,AB,A1) mkfacet(m4inx,A1,AB) + + mkfacet(m4inx,B0,AB) mkfacet(m4inx,AB,B0) + mkfacet(m4inx,AB,BC) mkfacet(m4inx,BC,AB) + mkfacet(m4inx,BC,B1) mkfacet(m4inx,B1,BC) + + mkfacet(m4inx,C0,BC) mkfacet(m4inx,BC,C0) + mkfacet(m4inx,BC,CA) mkfacet(m4inx,CA,BC) + mkfacet(m4inx,CA,C1) mkfacet(m4inx,C1,CA) + nfacets = m4x + +# Wierd color +define(`colr',`ifelse(`$1',,"white", + `rgbstring(`$1',ifelse(`$2',,`$1',`$2'),ifelse(`$3',,`$1',`$3'))')') + +# Recover the 4th corner and draw +define(`drawfacet',` + NW_facet: project(triple(($1)*3)) + NE_facet: project(triple(($1)*3+1)) + SE_facet: project(triple(($1)*3+2)) + SW_facet: project(x_[($1)*3+2],y_[($1)*3],z_[($1)*3]) + N_facet: 0.5 between NW_facet and NE_facet + line from N_facet to NE_facet then to SE_facet then to SW_facet \ + then to NW_facet then to N_facet shaded colr(`$2',`$3',`$4') +# fill_(ifelse(`$2',,1,`(1-`$2')')) + ') + +# View angles azimuth, elevation, rotation (degrees) + setview( 10, 40 ) + +# Draw facets, shading with view cosines + processfacets(nfacets) + for i=1 to npositive do { drawfacet(ix[i],max(0,1-2*dcosine[ix[i]]), + dcosine[ix[i]], + dcosine[ix[i]]) +# for i=1 to npositive do { drawfacet(ix[i],dcosine[ix[i]]) + } + +] # Threeplanes +') + +# Bowl +# vertx_(facet_no,vertex_no) + define vertx_ { ($1-1)*nvertices + $2 } + +# Normal vector to a facet +define(`facetnormal',`cross3D( + diff3D(triple(vertx_($1,2)),triple(vertx_($1,1))), + diff3D(triple(vertx_($1,4)),triple(vertx_($1,1))))') + +# Facet center +define(`facetcenter',`sprod3D(1/4,sum3D( + sum3D(triple(vertx_(`$1',1)),triple(vertx_(`$1',2))), + sum3D(triple(vertx_(`$1',3)),triple(vertx_(`$1',4)))))') + +define(`drawplane',` + NW_plane: project(triple(vertx_($1,1))) + SW_plane: project(triple(vertx_($1,2))) + SE_plane: project(triple(vertx_($1,3))) + NE_plane: project(triple(vertx_($1,4))) + N_plane: 0.5 between NW_plane and NE_plane + shd = (`$2')^(1/4) + line from N_plane to NE_plane then to SE_plane then to SW_plane \ + then to NW_plane then to N_plane \ + fill_(ifelse(`$2',,1,shd)) outlined rgbstring(shd,shd,shd) +# line from NW_plane to NE_plane + line from SW_plane to SE_plane + ') + +ifelse(1,1,` + nvertices = 4 # vertices per facet +Bowl: [ + elevation = 30 + setview( 0, 30 ) + nplanes = 40 + bigradius = 2 + smallradius = 1 + cupht = 1.5 + thin = smallradius/10 +# Define the facet corners + for i=1 to nplanes do { + mktriple(vertx_(i,1),rot3Dz((i-1)/nplanes*twopi_,bigradius,0,0)) + mktriple(vertx_(i,2),rot3Dz((i-1)/nplanes*twopi_,smallradius,0,-cupht)) + mktriple(vertx_(i,3),rot3Dz((i )/nplanes*twopi_,smallradius,0,-cupht)) + mktriple(vertx_(i,4),rot3Dz((i )/nplanes*twopi_,bigradius,0,0)) + mktriple(vertx_(nplanes+i,1),triple(vertx_(i,4))) + mktriple(vertx_(nplanes+i,2),triple(vertx_(i,3))) + mktriple(vertx_(nplanes+i,3),triple(vertx_(i,2))) + mktriple(vertx_(nplanes+i,4),triple(vertx_(i,1))) + } +# for i=1 to nplanes do { +# mktriple(vertx_(i,1),rot3Dz((i-1)/nplanes*twopi_,bigradius,0,0)) +# mktriple(vertx_(i,2),rot3Dz((i-1)/nplanes*twopi_,smallradius,0,-cupht)) +# mktriple(vertx_(i,3),rot3Dz((i-1)/nplanes*twopi_,smallradius-thin,0,-cupht)) +# mktriple(vertx_(i,4),rot3Dz((i-1)/nplanes*twopi_,bigradius-thin,0,0)) +# } +# Find the visible facets and sort + processfacets(nplanes*2) + + for i=1 to npositive do { drawplane(ix[i],dcosine[ix[i]]) } + ellipse wid 2*bigradius ht 2*bigradius*sin(elevation*dtor_) at project(0,0,0) + +] #with .sw at Threeplanes.se +') + +.PE |