diagrams.tex 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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}{
  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{Extension of the diagram from figure \ref{fig:basicdiagram},
  78. showing the position of the event driver in the architecture. The
  79. event driver translates driver-specific to a common set of events,
  80. which are delegated to analysis components that will interpret them
  81. as more complex gestures.}
  82. \label{fig:driverdiagram}
  83. \end{figure}
  84. }
  85. \newcommand{\multipledriversdiagram}{
  86. \begin{figure}[H]
  87. \center
  88. \begin{tikzpicture}[node distance=6em]
  89. \node[block] (driver) {Driver};
  90. \node[block, below of=driver] (eventdriver) {Event driver}
  91. edge[linefrom] (driver);
  92. \node[block, right of=driver, xshift=2em] (seconddriver) {Driver};
  93. \node[block, below of=seconddriver] (secondeventdriver) {Event driver}
  94. edge[linefrom] node[right, near end] {driver-specific messages} (seconddriver);
  95. \node[block, below of=eventdriver, dashed] (analysis) {Event analysis}
  96. edge[linefrom] (eventdriver)
  97. edge[linefrom] node[right=5] {events} (secondeventdriver);
  98. \node[block, below of=analysis] {Application}
  99. edge[linefrom] node[right, near start] {gestures} (analysis);
  100. \node[right of=seconddriver, xshift=2em] (dummy) {};
  101. \group{eventdriver}{eventdriver}{dummy}{analysis}{Architecture}
  102. \end{tikzpicture}
  103. \caption{Multiple event drivers running simultaneously.}
  104. \label{fig:multipledrivers}
  105. \end{figure}
  106. }
  107. \newcommand{\areadiagram}[1]{
  108. \begin{figure}[h]
  109. \center
  110. \architecture{
  111. \node[block, below of=driver] (eventdriver) {Event driver}
  112. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  113. \node[block, below of=eventdriver] (area) {Areas}
  114. edge[linefrom] node[right] {events} (eventdriver);
  115. \node[block, right of=area, xshift=7em, dashed] (analysis) {Gesture detection}
  116. edge[linefrom, bend right=10] node[above] {events} (area)
  117. edge[lineto, bend left=10] node[] {gestures} (area);
  118. \node[block, below of=area] {Application}
  119. edge[linefrom] node[right, near start] {gestures} (area);
  120. \group{eventdriver}{eventdriver}{analysis}{area}{Architecture}
  121. }
  122. \caption{#1}
  123. \label{fig:areadiagram}
  124. \end{figure}
  125. }
  126. \newcommand{\trackerdiagram}[1]{
  127. \begin{figure}[h]
  128. \center
  129. \architecture{
  130. \node[block, below of=driver] (eventdriver) {Event driver}
  131. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  132. \node[block, below of=eventdriver] (area) {Area tree}
  133. edge[linefrom] node[right] {events} (eventdriver);
  134. \node[block, right of=area, xshift=7em] (tracker) {Gesture trackers}
  135. edge[linefrom, bend right=10] node[above] {events} (area)
  136. edge[lineto, bend left=10] node[] {gestures} (area);
  137. \node[block, below of=area] {Application}
  138. edge[linefrom] node[right, near start] {gestures} (area);
  139. \group{eventdriver}{eventdriver}{tracker}{area}{Architecture}
  140. }
  141. \caption{#1}
  142. \label{fig:trackerdiagram}
  143. \end{figure}
  144. }
  145. \newcommand{\examplediagram}[1]{
  146. \begin{figure}[h]
  147. \center
  148. \architecture{
  149. \node[block, below of=driver] (eventdriver) {Event driver}
  150. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  151. \node[block, below of=eventdriver] (rootarea) {Root area}
  152. edge[linefrom] (eventdriver);
  153. \node[block, below of=rootarea] (subarea) {Button area}
  154. edge[linefrom] (rootarea)
  155. edge[lineto, bend right=45] node[right=3] {event propagation} (rootarea);
  156. \node[block, right of=rootarea, xshift=5em] {\emph{pinch} tracker}
  157. edge[lineto, dotted, bend left=10] (rootarea)
  158. edge[linefrom, bend right=10] (rootarea);
  159. \node[block, right of=subarea, xshift=5em] (tracker) {\emph{tap} tracker}
  160. edge[lineto, dotted, bend left=10] (subarea)
  161. edge[linefrom, bend right=10] (subarea);
  162. \node[block, below of=subarea, yshift=-.5em] {Application}
  163. edge[linefrom, dotted, bend left=60] (rootarea)
  164. edge[linefrom, dotted] (subarea);
  165. \group{subarea}{eventdriver}{tracker}{subarea}{Architecture}
  166. }
  167. \caption{#1}
  168. \end{figure}
  169. }
  170. \newcommand{\examplefigureone}{
  171. \begin{figure}[h]
  172. \center
  173. % TODO: draw finger touch points as circles with rotating arrow
  174. \begin{tikzpicture}
  175. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  176. \draw node[fill=gray!50, draw=black!70, minimum height=40, minimum width=40] at (-1,-1) {};
  177. \draw node[draw=black!80, diamond, minimum height=50, minimum width=50] at (1.2,1) {};
  178. \end{tikzpicture}
  179. \caption{Two squares on the screen both listen to rotation. The user
  180. should be able to ``grab'' each of the squares independently and rotate
  181. them at the same time.}
  182. \label{fig:ex1}
  183. \end{figure}
  184. }
  185. \newcommand{\examplefiguretwo}{
  186. \begin{figure}[h]
  187. \center
  188. \begin{tikzpicture}
  189. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  190. \draw node[draw=black!80, diamond, minimum height=50, minimum width=50] at (0.5, 0.3) {};
  191. \draw node[draw=black, diamond, dotted, minimum height=53, minimum width=53] at (0.5, 0.3) {};
  192. \draw node[draw=black, dotted, circle, minimum height=80, minimum width=80] at (0.5, 0.3) {};
  193. \fill (-0.3, -0.4) circle (0.15)
  194. (-0.4, 0.8) circle (0.15)
  195. (-0.1, 1.1) circle (0.15)
  196. (1.3, 0.9) circle (0.15);
  197. \draw (0.15, 0.55) circle (0.15) -- (-0.3, -0.4);
  198. \draw (0.15, 0.55) -- (-0.4, 0.8);
  199. \draw (0.15, 0.55) -- (-0.1, 1.1);
  200. \draw (0.15, 0.55) -- (1.3, 0.9);
  201. \end{tikzpicture}
  202. \caption{A square on the screen listens to rotation. The user can grab
  203. and rotate the square by positioning fingers around (but not in) it and
  204. and performing a rotating motion. An example pose of four fingers is
  205. shown by the filled black circles. While the events all occur in the
  206. dotted \emph{area}, the centroid of the rotation gesture is located in
  207. the square.}
  208. \label{fig:ex2}
  209. \end{figure}
  210. }
  211. \newcommand{\examplefigurethree}{
  212. \begin{figure}[h]
  213. \center
  214. \begin{tikzpicture}
  215. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  216. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  217. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  218. \end{tikzpicture}
  219. \caption{Two overlapping squares that listen to rotation. When the
  220. white square is rotated, the gray square should keep its current
  221. orientation and vice-versa.}
  222. \label{fig:ex3}
  223. \end{figure}
  224. }
  225. \newcommand{\eventpropagationfigure}{
  226. \begin{figure}[h!]
  227. \center
  228. \subfigure[An event is triggered in the white area. The event is first
  229. delegated to the white area from te gray area (2). After gesture
  230. detection, it is propagated back to the gray area (6) \emph{unless}
  231. propagation has been stopped in the gesture tracker between (3) and (4).]{
  232. \begin{tikzpicture}[node distance=5.5em]
  233. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  234. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  235. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  236. \fill (0.4, 0.6) circle (0.15);
  237. \draw node[block, yshift=-10em, xshift=-3em] (driver) {Event driver};
  238. \draw node[block, below of=driver] (gray) {Gray area}
  239. edge[linefrom] node[left=5] {1} (driver);
  240. \draw node[block, below of=gray] (white) {White area}
  241. edge[linefrom, bend left=15] node[left] {2} (gray)
  242. edge[lineto, bend right=15] node[right] {6} (gray);
  243. \draw node[block, right of=white, xshift=4em] {\emph{rotation} tracker}
  244. edge[linefrom, bend right=15] node[above] {3} (white)
  245. edge[lineto, dotted, bend left=15] node[below] {4} (white);
  246. \draw node[block, right of=gray, xshift=4em] {\emph{rotation} tracker}
  247. edge[linefrom, bend right=15] node[above] {7} (gray)
  248. edge[lineto, dotted, bend left=15] node[below] {8} (gray);
  249. \draw node[block, below of=white] {Application}
  250. edge[linefrom, dotted, bend left=65] node[left] {9} (gray)
  251. edge[linefrom, dotted] node[left] {5} (white);
  252. \end{tikzpicture}
  253. }
  254. \quad
  255. \subfigure[An event is triggered in the gray area, it does not even
  256. reach the white area.]{
  257. \begin{tikzpicture}[node distance=5.5em]
  258. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  259. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  260. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  261. \fill (-0.5, -0.7) circle (0.15);
  262. \draw node[block, yshift=-10em, xshift=-3em] (driver) {Event driver};
  263. \draw node[block, below of=driver] (gray) {Gray area}
  264. edge[linefrom] node[left=5] {1} (driver);
  265. \draw node[block, below of=gray] (white) {White area};
  266. \draw node[block, right of=white, xshift=4em] {\emph{rotation} tracker};
  267. \draw node[block, right of=gray, xshift=4em] {\emph{rotation} tracker}
  268. edge[linefrom, bend right=15] node[above] {2} (gray)
  269. edge[lineto, dotted, bend left=15] node[below] {3} (gray);
  270. \draw node[block, below of=white] {Application}
  271. edge[linefrom, dotted, bend left=65] node[left] {4} (gray);
  272. \end{tikzpicture}
  273. }
  274. \caption{Two nested squares both listen to rotation gestures. The two
  275. figures both show a touch object triggering an event, which is
  276. delegated through the area tree in the order indicated by the numbered
  277. arrow labels. Normal arrows represent events, dotted arrows represent
  278. gestures. Note that the dotted arrows only represent the path a gesture
  279. would travel in the tree \emph{if triggered}, not an actual triggered
  280. gesture.}
  281. \label{fig:eventpropagation}
  282. \end{figure}
  283. }