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}
|