summaryrefslogtreecommitdiff
path: root/graphics/sketch/Data/cone.sk
blob: 4978008f3279393c9290f9cc07e066693c49dd8f (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
% truncated cone diagram
% Modified for PGF/TikZ
def O (0,0,0)
def I [1,0,0]
def J [0,1,0]
def K [0,0,1]

def p0 (1,2)
def p1 (1.5,0)
def N 8
def seg_rot rotate(360 / N, [J])
def dx
  <labeled> 2
  <> 2.3
def dy 
  <labeled> 2
  <> 3.3
def dz dx

def basic_cone {

  % draw the cone; this is the easy part!
  sweep[cull=false,fill=blue!20,fill opacity=0.8] { N, [[seg_rot]] } line(p0)(p1)

  % draw the axes
  def ax (dx,0,0)
  def ay (0,dy,0)
  def az (0,0,dz)
  line[arrows=<->,linewidth=.4pt](ax)(O)(ay)
  line[arrows=->,linewidth=.4pt](O)(az)
  % repeat dotted as an overlay to hint at the hidden lines
  %line[lay=over,linestyle=dotted,linewidth=.4pt](ax)(O)(ay)
 % line[lay=over,linestyle=dotted,linewidth=.4pt](O)(az)
  % label
  special|\path #1 node[below] {$x$}
     #2 node[above] {$y$}
     #3 node[left] {$z$};|
    (ax)(ay)(az)

  % height measurement mark takes too much code!
  def c0 (p0) then scale([J])
  def hdim_ref unit((p1) - (O)) then [[seg_rot]]^2
  def h00 (c0) + 1.1 * [hdim_ref]
  def h01 (c0) + 1.9 * [hdim_ref]
  def h02 (c0) + 1.8 * [hdim_ref]
  line(h00)(h01)
  def h10 (O) + 1.6 * [hdim_ref]
  def h11 (O) + 1.9 * [hdim_ref]
  def h12 (O) + 1.8 * [hdim_ref]
  line(h10)(h11)
  line[arrows=<->](h02)(h12)
  def hm2 ((h02)-(O)+(h12)-(O)) / 2 + (O)
  special|\node[ann] at #1 {$h$};|(hm2)

  % radius measurement marks
  def gap [0,.2,0]
  % first r1
  def up1 [0,3.1,0]
  def r1 ((p1) then [[seg_rot]]^-2) + [up1]
  def r1c (r1) then scale([J])
  def r1t (r1) + [gap]
  def r1b ((r1t) then scale([1,0,1])) + [gap]
  line[arrows=<->](r1c)(r1)
  line(r1b)(r1t)
  def r1m ((r1) - (O) + (r1c) - (O)) / 2 + (O)
  special |\node[ann] at #1 {$r_1$};|(r1m)
  % same drill for r0, but must project down first
  def up0 [0,2.7,0]
  def r0 ((p0) then scale([1,0,1]) then [[seg_rot]]^-2) + [up0]
  def r0c (r0) then scale([J])
  def r0t (r0) + [gap]
  def r0b ((p0) then [[seg_rot]]^-2) + [gap]
  line[arrows=<->](r0c)(r0)
  line(r0b)(r0t)
  def r0m ((r0) - (O) + (r0c) - (O)) / 2 + (O)
  special |\node[ann] at #1 {$r_0$};|(r0m)
}

def labeled_cone {
	
  % the "ghost" of the entire cone
  sweep[draw=lightgray,cull=false] { N-1, [[seg_rot]] } 
    line(p0)(p1)

  % for the highlighted face, we need explicit points
  def p00 (p0) then [[seg_rot]]^-1
  def p10 (p1) then [[seg_rot]]^-1
  def p01 (p0)
  def p11 (p1)
  %polygon[showpoints=true](p00)(p10)(p11)(p01)
  polygon[fillcolor=red,dotsep=semitransparent](p00)(p10)(p11)(p01)
  % TikZ does not have a showpoints option. Use dots.
  dots(p00)(p10)(p11)(p01)
  % TikZ special for labels.
  special|\fill[black,font=\footnotesize]
                #1 node [above] {$P_{00}$}
                #2 node [below] {$P_{10}$}
                #3 node [above] {$P_{01}$}
                #4 node [below] {$P_{11}$};|
    (p00)(p10)(p01)(p11)
  def mid ((p00)-(O)+(p10)-(O)+(p11)-(O)+(p01)-(O))/4+(O)
  % The TikZ arc operation starts at the current point. We therefore
  % need to shift it to get mid to be the center of the arc
  special|\draw #1+(-60:.25) [yscale=1.3,->] arc(-60:240:.25);|
    [lay=over](mid)
  def mid_left ((p00)-(O)+(p10)-(O))/2+(O)
  def mid_right ((p11)-(O)+(p01)-(O))/2+(O)
  special|\path[font=\footnotesize] 
          #1 node[left] {$j$}
          #2 node[right] {$j\hbox{$+$}1$};|
    (mid_left)(mid_right)
  def top_lbl (p01) then [[seg_rot]]^2
  def bot_lbl (p11) then [[seg_rot]]^2
  special|\path[font=\footnotesize]
          #1 node[right] {$i\hbox{$=$}0$}
          #2 node[right] {$i\hbox{$=$}1$};|
    (top_lbl)(bot_lbl)
}




def cone 
  <labeled> {labeled_cone}
  <>        {basic_cone}

put { view((10,4,2)) } {cone}

% Cool trick: lay = under forces this to be output first in the tikz picture block.
special |\tikzstyle{ann} = [fill=white,font=\footnotesize,inner sep=1pt]|[lay=under]

global {
  language tikz
}