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
|
% Ball.m4 stand-alone (PDF)LaTeX example
%
% Usage: type
% m4 pgf.m4 Ball.m4 | dpic -g > Ball.tex; pdflatex Ball
% or:
% m4 pstricks.m4 Ball.m4 | dpic -p > Ball.tex; latex Ball; dvips Ball
%
\documentclass{article}
ifpgf(`\usepackage{tikz}',`\usepackage{pstricks,pst-grad}')
\pagestyle{empty}
\begin{document}
%
.PS
threeD_init
command "\small{"
viewazimuth = 15 # Set view angles in degrees
viewelevation = 35
setview(viewazimuth,viewelevation)
#def_bisect # Bring in the equation solver
NeedDpicTools
rectwid = 3.2 # basic dimensions
rectht = 2
alpha = rectht/3
# Rectangle
ifpstricks(
`command "\pscustom[fillstyle=gradient,gradmidpoint=1.0,%"
command sprintf("gradbegin=gray,gradend=white,gradlines=%g]{",rectwid*200)')
line from Project(-rectht/2,-rectwid*1/3,0) \
to Project( rectht/2,-rectwid*1/3,0) \
then to Project( rectht/2, rectwid*2/3,0) \
then to Project(-rectht/2, rectwid*2/3,0) \
then to Project(-rectht/2,-rectwid*1/3,0)
ifpstricks(command "}%")
define(`C3D',`0,0,alpha') # Centre of the sphere
C: Project(C3D)
# Shaded sphere
ifelse(m4postprocessor,pstricks,
`Highlight: Project(sum3D(C3D,rot3Dz(-15*dtor_,rot3Dy(-60*dtor_,alpha,0,0))))
command "\pscustom[fillstyle=gradient,gradmidpoint=0.0,%"
command sprintf("gradbegin=gray,gradend=white,gradlines=%g,%%",alpha*200)
command "GradientCircle=true,GradientScale=1.5,%"
command sprintf("GradientPos={(%g,%g)}]{",Highlight.x,Highlight.y)
circle rad alpha at C
command "}%"',
m4postprocessor,pgf,
`command sprintf(\# A little too dark, maybe
"\dpicdraw[ball color=white](%g,%g) circle (%gin)\dpicstop",\
C.x,C.y,alpha/2.54)',
`circle rad alpha at C fill_(1) ')
S: "$S$" at Project(0,0,0) rjust # The sphere bottom touch point
"$\alpha$" at 0.5<S,C> rjust
define(`N3D',`0,0,2*alpha') # North pole
N: "N" at Project(N3D) ljust above
phi = 65*dtor_
define(`Phat3D',`rot3Dz(phi,alpha*2.7,0,0)')
Phat: "$\hat{P}$" at Project(Phat3D) ljust
X: Project(rectht/2*0.8,0,0)
Y: Project(0,rectwid/2*0.8,0)
`define' linevis { # ratio # Visibility function for lines fom S to Xb
$2 = distance(($1 between S and Xb),C)-alpha }
`define' invisline { # name # Draw dashed invisible part of line in
Xb: $1 # the plane
bisect( linevis, 0, 1, 1e-8, x )
line dashed from S to x between S and Xb chop 0 chop 0.05 }
thinlines_ # axes
invisline(X)
arrow to X chop 0.05 chop 0; "$x,\:\xi$" at Here+(0,3pt__) below
invisline(Y)
arrow to Y chop 0.05 chop 0; "$y,\:\eta$" ljust
line dashed from S to N chop 0 chop 0.05
arrow up alpha*0.5 chop 0.05 chop 0 ; "$z,\:\zeta$" above ljust
invisline(Phat)
line to Phat chop 0.05 chop 0
arc ccw -> rad alpha from Project(alpha/2,0,0) to \
Project(rot3Dz(phi,alpha/2,0,0))
"$\phi$" below at 0.5 between last arc.start and last arc.end
# vector (ratio along (N to Phat))
define(`ray',`sum3D(N3D,sprod3D($1,diff3D(Phat3D,N3D)))')
`define' rayvis { # ratio
$2 = length3D(diff3D(ray($1),C3D))-alpha }
bisect( rayvis, 1e-3, 1, 1e-8, p ) # Find P
P: "$P$" at Project(ray(p)) ljust above
thicklines_
line dashed from N to P chop 0 chop 0.05
line to Phat chop 0.05 chop 0
define(`meridian',`rot3Dz(phi,rot3Dy(-($1),alpha,0,0))')
`define' meridianvis { # angle # Visibility function on the meridian
$2 = dot3D(meridian($1),View3D) }
thinlines_ # Draw the meridian
bisect( meridianvis, 0, pi_, 1e-8, y )
n = 0
for ang = y-pi_ to y by pi_/20 do {
Q[n]: Project(sum3D(C3D,meridian(ang))); n+=1 }
fitcurve(Q,n-1)
n = 0
for ang = y to y+pi_ by pi_/20 do {
Q[n]: Project(sum3D(C3D,meridian(ang))); n+=1 }
fitcurve(Q,n-1,dashed)
define(`equator',`rot3Dz($1,alpha,0,0)')
`define' equatorvis { # angle # Visibility function on the equator
$2 = dot3D(View3D,equator($1)) }
bisect( equatorvis, 0, pi_, 1e-8, y )
n = 0
for ang = y-pi_ to y by pi_/20 do {
Q[n]: Project(sum3D(C3D,equator(ang))); n+=1 }
fitcurve(Q,n-1)
n = 0
for ang = y to y+pi_ by pi_/20 do {
Q[n]: Project(sum3D(C3D,equator(ang))); n+=1 }
fitcurve(Q,n-1,dashed)
line dashed from C to P # beta
line dashed from C to Project(sum3D(C3D,equator(phi)))
arc ccw -> from 0.6 along_(last line) to 0.6 between C and P
"$\beta$" above
command "}"
.PE
%
\end{document}
|