PS
# Dini.m4
# This diagram can be produced using, e.g.
# m4 pdf.m4 Dini.m4 | dpic -d > Dini.pdf
#
https://tex.stackexchange.com/questions/516734/plot-dinis-surface
threeD_init
NeedDpicTools
scale = 2.0
[
viewazimuth = 0 # View angles in degrees
viewelevation = 20
setview(viewazimuth,viewelevation,0)
a = 1.5
b = 0.25
define(`Dini',
`a*cos(`$1')*sin(`$2'),dnl
a*sin(`$1')*sin(`$2'),dnl
(a*(cos(`$2')+loge(tan((`$2')/2))) + b*(`$1'))')
umin = 0; umax = 4*pi_
vmin = 0.2; vmax = 2.0
ugrid = 80; vgrid = 20
ur = umax-umin
vr = vmax-vmin
`define cu {umin+($1)/ugrid*ur}'
`define cv {vmin+($1)/vgrid*vr}'
# Generate points and sort
n = -1
for iu=0 to ugrid do {
for iv=0 to vgrid do {
n +=1
ciu[n] = cu(iu)
civ[n] = cv(iv)
d[n] = dot3D(View3D,Dini(ciu[n],civ[n]))
ix[n] = n
}
}
dpquicksort(d,0,n,ix)
# Draw the facets
linethick = 0.4
du = ur/ugrid/2
dv = vr/vgrid/2
for i=0 to n do {
NE: Project(Dini(ciu[ix[i]]+du,civ[ix[i]]+dv))
SE: Project(Dini(ciu[ix[i]]+du,civ[ix[i]]-dv))
SW: Project(Dini(ciu[ix[i]]-du,civ[ix[i]]-dv))
NW: Project(Dini(ciu[ix[i]]-du,civ[ix[i]]+dv))
f = (-cos(ciu[ix[i]])+1)/2
g = ( sin(ciu[ix[i]])+1)/2
line from NE to SE then to SW then to NW then to NE \
outlined rgbstring(f,g,0) shaded rgbstring(f,g,0)
# outlined rgbstring(0,0.5,0) shaded rgbstring(f,g,0)
}
]
# Icosahedron.m4
[
#threeD_init
#NeedDpicTools
# Computing facets is complicated, so list them.
# 60 vertices:
define(`m4x',-1)
array2(v,m4inx,0, 0, 1.021)
array2(v,m4inx,0.4035482, 0, 0.9378643)
array2(v,m4inx,-0.2274644, 0.3333333, 0.9378643)
array2(v,m4inx,-0.1471226, -0.375774, 0.9378643)
array2(v,m4inx,0.579632, 0.3333333, 0.7715933)
array2(v,m4inx,0.5058321, -0.375774, 0.8033483)
array2(v,m4inx,-0.6020514, 0.2908927, 0.7715933)
array2(v,m4inx,-0.05138057, 0.6666667, 0.7715933)
array2(v,m4inx,0.1654988, -0.6080151, 0.8033483)
array2(v,m4inx,-0.5217096, -0.4182147, 0.7715933)
array2(v,m4inx,0.8579998, 0.2908927, 0.4708062)
array2(v,m4inx,0.3521676, 0.6666667, 0.6884578)
array2(v,m4inx,0.7841999, -0.4182147, 0.5025612)
array2(v,m4inx,-0.657475, 0.5979962, 0.5025612)
array2(v,m4inx,-0.749174, -0.08488134, 0.6884578)
array2(v,m4inx,-0.3171418, 0.8302373, 0.5025612)
array2(v,m4inx,0.1035333, -0.8826969, 0.5025612)
array2(v,m4inx,-0.5836751, -0.6928964, 0.4708062)
array2(v,m4inx,0.8025761, 0.5979962, 0.2017741)
array2(v,m4inx,0.9602837, -0.08488134, 0.3362902)
array2(v,m4inx,0.4899547, 0.8302373, 0.3362902)
array2(v,m4inx,0.7222343, -0.6928964, 0.2017741)
array2(v,m4inx,-0.8600213, 0.5293258, 0.1503935)
array2(v,m4inx,-0.9517203, -0.1535518, 0.3362902)
array2(v,m4inx,-0.1793548, 0.993808, 0.1503935)
array2(v,m4inx,0.381901, -0.9251375, 0.2017741)
array2(v,m4inx,-0.2710537, -0.9251375, 0.3362902)
array2(v,m4inx,-0.8494363, -0.5293258, 0.2017741)
array2(v,m4inx,0.8494363, 0.5293258, -0.2017741)
array2(v,m4inx,1.007144, -0.1535518, -0.06725804)
array2(v,m4inx,0.2241935, 0.993808, 0.06725804)
array2(v,m4inx,0.8600213, -0.5293258, -0.1503935)
array2(v,m4inx,-0.7222343, 0.6928964, -0.2017741)
array2(v,m4inx,-1.007144, 0.1535518, 0.06725804)
array2(v,m4inx,-0.381901, 0.9251375, -0.2017741)
array2(v,m4inx,0.1793548, -0.993808, -0.1503935)
array2(v,m4inx,-0.2241935, -0.993808, -0.06725804)
array2(v,m4inx,-0.8025761, -0.5979962, -0.2017741)
array2(v,m4inx,0.5836751, 0.6928964, -0.4708062)
array2(v,m4inx,0.9517203, 0.1535518, -0.3362902)
array2(v,m4inx,0.2710537, 0.9251375, -0.3362902)
array2(v,m4inx,0.657475, -0.5979962, -0.5025612)
array2(v,m4inx,-0.7841999, 0.4182147, -0.5025612)
array2(v,m4inx,-0.9602837, 0.08488134, -0.3362902)
array2(v,m4inx,-0.1035333, 0.8826969, -0.5025612)
array2(v,m4inx,0.3171418, -0.8302373, -0.5025612)
array2(v,m4inx,-0.4899547, -0.8302373, -0.3362902)
array2(v,m4inx,-0.8579998, -0.2908927, -0.4708062)
array2(v,m4inx,0.5217096, 0.4182147, -0.7715933)
array2(v,m4inx,0.749174, 0.08488134, -0.6884578)
array2(v,m4inx,0.6020514, -0.2908927, -0.7715933)
array2(v,m4inx,-0.5058321, 0.375774, -0.8033483)
array2(v,m4inx,-0.1654988, 0.6080151, -0.8033483)
array2(v,m4inx,0.05138057, -0.6666667, -0.7715933)
array2(v,m4inx,-0.3521676, -0.6666667, -0.6884578)
array2(v,m4inx,-0.579632, -0.3333333, -0.7715933)
array2(v,m4inx,0.1471226, 0.375774, -0.9378643)
array2(v,m4inx,0.2274644, -0.3333333, -0.9378643)
array2(v,m4inx,-0.4035482, 0, -0.9378643)
array2(v,m4inx,0, 0, -1.021)
# 12 pentagons
undefine(`m4x')
array2(p,m4inx,0,3,8,5,1)
array2(p,m4inx,2,7,15,13,6)
array2(p,m4inx,4,10,18,20,11)
array2(p,m4inx,9,14,23,27,17)
array2(p,m4inx,12,21,31,29,19)
array2(p,m4inx,16,26,36,35,25)
array2(p,m4inx,22,32,42,43,33)
array2(p,m4inx,24,30,40,44,34)
array2(p,m4inx,28,39,49,48,38)
array2(p,m4inx,37,47,55,54,46)
array2(p,m4inx,41,45,53,57,50)
array2(p,m4inx,51,52,56,59,58)
# 20 hexagons
undefine(`m4x')
array2(h,m4inx,0,1,4,11,7,2)
array2(h,m4inx,0,2,6,14,9,3)
array2(h,m4inx,1,5,12,19,10,4)
array2(h,m4inx,3,9,17,26,16,8)
array2(h,m4inx,5,8,16,25,21,12)
array2(h,m4inx,6,13,22,33,23,14)
array2(h,m4inx,7,11,20,30,24,15)
array2(h,m4inx,10,19,29,39,28,18)
array2(h,m4inx,13,15,24,34,32,22)
array2(h,m4inx,17,27,37,46,36,26)
array2(h,m4inx,18,28,38,40,30,20)
array2(h,m4inx,21,25,35,45,41,31)
array2(h,m4inx,23,33,43,47,37,27)
array2(h,m4inx,29,31,41,50,49,39)
array2(h,m4inx,32,34,44,52,51,42)
array2(h,m4inx,35,36,46,54,53,45)
array2(h,m4inx,38,48,56,52,44,40)
array2(h,m4inx,42,51,58,55,47,43)
array2(h,m4inx,48,49,50,57,59,56)
array2(h,m4inx,53,54,55,58,59,57)
viewazimuth = -10 # View angles in degrees
viewelevation = 40
setview(viewazimuth,viewelevation,0)
n = 0 # Find and draw the visible hexagons
for i=1 to 20 do { # The normal is the line to the center
for_(1,3,1,`a[m4x] = (v[h[i,1],m4x] + v[h[i,4],m4x])/2')
if dot3D(View3D,a[1],a[2],a[3]) >= 0 then { n +=1; ih[n] = i }
}
for i=1 to n do {
for j=1 to 6 do { x[j]=h[ih[i],j] }
line from Project((v[x[1],1]),(v[x[1],2]),(v[x[1],3]))\
for_(2,6,1,`to Project((v[x[m4x],1]),(v[x[m4x],2]),(v[x[m4x],3]))\')\
to Project((v[x[1],1]),(v[x[1],2]),(v[x[1],3])) thick 0.2 fill_(0.95)
}
m = 0
for i=1 to 12 do { # Visible pentagons
for_(1,3,1,`a[m4x] = 0; for j=1 to 5 do { a[m4x] += v[p[i,j],m4x] }')
if dot3D(View3D,a[1]/5,a[2]/5,a[3]/5) >= 0 then { m +=1; ip[m] = i }
}
for i=1 to m do {
for j=1 to 5 do { x[j]=p[ip[i],j] }
line from Project((v[x[1],1]),(v[x[1],2]),(v[x[1],3])) \
for_(2,5,1,`to Project((v[x[m4x],1]),(v[x[m4x],2]),(v[x[m4x],3]))\')\
to Project((v[x[1],1]),(v[x[1],2]),(v[x[1],3])) thick 0.2 fill_(0)
}
] scaled 2.5 with .sw at last [].se+(0.5,0)
[
#.PE
#.PS
## BlueBall.m4
##
https://latex.org/forum/viewtopic.php?f=5&t=30639
#threeD_init
#NeedDpicTools
ballrad = 2.5
cylrad = ballrad*0.87
hht =sqrt(ballrad^2-cylrad^2)
azimuth = 0
elevation = atan2(hht,cylrad)
setview(azimuth,elevation*rtod_)
sinelev = sin(elevation)
linethick_(1)
C: shadedball(ballrad,,,,(0,1,1)) at (0,0)
Op: C+Project(0,0,hht)
O: C+Project(0,0,-hht)
line dashed from Op+( cylrad,0) down Op.y-O.y
line dashed from Op+(-cylrad,0) down Op.y-O.y
define(`Normal',`cosd(`$1')*cylrad,sind(`$1')*cylrad,-hht')
define Cylvis { $`'2 = dot3D(Normal($`'1),View3D) }
findroot(Cylvis,5,170,1e-8,rA)
A: Project(Normal(rA))
B: O+(-(A.x-O.x),A.y-O.y)
aA = atan2(A.y-O.y,(A.x-O.x)*sinelev)
ellipsearc(cylrad*2,cylrad*2*sinelev,aA,-pi_-aA,0,cw) with .C at O
ellipsearc(cylrad*2,cylrad*2*sinelev,-pi_-aA-4*dtor_,aA+4*dtor_,,cw,dashed) \
with .C at O
ellipsearc(cylrad*2,cylrad*2*sinelev,-aA,pi_+aA,0,cw) with .C at Op
ellipsearc(cylrad*2,cylrad*2*sinelev,pi_+aA+4*dtor_,-aA-4*dtor_,,cw,dashed) \
with .C at Op
dot(at C); # "$T$" at last [].w rjust below
dot(at O); # "$O$" at last [].s below
dot(at A); # "$A$" at last [].s ljust below
dot(at B); # "$B$" at last [].s rjust below
dot(at Op); # "$O'$" at last [].n above
Ap: dot(at Op+(A-O)); # "$A'$" at Ap.n ljust above
Bp: dot(at Op+(B-O)); # "$B'$" at Bp.n rjust above
linethick_(0.4)
line dashed from Ap to A then to O then to Op
line dashed from A to C
line dashed from Bp to B
V: Between_(O,A,0.15)
U: C+Project(0,0,-hht+0.15)
line from U to U+(V-O) then to V
] with .w at last [].e+(0.5,0)
PE