summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/circuit-macros/examples/dpv/EscherDPV.m4
blob: 09f2fa64989f75c5cfb2e4f4c9501e8f59c7b1fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
.PS
# EscherDPV.m4
# https://tex.stackexchange.com/questions/129274/showcase-of-optical-illusions-made-with-tex-latex-luatex-context
threeD_init
[]
ifelse(1,1,`
[
  u=1/2.54                 # unit size; could use scale for this

  define(`treadcolor',`0.8,0.75,0.7')
  define(`darkgrn',`.1,.1,0')
  define(`lightgrn',`.7,.7,.6')

  define(`northsteps',3)
  define(`eaststeps',8)
  define(`southsteps',7)
  define(`weststeps',4)
  define(`baselayers',10)
  define(`eb',eval(baselayers+eaststeps))
  define(`ebs',eval(eb+southsteps))
  define(`under',7)

  azimuth = -45            # view angles
  elevation = 25
  setview(azimuth,elevation,0)
                           # projected unit vectors
  UX: Project(u,0,0)
  UY: Project(0,-u,0)
  UZ: Project(0,0,u)
                           # layer thickness in units of u
  f= -(eaststeps*UX.y + southsteps*UY.y - weststeps*UX.y - northsteps*UY.y)/dnl
      ((eaststeps+southsteps+weststeps+northsteps)*UZ.y)
                           # XY projection of 3D coords in units of u
define proj {UX*($1)+UY*($2)+UZ*($3)}

define tread {line from UY/2 \
  to UY then to UY+UX then to UX then to (0,0) \
  then to UY/2 shaded rgbstring(treadcolor) \
    with .start at proj($1,$2,$3)+UY/2 }

define wrect {line invis from (0,0) to UX*($4) \
  then to UX*($4)+UZ*($5) \
  then to UZ*($5) then to (0,0) with .start at proj($1,$2,$3) \
  shaded rgbstring(r,g,b)} 

define srect {line invis from (0,0) to UY*($4) then to UY*($4)+UZ*($5) \
  then to UZ*($5) then to (0,0) with .start at proj($1,$2,$3) \
  shaded rgbstring(r,g,b) } 
                           # color blending
define(`blendwht',`between3D(`$1',`$2',`$3',`$4',1,1,1)')
define makergb { r = $1; g = $2; b = $3 }
define dorgb { gg = $2
  if $1==0 then { makergb(blendwht(gg,lightgrn)) } \
  else { makergb(blendwht(gg,darkgrn)) } }

# East
  for i=-under to baselayers do {
    dorgb((i%2),0.2)
    wrect(1,1,i*f,eaststeps-2,-f) }
  for i=0 to eaststeps do {
    dorgb((i%2),0.2)
    wrect(i,1,(baselayers+i)*f,(eaststeps+1-i),-f)
    tread(i,0,(baselayers+i)*f)
    line from proj(i,1,(baselayers+i)*f) \
           to proj(i,1,(baselayers-1+i)*f) }
# South
  for i=0 to eb do {
    dorgb((i%2),0.4)
    srect(eaststeps+1,0,i*f,southsteps+1,-f) }
  for i=1 to southsteps do {
    dorgb((i%2),0.4)
    srect(eaststeps+1,i,(eb+i)*f,(southsteps+1-i),-f)
    tread(eaststeps,i,(eb+i)*f)
    line from proj(eaststeps+1,i,(eb+i)*f) \
      to proj(eaststeps+1,i,(eb+i-1)*f) }
# North
  for i=-under to baselayers-northsteps-1 do {
    dorgb((i%2),0.1)
    srect(1,1,i*f,northsteps-1,-f) }
  for i=1 to northsteps do {
    dorgb((i%2),0.1)
    srect(1,1,(baselayers-i)*f,i,-f)
    wrect(0,1+i,(baselayers-i)*f,1,-f)
    line from proj(0,1+i,(baselayers-i)*f) \
           to proj(0,1+i,(baselayers-i-1)*f)
    line from proj(1,1+i,(baselayers-i)*f) \
           to proj(1,1+i,(baselayers-i-1)*f)
    tread(0,i,(baselayers-i)*f) }
# West
  for i=0 to ebs do {
    dorgb((i%2),0.4)
    wrect(eaststeps+1,southsteps+1,i*f,-(weststeps+1),-f) }
  for i=0 to weststeps-1 do {
    dorgb((i%2),0.4)
    wrect(eaststeps-i,southsteps+1,(ebs+i+1)*f,-(weststeps-i),-f,)
    srect(eaststeps-i,southsteps,(ebs+i+1)*f,1,-f)
    if i!=weststeps-1 then {
      line from proj(eaststeps-i,southsteps,(ebs+i+1)*f) \
             to proj(eaststeps-i,southsteps,(ebs+i)*f) }
    line from proj(eaststeps-i,southsteps+1,(ebs+i+1)*f) \
           to proj(eaststeps-i,southsteps+1,(ebs+i)*f)
    tread(eaststeps-(i+1),southsteps,(ebs+i+1)*f) }
# Corner lines
  define(`dgreen',`outlined rgbstring(blendwht(0.2,darkgrn))')
  line dgreen from proj(1,1,(baselayers-1)*f) to proj(1,1,-under*f)
  line dgreen from proj(eaststeps+1,southsteps+1,ebs*f) \
         to proj(eaststeps+1,southsteps+1,-f)
  line dgreen from proj(0,northsteps+1,(baselayers-northsteps)*f) \
    to last line.end-UX*(weststeps+1) then to last line.end \
    then to proj(eaststeps+1,0,-f) then to proj(eaststeps+1,0,eb*f)
  ]
')

ifelse(1,1,`
define(`DPL',`(project(`$1',`$2',`$3'))')
define(`ISL',`
  S1: `$2'; E1: `$2' + `$3'
  S2: `$4'; E2: `$4' + `$5'
  `$1': line from S2 to intersect_(S1,E1,S2,E2) ')

[
  bdp = 1.8
  bwd = 2.8
  bht = 1.5 
  bth = bwd/10
  setview(-45,20,0)

  L1: line from DPL(0,0,0) to DPL(0,0,bht) \
    then to DPL(0,bwd,bht) \
    then to DPL(bdp,bwd,bht) \
    then to DPL(bdp,bwd,0) \
    then to DPL(bdp,0,0) \
    then to DPL(0,0,0)
  L2: line from DPL(bth,bth,bht) to DPL(bth,bwd-bth,bht) \
    then to DPL(bdp-bth,bwd-bth,bht) \
    then to DPL(bdp-bth,bth,bht) \
    then to DPL(bth,bth,bht)
  L3: line from DPL(bth,bth,0) to DPL(bth,bwd-bth,0) \
    then to DPL(bdp-bth,bwd-bth,0) \
    then to DPL(bdp-bth,bth,0) \
    then to DPL(bth,bth,0)
  L4: line from DPL(bdp,bth,bht-bth) to DPL(bdp,bwd-bth,bht-bth) \
    then to DPL(bdp,bwd-bth,bth) \
    then to DPL(bth+bth,bwd-bth,bth)
  L5: line from DPL(bdp-bth,0,bht-bth) to DPL(bth,0,bht-bth) \
    then to DPL(bth,0,bth) \
    then to DPL(bth,bwd-bth-bth,bth)
  L6: line from DPL(0,0,bht) to DPL(bdp,0,bht) \
    then to DPL(bdp,bwd,bht)
  L7: line from DPL(0,0,0) to DPL(0,bwd,0) \
    then to DPL(bdp,bwd,0)
  ISL(L8,L4.start,UPy_,L4.end,UPz_)
  ISL(L9,L4.start,UPy_,DPL(0,bwd,0),UPz_)
  ISL(L10,L4.start,UPy_,L5.end,UPz_)
  ISL(L11,L5.end,UPy_,L4.start,UPz_)
  ISL(L12,L5.end,UPy_,DPL(bdp,0,bht),UPz_)
  ISL(L13,L5.end,UPy_,L5.start,UPz_)
  ISL(L14,DPL(bdp-bth,bth,bht),UPy_,DPL(bth,bwd-bth-bth,bht-bth),UPz_)
  ISL(L15,L2.start,UPx_,DPL(bth,bwd-bth-bth,bht-bth),UPy_)
  ISL(L16,DPL(bdp-bth,bth,bht),UPy_,DPL(bth,bwd-bth,bht),UPz_)
  ISL(L17,DPL(bdp-bth,bth,bht),UPy_,DPL(bth+bth,bwd-bth,bht-bth),UPz_)
  ISL(L18,DPL(bdp-bth,bth,bht),UPy_,DPL(bth+bth,bwd-bth,bht-bth),UPx_)
  ISL(L19,L3.start,UPy_,L5.start+DPL(0,0,-bht+bth+bth),UPx_)
  ISL(L20,L3.start,UPy_,L5.start+DPL(0,0,-bht+bth+bth),UPz_)
  ISL(L21,L3.start,UPy_,DPL(bdp-bth,bth,0),UPz_)
  ISL(L22,L3.start,UPy_,L4.start+DPL(0,0,-bht+bth+bth),UPz_)
  ISL(L23,DPL(bth,bwd-bth,0),UPx_,L4.start+DPL(0,0,-bht+bth+bth),UPy_)
  ISL(L24,L5.start,UPx_,DPL(bth,bth,bth),UPz_)
  ISL(L25,L4.start,UPy_,DPL(bdp-bth,bwd-bth,bth),UPz_)

ifelse(0,1,`for i=1 to 7 do { exec sprintf("\"L%g.s\" at L%g.start",i,i) }
  for i=8 to 10 do { exec sprintf("\"L%g\" at L%g",i,i) }')
] with .sw at last [].se+(0.2,0)
')
.PE