summaryrefslogtreecommitdiff
path: root/graphics/circuit_macros/examples/Planes.m4
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/circuit_macros/examples/Planes.m4')
-rw-r--r--graphics/circuit_macros/examples/Planes.m495
1 files changed, 95 insertions, 0 deletions
diff --git a/graphics/circuit_macros/examples/Planes.m4 b/graphics/circuit_macros/examples/Planes.m4
new file mode 100644
index 0000000000..726af31c56
--- /dev/null
+++ b/graphics/circuit_macros/examples/Planes.m4
@@ -0,0 +1,95 @@
+.PS
+# Planes.m4
+threeD_init
+NeedDpicTools
+
+# This 3D diagram is like many others: define the facets, use the normal vectors
+# to determine visibility, sort and plot the facets from back to front.
+
+define(`mark',`"`$1'" at `$1'')
+
+# 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)
+
+# Store a point as x[i], y[i], z[i]
+define(`mkxyz',`
+ x[$1] = $2
+ y[$1] = $3
+ z[$1] = $4')
+# Recover point coordinates
+define(`xyz',`x[$1], y[$1], z[$1]')
+
+# Facets are rectangles here; store 3 corners
+define(`mkfacet',`
+ mkxyz((`$1')*3, 0,`$2'.x,`$2'.y)
+ mkxyz((`$1')*3+1, 0,`$3'.x,`$3'.y)
+ mkxyz((`$1')*3+2,-d,`$3'.x,`$3'.y)
+')
+# Define the facets
+ mkfacet(1,A0,CA) mkfacet(2,CA,A0)
+ mkfacet(3,CA,AB) mkfacet(4,AB,CA)
+ mkfacet(5,AB,A1) mkfacet(6,A1,AB)
+
+ mkfacet(7,B0,AB) mkfacet(8,AB,B0)
+ mkfacet(9,AB,BC) mkfacet(10,BC,AB)
+ mkfacet(11,BC,B1) mkfacet(12,B1,BC)
+
+ mkfacet(13,C0,BC) mkfacet(14,BC,C0)
+ mkfacet(15,BC,CA) mkfacet(16,CA,BC)
+ mkfacet(17,CA,C1) mkfacet(18,C1,CA)
+ nfacets = 18
+
+# View angles azimuth, elevation, rotation (degrees)
+ setview( 10, 30, 5)
+
+ifelse(1,1,`
+# # create array of visible facets and sort
+ n = 0
+ for i=1 to nfacets do {
+ mkxyz(-1,
+ cross3D(diff3D(xyz(i*3+1),xyz(i*3)),diff3D(xyz(i*3+2),xyz(i*3+1))))
+ dx = dot3D(xyz(-1),View3D)
+ if dx > 0 then {
+ dy[i] = dx/length3D(xyz(-1))
+ n +=1
+ d[n] = dot3D(sum3D(xyz(i*3),xyz(i*3+2)),View3D)/2
+ ix[n] = i
+ }
+ }
+ dpquicksort(d,1,n,ix)
+
+#print sprintf("n=%g",n); for i=1 to n do { print i,ix[i] }
+
+# Recover the 4th corner and draw
+define(`drawfacet',`
+ NW_facet: project(xyz(($1)*3))
+ NE_facet: project(xyz(($1)*3+1))
+ SE_facet: project(xyz(($1)*3+2))
+ SW_facet: project(x[($1)*3+2],y[($1)*3],z[($1)*3])
+ shd = 1-($2)^4
+ line from SW_facet to SE_facet then to NE_facet \
+ then to NW_facet then to SW_facet shaded rgbstring(shd,shd,shd)
+# sprintf("%g",$1) at 0.5 between SW_facet and NE_facet
+# Loopover_(`x',`mark(x);',SW_facet,SE_facet,NE_facet,NW_facet)
+ ')
+
+# # draw facets, shading with view cosines
+ for i=1 to n do { drawfacet(ix[i],dy[ix[i]]) }
+')
+
+.PE