diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Clocks.m4')
-rw-r--r-- | Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Clocks.m4 | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Clocks.m4 b/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Clocks.m4 new file mode 100644 index 00000000000..2c8cd097daf --- /dev/null +++ b/Master/texmf-dist/doc/latex/circuit-macros/examples/extras/Clocks.m4 @@ -0,0 +1,229 @@ +.PS +# AntiqueClock.m4 +gen_init +NeedDpicTools +# https://tex.stackexchange.com/questions/236923/generate-analog-clock-with-numbered-face-add-seconds-roman-numerals + +# `hms2deg(hr,min,sec) hr:min:sec to degrees +# blank arg1: degrees for minute hand +# blank arg1 and arg2: degrees for second hand' +define(`hms2deg',`ifelse(`$1',, + `ifelse(`$2',, + `(90-pmod(ifelse(`$3',,0,`$3'),60)/60*360)', + `(90-(pmod(`$2',60)/60 + pmod(ifelse(`$3',,0,`$3'),60)/60/60)*360)')', + `(90-(pmod(`$1',12) + pmod(ifelse(`$2',,0,`$2'),60)/60 + dnl + pmod(ifelse(`$3',,0,`$3'),60)/3600)/12*360)')') + +# `SecondHand(length,hr,min,sec)' +define(`SecondHand',`[ shsf = (`$1')/3.2 + C: Here + { L: rpoint_(to (Rect_(`$1',hms2deg(,,`$4')))) } + line thick 8*shsf to rvec_(`$1',0) + ]') + +# `AntiqueMinuteHand(length,hr,min,sec)' +define(`AntiqueMinuteHand',`[ mhsf = (`$1')/2.84 + L: rpoint_(to (Rect_(`$1',hms2deg(,`$3',`$4')))) + C: circle fill_(0) diam 0.47*mhsf at L.start + move to C + spline from rvec_(0,0.047*mhsf) \ + to rvec_(1.65*mhsf,0.11*mhsf) \ + then to rvec_(`$1',0.018*mhsf) \ + then to rvec_(`$1',-0.018*mhsf) \ + then to rvec_(1.65*mhsf,-0.11*mhsf) \ + then to rvec_(0,-0.047*mhsf) \ + shaded rgbstring(0,0,0) + ]') + +# `AntiqueHourHand(length,hr,min,sec)' +define(`AntiqueHourHand',`[ hhsf = (`$1')/2.2 + L: rpoint_(to (Rect_(`$1',hms2deg(`$2',`$3',`$4')))) + C: circle fill_(0) diam 0.6*hhsf at L.start + move to C + v = 0.25*hhsf + { line to rvec_(1.1*hhsf,0) thick 0.15/(1bp__)*hhsf } + { C1: circle rad v at rvec_(1.25*hhsf,0) fill_(0) } + d = `$1'-1.25*hhsf + q = 1bp__*hhsf + r1 = (d^2 + q^2 - v^2)/(v-q)/2 + h = r1+v + shade(0, + arc ccw from C1+vec_(d/h*v,(r1+q)/h*v) to \ + C1+vec_(d,q) rad r1 with .c at C1+vec_(d,r1+q) + arc ccw from C1+vec_(d,-q) to C1+vec_(d/h*v,-(r1+q)/h*v) rad r1 \ + with .c at C1+vec_(d,-r1-q)) + ]') + +define(`AntiqueClock',`[ # h,m,s,diam +# Clock size parameters + # outer radius + hour = ifelse(`$1',,3,`$1') + minute = ifelse(`$2',,41,`$2') + second = ifelse(`$3',,51,`$3') + ifelse(`$4',,`skale=0.5; r1=2',`r1=(`$4')/2; skale=r1/4') + r2 = r1-0.5*skale + r3 = r2-0.14*skale + r4 = r3 - 0.35*skale + r5 = r4 - 0.17*skale + r6 = r5 - 0.63*skale + r7 = r6 - 0.17*skale + shadethick = 1.0 + +C: circle thick 0.2 rad r1 + +define shadeline { + s = 1-($`'1)*2 + v = r*s + h = sqrt(r^2-v^2) + t = 1-abs(s) + line from (vrot_(-h,v,cost,sint)) to (vrot_(h,v,cost,sint)) \ + thick shadethick outlined rgbstring(t,t,t) + } + + r = r1 # Bezel outer + nlines = int(2*r/(shadethick pt__)*1.1) + cost = cosd(10); sint = sind(10); + ShadeObject(shadeline,nlines, 0, 0,0,0, + 0.5, 1,1,1, + 1, 0,0,0 ) at C + + r = r2 # Bezel inner + nlines = int(2*r/(shadethick pt__)*1.1) + cost = cosd(-10); sint = sind(-10); + ShadeObject(shadeline,nlines, 0, 0,0,0, + 0.25, 0.8,0.8,0.8, + 0.5, 1,1,1, + 0.75, 0.8,0.8,0.8, + 1, 0,0,0 ) at C + +# Clock face +Face: circle thick 0 fill_(1) rad r3 at C + circle rad r4 at C + circle rad r5 at C + circle rad r6 at C + circle rad r7 at C + +define rotext { +sprintf("`$'1 ifpstricks(\rput[C]{%g}(0,0){%g}, +ifpgf(\rotatebox{%g}{%g}))",`$'2,`$'3) } +# Outer numbers + command sprintf("\font\outerfont=cmss12 at %4.2fin",r3-r4) + for mn = -15 to 15 by 5 do { rotext(\outerfont,-mn/60*360,pmod(mn,60)) \ + at C+(Rect_((r3+r4)/2,90-mn/60*360)) } + for mn = 20 to 40 by 5 do { rotext(\outerfont,180-mn/60*360,mn) \ + at C+(Rect_((r3+r4)/2,90-mn/60*360)) } +# Outer tics + for mn = 1 to 60 do { t = 90-mn/60*360 + line from C+(Rect_(r5,t)) to C+(Rect_(r4,t)) } + +# Inner numbers + command sprintf("\font\innerfont=cmss12 at %4.2fin",r5-r6) + Loopover_(`mx',`t = (m4Lx-4)/12*360; + sprintf("\innerfont`'ifpstricks(`\rput[C]{%g}(0,0)', + `\rotatebox{%g}'){\scalebox{0.7}[1.0]{mx}}",-t) \ + at C+(Rect_((r5+r6)/2,90-t))', IX,X,XI,XII,I,II,III) + Loopover_(`mx',`t = (m4Lx+3)/12*360; + sprintf("\innerfont`'ifpstricks(`\rput[C]{%g}(0,0)', + `\rotatebox{%g}'){\scalebox{.7}[1.0]{mx}}",-t+180) \ + at C+(Rect_((r5+r6)/2,90-t))', IV,V,VI,VII,VIII) +# Inner tics + for mn = 5 to 60 by 5 do { t = 90-mn/60*360 + line from C+(Rect_(r7,t)) to C+(Rect_(r6,t)) } + +# Hands + AntiqueHourHand(r6,hour,minute,second) with .C at C + AntiqueMinuteHand(r5,hour,minute,second) with .C at C + SecondHand((r3+r4)/2,hour,minute,second) with .C at C + +# Center + dot(at C,0.1/4*r1,1) + ]') + + Clock1: AntiqueClock +# Clock2: AntiqueClock(4,50,07,2) at Clock1.e+(1.5,0) + Clock2: AntiqueClock(4,50,07,2) with .nw at Clock1.ne+(0.5,0) + Clock3: [ + linethick = 1.5 + arrowwid = 5 pt__ + + rgbfill(255/255,250/255,205/255, + Clock: circle rad 0.75 at (0,0) ) + + command "\newcounter{hour}" + for time=1 to 12 do { + sprintf("\setcounter{hour}{%g}\Roman{hour}",time) \ + at Rect_(Clock.rad*0.85,90-time*30) + } + line <-> from Rect_(Clock.rad*0.95,90-8.5*30) to Clock \ + then to Rect_(Clock.rad*0.7,90-3.5*30) + line thick 1 outline "red" from Clock to Rect_(Clock.rad*0.95,90-0.75*30) + ] with .s at (Clock2,Clock1.s) + +define(`htod',`(90-(`$1')/12*360)') + +# clock1(h:m[:s],diam,color) +define(`ClockA',`[ + clockdiam = ifelse(`$2',,`40 mm__',`$2') + clockrad = clockdiam/2 + stacksplit_(`HMS',ifelse(`$1',,10:10,`$1'),:) + s = HMS; popdef(`HMS') + m = HMS; popdef(`HMS') + ifdef(`HMS',`h = HMS',`h = m; m = s') + C: circle rad clockrad thick 2 shaded ifelse(`$3',,"cyan",`$3') at (0,0) + for t = 1 to 12 do { + if pmod(t,3)==0 then { ticlen = clockrad/5; ticthk = 2 } \ + else { ticlen = clockrad/10; ticthk = 1 } + line thick ticthk from Rect_(clockrad,htod(t)) \ + to Rect_(clockrad-ticlen,htod(t)) + sprintf("\large\sf %g",t) at Rect_(clockrad*3.5/5,htod(t)) + } + line thick 3 from C to Rect_(clockrad*2/5,htod(h+m/60)) + line thick 3 from C to Rect_(clockrad*3/5,htod(m/60*12)) + round(at C, 3) + ifdef(`HMS',`line thick 0.7 outlined "red" from C \ + to Rect_(clockrad*3.5/5,htod(s/60*12)) chop -5bp__ chop 0') + popdef(`HMS') ]') + +[ +CA: ClockA(11:10:35,,"blue!20") + ClockA(10:10,,"blue!20!black!30") + ClockA(10:10:23,,"blue!20!black!30!green!40") + ClockA(10:10,,rgbstring(0.2,0.2,0.7)) + +# calls DrawRoutineName(frac,r,g,b) +# clock2(h:m[:s],diam,color,rim thickness) +define(`ClockB',`[ + clockdiam = ifelse(`$2',,`60 mm__',`$2') + clockrad = clockdiam/2 + stacksplit_(`HMS',ifelse(`$1',,10:10,`$1'),:) + s = HMS; popdef(`HMS') + m = HMS; popdef(`HMS') + ifdef(`HMS',`h = HMS',`h = m; m = s') + rimwd = ifelse(`$4',,9 pt__,`$4') + rimwid = rimwd/(1 pt__) + n = 4 +C: (0,0) + ClockA(`$1',clockdiam-rimwd*2,"green!20") at C +Q:circle diam clockdiam-rimwd thick rimwid \ + outlined rgbstring(0.7,0.7,0.7) at C + Nx: Q.n+(0,Q.thick pt__/2) + +define rimcirc { +#print sprintf("%g: %g,%g,%g",$`'1,$`'2,$`'3,$`'4) + circle diam clockdiam-rimwd thick rimwid/(n+1) \ + outlined rgbstring($`'2,$`'3,$`'4) with .n at Nx-(0,rimwd/(n+1)/2) + Nx : last circle.n+(0,last circle.thick pt__/2) } + + v = 0.1 + ShadeObject(rimcirc, n, + 0,v,v,v, + 1/(n-1),v,v,v, + 1,1,1,1) at C + popdef(`HMS') ]') + +# ClockA(10:10:35,,"green!20") + w = last [].wid + ClockB(10:10:35,w,) with .nw at CA.sw+(10bp__,-0.2) + ] with .nw at 1st [].sw+(0,-0.2) + +.PE |