summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Planes.m4
diff options
context:
space:
mode:
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.m4175
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