diagrams.tex 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. % Define node group background
  2. % The first 4 arguments are nodes that define the group borders in (left,
  3. % top, right, bottom) order, the last argument is a text label
  4. \usetikzlibrary{shapes,arrows}
  5. \pgfdeclarelayer{background}
  6. \pgfdeclarelayer{foreground}
  7. \pgfsetlayers{background,main,foreground} % Layer order
  8. \newcommand{\grouppadding}{0.5}
  9. \newcommand{\group}[5]{
  10. \begin{pgfonlayer}{background}
  11. % Left top corner
  12. \path (#1.west |- #2.north)+(-0.7, 0.7)
  13. node (lefttop) {};
  14. % Right bottom corner
  15. \path (#3.east |- #4.south)+(0.7, -0.4)
  16. node (rightbottom) {};
  17. % Draw rectangle
  18. \path[draw, rounded corners, dashed] (lefttop) rectangle (rightbottom);
  19. % Text label
  20. \path (rightbottom.west |- lefttop.south)+(-1.2, -0.3) node {\emph{#5}};
  21. \end{pgfonlayer}
  22. }
  23. \tikzstyle{block} = [
  24. rectangle,
  25. draw=black,
  26. fill=white,
  27. thick,
  28. minimum height=2em,
  29. text centered,
  30. rounded corners,
  31. text width=6em
  32. ]
  33. \tikzstyle{lineto} = [
  34. ->,
  35. thick,
  36. shorten <= 2pt,
  37. shorten >= 2pt
  38. ]
  39. \tikzstyle{linefrom} = [
  40. <-,
  41. thick,
  42. shorten <= 2pt,
  43. shorten >= 2pt
  44. ]
  45. \newcommand{\architecture}[1]{
  46. \begin{tikzpicture}[node distance=6em, auto]
  47. \node[block] (driver) {Driver};
  48. #1
  49. \end{tikzpicture}
  50. }
  51. \newcommand{\basicdiagram}[1]{
  52. \begin{figure}[h]
  53. \center
  54. \architecture{
  55. \node[block, dashed, below of=driver] (arch) {Architecture}
  56. edge[linefrom] node[right] {driver-specific messages} (driver);
  57. \node[block, below of=arch] {Application}
  58. edge[linefrom] node[right] {gestures} (arch);
  59. }
  60. \caption{#1}
  61. \label{fig:basicdiagram}
  62. \end{figure}
  63. }
  64. \newcommand{\driverdiagram}[1]{
  65. \begin{figure}[h]
  66. \center
  67. \architecture{
  68. \node[block, below of=driver] (eventdriver) {Event driver}
  69. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  70. \node[block, below of=eventdriver, dashed] (analysis) {Event analysis}
  71. edge[linefrom] node[right] {events} (eventdriver);
  72. \node[block, below of=analysis] {Application}
  73. edge[linefrom] node[right, near start] {gestures} (analysis);
  74. \node[right of=eventdriver, xshift=2em] (dummy) {};
  75. \group{eventdriver}{eventdriver}{dummy}{analysis}{Architecture}
  76. }
  77. \caption{#1}
  78. \label{fig:driverdiagram}
  79. \end{figure}
  80. }
  81. \newcommand{\areadiagram}[1]{
  82. \begin{figure}[h]
  83. \center
  84. \architecture{
  85. \node[block, below of=driver] (eventdriver) {Event driver}
  86. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  87. \node[block, below of=eventdriver] (area) {Areas}
  88. edge[linefrom] node[right] {events} (eventdriver);
  89. \node[block, right of=area, xshift=7em, dashed] (analysis) {Gesture detection}
  90. edge[linefrom, bend right=10] node[above] {events} (area)
  91. edge[lineto, bend left=10] node[] {gestures} (area);
  92. \node[block, below of=area] {Application}
  93. edge[linefrom] node[right, near start] {gestures} (area);
  94. \group{eventdriver}{eventdriver}{analysis}{area}{Architecture}
  95. }
  96. \caption{#1}
  97. \label{fig:areadiagram}
  98. \end{figure}
  99. }
  100. \newcommand{\trackerdiagram}[1]{
  101. \begin{figure}[h]
  102. \center
  103. \architecture{
  104. \node[block, below of=driver] (eventdriver) {Event driver}
  105. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  106. \node[block, below of=eventdriver] (area) {Area tree}
  107. edge[linefrom] node[right] {events} (eventdriver);
  108. \node[block, right of=area, xshift=7em] (tracker) {Gesture trackers}
  109. edge[linefrom, bend right=10] node[above] {events} (area)
  110. edge[lineto, bend left=10] node[] {gestures} (area);
  111. \node[block, below of=area] {Application}
  112. edge[linefrom] node[right, near start] {gestures} (area);
  113. \group{eventdriver}{eventdriver}{tracker}{area}{Architecture}
  114. }
  115. \caption{#1}
  116. \label{fig:trackerdiagram}
  117. \end{figure}
  118. }
  119. \newcommand{\examplediagram}[1]{
  120. \begin{figure}[h]
  121. \center
  122. \architecture{
  123. \node[block, below of=driver] (eventdriver) {Event driver}
  124. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  125. \node[block, below of=eventdriver] (rootarea) {Root area}
  126. edge[linefrom] (eventdriver);
  127. \node[block, below of=rootarea] (subarea) {Button area}
  128. edge[linefrom] (rootarea)
  129. edge[lineto, bend right=45] node[right=3] {event propagation} (rootarea);
  130. \node[block, right of=rootarea, xshift=5em] {\emph{pinch} tracker}
  131. edge[lineto, dotted, bend left=10] (rootarea)
  132. edge[linefrom, bend right=10] (rootarea);
  133. \node[block, right of=subarea, xshift=5em] (tracker) {\emph{tap} tracker}
  134. edge[lineto, dotted, bend left=10] (subarea)
  135. edge[linefrom, bend right=10] (subarea);
  136. \node[block, below of=subarea, yshift=-.5em] {Application}
  137. edge[linefrom, dotted, bend left=60] (rootarea)
  138. edge[linefrom, dotted] (subarea);
  139. \group{subarea}{eventdriver}{tracker}{subarea}{Architecture}
  140. }
  141. \caption{#1}
  142. \end{figure}
  143. }
  144. \newcommand{\examplefigureone}{
  145. \begin{figure}[h]
  146. \center
  147. % TODO: draw finger touch points as circles with rotating arrow
  148. \begin{tikzpicture}
  149. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  150. \draw node[fill=gray!50, draw=black!70, minimum height=40, minimum width=40] at (-1,-1) {};
  151. \draw node[draw=black!80, diamond, minimum height=50, minimum width=50] at (1.2,1) {};
  152. \end{tikzpicture}
  153. \caption{Two squares on the screen both listen to rotation. The user
  154. should be able to ``grab'' each of the squares independently and rotate
  155. them at the same time.}
  156. \label{fig:ex1}
  157. \end{figure}
  158. }
  159. \newcommand{\examplefiguretwo}{
  160. \begin{figure}[h]
  161. \center
  162. \begin{tikzpicture}
  163. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  164. \draw node[draw=black!80, diamond, minimum height=50, minimum width=50] at (0.5, 0.3) {};
  165. \draw node[draw=black, diamond, dotted, minimum height=53, minimum width=53] at (0.5, 0.3) {};
  166. \draw node[draw=black, dotted, circle, minimum height=80, minimum width=80] at (0.5, 0.3) {};
  167. \fill (-0.3, -0.4) circle (0.15)
  168. (-0.4, 0.8) circle (0.15)
  169. (-0.1, 1.1) circle (0.15)
  170. (1.3, 0.9) circle (0.15);
  171. \draw (0.15, 0.55) circle (0.15) -- (-0.3, -0.4);
  172. \draw (0.15, 0.55) -- (-0.4, 0.8);
  173. \draw (0.15, 0.55) -- (-0.1, 1.1);
  174. \draw (0.15, 0.55) -- (1.3, 0.9);
  175. \end{tikzpicture}
  176. \caption{A square on the screen listens to rotation. The user can grab
  177. and rotate the square by positioning fingers around (but not in) it and
  178. and performing a rotating motion. An example pose of four fingers is
  179. shown by the filled black circles. While the events all occur in the
  180. dotted \emph{area}, the centroid of the rotation gesture is located in
  181. the square.}
  182. \label{fig:ex2}
  183. \end{figure}
  184. }
  185. \newcommand{\examplefigurethree}{
  186. \begin{figure}[h]
  187. \center
  188. \begin{tikzpicture}
  189. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  190. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  191. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  192. \end{tikzpicture}
  193. \caption{Two overlapping squares that listen to rotation. When the
  194. white square is rotated, the gray square should keep its current
  195. orientation and vice-versa.}
  196. \label{fig:ex3}
  197. \end{figure}
  198. }