docs: improve custom pointer acceleration documentation.
authorYinon Burgansky <yinonburgansky@gmail.com>
Wed, 16 Aug 2023 17:13:39 +0000 (20:13 +0300)
committerYinon Burgansky <yinonburgansky@gmail.com>
Wed, 16 Aug 2023 17:13:39 +0000 (20:13 +0300)
- Explain calculation made by the driver.
- Provide detailed example with a plot for a custom function.
- Fix inaccurate explanation of unit values.

Signed-off-by: Yinon Burgansky <yinonburgansky@gmail.com>
doc/user/meson.build
doc/user/pointer-acceleration.rst
doc/user/svg/ptraccel-custom.svg [new file with mode: 0644]

index 86de69816f109744011235e1da05881609021f0d..4609eb656c2d3dec9168a1b5d321ec8d744a4a8f 100644 (file)
@@ -110,6 +110,7 @@ src_rst = files(
        'svg/palm-detection.svg',
        'svg/pinch-gestures.svg',
        'svg/pinch-gestures-softbuttons.svg',
+       'svg/ptraccel-custom.svg',
        'svg/ptraccel-linear.svg',
        'svg/ptraccel-low-dpi.svg',
        'svg/ptraccel-touchpad.svg',
index 211bd4696cca5b6775085fcfc662af3cf537fd21..13b33cc2a8508cc9bd85a2b037156444f43c9ae9 100644 (file)
@@ -20,7 +20,7 @@ Pointer acceleration profiles
 
 The profile decides the general method of pointer acceleration.
 libinput currently supports three profiles: **"adaptive"**, **"flat"** and
-**custom**.
+**"custom"**.
 
 - The **adaptive** profile is the default profile for all devices and takes the
   current speed of the device into account when deciding on acceleration.
@@ -231,18 +231,40 @@ limit on how many points may be added.
 
 Thus the points defining the custom function are:
 ``(0 * step, f[0]), (1 * step, f[1]), ..., ((n-1) * step, f[n-1])``
-where ``f`` is a list of ``n`` unitless values defining the acceleration
-factor for each velocity.
+where ``f`` is a list of ``n`` values defining the output velocity for each
+input velocity.
+The acceleration factor is defined by the ratio of the output velocity to the
+input velocity.
 When a velocity value does not lie exactly on those points, a linear
 interpolation of the two closest points will be calculated.
 When a velocity value is greater than the max point defined, a linear
 extrapolation of the two biggest points will be calculated.
 
+the calculation made by libinput: ::
+
+    input_delta = device delta units
+    delta_time = time in ms since last input_delta
+    input_speed = hypot(input_delta) / delta_time
+    output_speed = user_custom_function(input_speed)
+    acceleration_factor = output_speed / input_speed
+    output_delta = input_delta * acceleration_factor
+
 An example is the curve of ``0.0, 1.0`` with a step of ``1.0``. This curve
-is the equivalent of the flat acceleration profile with any input speed `N`
-mapped to the same pointer speed `N`. The curve `1.0, 1.0` neutralizes
+is the equivalent of the flat acceleration profile with any input speed ``N``
+mapped to the same pointer speed ``N``. The curve ``1.0, 1.0`` neutralizes
 any input speed differences and results in a fixed pointer speed.
 
+Another example is the custom acceleration function ``x**2``,
+sampling the function at ``4`` points up to
+a maximum input speed of ``9`` will give us a custom function with
+a step of ``3`` and points ``[0.0, 9.0, 36.0, 81.0]``:
+
+.. figure:: ptraccel-custom.svg
+    :align: center
+
+More sampled points can be added to improve the accuracy of the user custom
+function.
+
 Supported Movement types:
 
 +---------------+---------------------------------+----------------------+
diff --git a/doc/user/svg/ptraccel-custom.svg b/doc/user/svg/ptraccel-custom.svg
new file mode 100644 (file)
index 0000000..abcc5a1
--- /dev/null
@@ -0,0 +1,1067 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="402.915625pt" height="321.95625pt" viewBox="0 0 402.915625 321.95625" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2023-08-16T19:10:50.848529</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.7.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 321.95625
+L 402.915625 321.95625
+L 402.915625 0
+L 0 0
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 46.965625 284.4
+L 395.715625 284.4
+L 395.715625 7.2
+L 46.965625 7.2
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m909db5c39c" d="M 0 0
+L 0 3.5
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m909db5c39c" x="62.817898" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0 -->
+      <g transform="translate(59.636648 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250
+Q 1547 4250 1301 3770
+Q 1056 3291 1056 2328
+Q 1056 1369 1301 889
+Q 1547 409 2034 409
+Q 2525 409 2770 889
+Q 3016 1369 3016 2328
+Q 3016 3291 2770 3770
+Q 2525 4250 2034 4250
+z
+M 2034 4750
+Q 2819 4750 3233 4129
+Q 3647 3509 3647 2328
+Q 3647 1150 3233 529
+Q 2819 -91 2034 -91
+Q 1250 -91 836 529
+Q 422 1150 422 2328
+Q 422 3509 836 4129
+Q 1250 4750 2034 4750
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m909db5c39c" x="126.226989" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 3 -->
+      <g transform="translate(123.045739 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516
+Q 3050 2419 3304 2112
+Q 3559 1806 3559 1356
+Q 3559 666 3084 287
+Q 2609 -91 1734 -91
+Q 1441 -91 1130 -33
+Q 819 25 488 141
+L 488 750
+Q 750 597 1062 519
+Q 1375 441 1716 441
+Q 2309 441 2620 675
+Q 2931 909 2931 1356
+Q 2931 1769 2642 2001
+Q 2353 2234 1838 2234
+L 1294 2234
+L 1294 2753
+L 1863 2753
+Q 2328 2753 2575 2939
+Q 2822 3125 2822 3475
+Q 2822 3834 2567 4026
+Q 2313 4219 1838 4219
+Q 1578 4219 1281 4162
+Q 984 4106 628 3988
+L 628 4550
+Q 988 4650 1302 4700
+Q 1616 4750 1894 4750
+Q 2613 4750 3031 4423
+Q 3450 4097 3450 3541
+Q 3450 3153 3228 2886
+Q 3006 2619 2597 2516
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m909db5c39c" x="189.63608" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 6 -->
+      <g transform="translate(186.45483 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584
+Q 1688 2584 1439 2293
+Q 1191 2003 1191 1497
+Q 1191 994 1439 701
+Q 1688 409 2113 409
+Q 2538 409 2786 701
+Q 3034 994 3034 1497
+Q 3034 2003 2786 2293
+Q 2538 2584 2113 2584
+z
+M 3366 4563
+L 3366 3988
+Q 3128 4100 2886 4159
+Q 2644 4219 2406 4219
+Q 1781 4219 1451 3797
+Q 1122 3375 1075 2522
+Q 1259 2794 1537 2939
+Q 1816 3084 2150 3084
+Q 2853 3084 3261 2657
+Q 3669 2231 3669 1497
+Q 3669 778 3244 343
+Q 2819 -91 2113 -91
+Q 1303 -91 875 529
+Q 447 1150 447 2328
+Q 447 3434 972 4092
+Q 1497 4750 2381 4750
+Q 2619 4750 2861 4703
+Q 3103 4656 3366 4563
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m909db5c39c" x="253.04517" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 9 -->
+      <g transform="translate(249.86392 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-39" d="M 703 97
+L 703 672
+Q 941 559 1184 500
+Q 1428 441 1663 441
+Q 2288 441 2617 861
+Q 2947 1281 2994 2138
+Q 2813 1869 2534 1725
+Q 2256 1581 1919 1581
+Q 1219 1581 811 2004
+Q 403 2428 403 3163
+Q 403 3881 828 4315
+Q 1253 4750 1959 4750
+Q 2769 4750 3195 4129
+Q 3622 3509 3622 2328
+Q 3622 1225 3098 567
+Q 2575 -91 1691 -91
+Q 1453 -91 1209 -44
+Q 966 3 703 97
+z
+M 1959 2075
+Q 2384 2075 2632 2365
+Q 2881 2656 2881 3163
+Q 2881 3666 2632 3958
+Q 2384 4250 1959 4250
+Q 1534 4250 1286 3958
+Q 1038 3666 1038 3163
+Q 1038 2656 1286 2365
+Q 1534 2075 1959 2075
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m909db5c39c" x="316.454261" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 12 -->
+      <g transform="translate(310.091761 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531
+L 1825 531
+L 1825 4091
+L 703 3866
+L 703 4441
+L 1819 4666
+L 2450 4666
+L 2450 531
+L 3481 531
+L 3481 0
+L 794 0
+L 794 531
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-32" d="M 1228 531
+L 3431 531
+L 3431 0
+L 469 0
+L 469 531
+Q 828 903 1448 1529
+Q 2069 2156 2228 2338
+Q 2531 2678 2651 2914
+Q 2772 3150 2772 3378
+Q 2772 3750 2511 3984
+Q 2250 4219 1831 4219
+Q 1534 4219 1204 4116
+Q 875 4013 500 3803
+L 500 4441
+Q 881 4594 1212 4672
+Q 1544 4750 1819 4750
+Q 2544 4750 2975 4387
+Q 3406 4025 3406 3419
+Q 3406 3131 3298 2873
+Q 3191 2616 2906 2266
+Q 2828 2175 2409 1742
+Q 1991 1309 1228 531
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m909db5c39c" x="379.863352" y="284.4" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 15 -->
+      <g transform="translate(373.500852 298.998438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666
+L 3169 4666
+L 3169 4134
+L 1269 4134
+L 1269 2991
+Q 1406 3038 1543 3061
+Q 1681 3084 1819 3084
+Q 2600 3084 3056 2656
+Q 3513 2228 3513 1497
+Q 3513 744 3044 326
+Q 2575 -91 1722 -91
+Q 1428 -91 1123 -41
+Q 819 9 494 109
+L 494 744
+Q 775 591 1075 516
+Q 1375 441 1709 441
+Q 2250 441 2565 725
+Q 2881 1009 2881 1497
+Q 2881 1984 2565 2268
+Q 2250 2553 1709 2553
+Q 1456 2553 1204 2497
+Q 953 2441 691 2322
+L 691 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_7">
+     <!-- device speed (units/ms) -->
+     <g transform="translate(161.278906 312.676562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-76" d="M 191 3500
+L 800 3500
+L 1894 563
+L 2988 3500
+L 3597 3500
+L 2284 0
+L 1503 0
+L 191 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856
+Q 1566 4138 1362 3434
+Q 1159 2731 1159 2009
+Q 1159 1288 1364 580
+Q 1569 -128 1984 -844
+L 1484 -844
+Q 1016 -109 783 600
+Q 550 1309 550 2009
+Q 550 2706 781 3412
+Q 1013 4119 1484 4856
+L 1984 4856
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-75" d="M 544 1381
+L 544 3500
+L 1119 3500
+L 1119 1403
+Q 1119 906 1312 657
+Q 1506 409 1894 409
+Q 2359 409 2629 706
+Q 2900 1003 2900 1516
+L 2900 3500
+L 3475 3500
+L 3475 0
+L 2900 0
+L 2900 538
+Q 2691 219 2414 64
+Q 2138 -91 1772 -91
+Q 1169 -91 856 284
+Q 544 659 544 1381
+z
+M 1991 3584
+L 1991 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666
+L 2156 4666
+L 531 -594
+L 0 -594
+L 1625 4666
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828
+Q 3544 3216 3844 3400
+Q 4144 3584 4550 3584
+Q 5097 3584 5394 3201
+Q 5691 2819 5691 2113
+L 5691 0
+L 5113 0
+L 5113 2094
+Q 5113 2597 4934 2840
+Q 4756 3084 4391 3084
+Q 3944 3084 3684 2787
+Q 3425 2491 3425 1978
+L 3425 0
+L 2847 0
+L 2847 2094
+Q 2847 2600 2669 2842
+Q 2491 3084 2119 3084
+Q 1678 3084 1418 2786
+Q 1159 2488 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1356 3278 1631 3431
+Q 1906 3584 2284 3584
+Q 2666 3584 2933 3390
+Q 3200 3197 3328 2828
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856
+L 1013 4856
+Q 1481 4119 1714 3412
+Q 1947 2706 1947 2009
+Q 1947 1309 1714 600
+Q 1481 -109 1013 -844
+L 513 -844
+Q 928 -128 1133 580
+Q 1338 1288 1338 2009
+Q 1338 2731 1133 3434
+Q 928 4138 513 4856
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-64"/>
+      <use xlink:href="#DejaVuSans-65" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-76" x="125"/>
+      <use xlink:href="#DejaVuSans-69" x="184.179688"/>
+      <use xlink:href="#DejaVuSans-63" x="211.962891"/>
+      <use xlink:href="#DejaVuSans-65" x="266.943359"/>
+      <use xlink:href="#DejaVuSans-20" x="328.466797"/>
+      <use xlink:href="#DejaVuSans-73" x="360.253906"/>
+      <use xlink:href="#DejaVuSans-70" x="412.353516"/>
+      <use xlink:href="#DejaVuSans-65" x="475.830078"/>
+      <use xlink:href="#DejaVuSans-65" x="537.353516"/>
+      <use xlink:href="#DejaVuSans-64" x="598.876953"/>
+      <use xlink:href="#DejaVuSans-20" x="662.353516"/>
+      <use xlink:href="#DejaVuSans-28" x="694.140625"/>
+      <use xlink:href="#DejaVuSans-75" x="733.154297"/>
+      <use xlink:href="#DejaVuSans-6e" x="796.533203"/>
+      <use xlink:href="#DejaVuSans-69" x="859.912109"/>
+      <use xlink:href="#DejaVuSans-74" x="887.695312"/>
+      <use xlink:href="#DejaVuSans-73" x="926.904297"/>
+      <use xlink:href="#DejaVuSans-2f" x="979.003906"/>
+      <use xlink:href="#DejaVuSans-6d" x="1012.695312"/>
+      <use xlink:href="#DejaVuSans-73" x="1110.107422"/>
+      <use xlink:href="#DejaVuSans-29" x="1162.207031"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_7">
+      <defs>
+       <path id="m7becd6f1d4" d="M 0 0
+L -3.5 0
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m7becd6f1d4" x="46.965625" y="271.8" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0 -->
+      <g transform="translate(33.603125 275.599219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m7becd6f1d4" x="46.965625" y="215.8" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 50 -->
+      <g transform="translate(27.240625 219.599219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_9">
+      <g>
+       <use xlink:href="#m7becd6f1d4" x="46.965625" y="159.8" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 100 -->
+      <g transform="translate(20.878125 163.599219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m7becd6f1d4" x="46.965625" y="103.8" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 150 -->
+      <g transform="translate(20.878125 107.599219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m7becd6f1d4" x="46.965625" y="47.8" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 200 -->
+      <g transform="translate(20.878125 51.599219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_13">
+     <!-- pointer speed (units/ms) -->
+     <g transform="translate(14.798438 207.320312) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-70"/>
+      <use xlink:href="#DejaVuSans-6f" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-69" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-6e" x="152.441406"/>
+      <use xlink:href="#DejaVuSans-74" x="215.820312"/>
+      <use xlink:href="#DejaVuSans-65" x="255.029297"/>
+      <use xlink:href="#DejaVuSans-72" x="316.552734"/>
+      <use xlink:href="#DejaVuSans-20" x="357.666016"/>
+      <use xlink:href="#DejaVuSans-73" x="389.453125"/>
+      <use xlink:href="#DejaVuSans-70" x="441.552734"/>
+      <use xlink:href="#DejaVuSans-65" x="505.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="566.552734"/>
+      <use xlink:href="#DejaVuSans-64" x="628.076172"/>
+      <use xlink:href="#DejaVuSans-20" x="691.552734"/>
+      <use xlink:href="#DejaVuSans-28" x="723.339844"/>
+      <use xlink:href="#DejaVuSans-75" x="762.353516"/>
+      <use xlink:href="#DejaVuSans-6e" x="825.732422"/>
+      <use xlink:href="#DejaVuSans-69" x="889.111328"/>
+      <use xlink:href="#DejaVuSans-74" x="916.894531"/>
+      <use xlink:href="#DejaVuSans-73" x="956.103516"/>
+      <use xlink:href="#DejaVuSans-2f" x="1008.203125"/>
+      <use xlink:href="#DejaVuSans-6d" x="1041.894531"/>
+      <use xlink:href="#DejaVuSans-73" x="1139.306641"/>
+      <use xlink:href="#DejaVuSans-29" x="1191.40625"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_12">
+    <path d="M 62.817898 271.8
+L 69.482517 271.688645
+L 76.147136 271.354582
+L 82.811755 270.797809
+L 89.476374 270.018326
+L 96.140994 269.016135
+L 102.805613 267.791234
+L 109.470232 266.343625
+L 116.134851 264.673306
+L 122.79947 262.780278
+L 129.464089 260.66454
+L 136.446071 258.209184
+L 143.428053 255.509403
+L 150.410035 252.565198
+L 157.392017 249.376568
+L 164.373999 245.943513
+L 171.355981 242.266034
+L 178.337963 238.34413
+L 185.637308 233.982615
+L 192.936653 229.35395
+L 200.235998 224.458136
+L 207.535342 219.295171
+L 214.834687 213.865056
+L 222.451395 207.914024
+L 230.068102 201.672106
+L 237.68481 195.139303
+L 245.301518 188.315615
+L 252.918225 181.201041
+L 260.852296 173.480708
+L 268.786366 165.444744
+L 276.720437 157.093149
+L 284.654507 148.425923
+L 292.90594 139.077187
+L 301.157374 129.387065
+L 309.408807 119.355556
+L 317.66024 108.98266
+L 326.229036 97.849473
+L 334.797832 86.348134
+L 343.366628 74.478643
+L 352.252787 61.780683
+L 361.138946 48.686797
+L 370.025105 35.196983
+L 378.911264 21.311241
+L 379.863352 19.8
+L 379.863352 19.8
+" clip-path="url(#p40ae99131b)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_13">
+    <path d="M 62.817898 271.8
+L 126.226989 261.72
+L 189.63608 231.48
+L 253.04517 181.08
+" clip-path="url(#p40ae99131b)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/>
+    <defs>
+     <path id="m3fe20b50db" d="M 0 2.5
+C 0.663008 2.5 1.29895 2.236584 1.767767 1.767767
+C 2.236584 1.29895 2.5 0.663008 2.5 0
+C 2.5 -0.663008 2.236584 -1.29895 1.767767 -1.767767
+C 1.29895 -2.236584 0.663008 -2.5 0 -2.5
+C -0.663008 -2.5 -1.29895 -2.236584 -1.767767 -1.767767
+C -2.236584 -1.29895 -2.5 -0.663008 -2.5 0
+C -2.5 0.663008 -2.236584 1.29895 -1.767767 1.767767
+C -1.29895 2.236584 -0.663008 2.5 0 2.5
+z
+" style="stroke: #0000ff"/>
+    </defs>
+    <g clip-path="url(#p40ae99131b)">
+     <use xlink:href="#m3fe20b50db" x="62.817898" y="271.8" style="fill: #0000ff; stroke: #0000ff"/>
+     <use xlink:href="#m3fe20b50db" x="126.226989" y="261.72" style="fill: #0000ff; stroke: #0000ff"/>
+     <use xlink:href="#m3fe20b50db" x="189.63608" y="231.48" style="fill: #0000ff; stroke: #0000ff"/>
+     <use xlink:href="#m3fe20b50db" x="253.04517" y="181.08" style="fill: #0000ff; stroke: #0000ff"/>
+    </g>
+   </g>
+   <g id="line2d_14">
+    <path d="M 253.04517 181.08
+L 379.863352 80.28
+" clip-path="url(#p40ae99131b)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #0000ff; stroke-width: 1.5"/>
+   </g>
+   <g id="patch_3">
+    <path d="M 46.965625 284.4
+L 46.965625 7.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 395.715625 284.4
+L 395.715625 7.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 46.965625 284.4
+L 395.715625 284.4
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 46.965625 7.2
+L 395.715625 7.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 53.965625 59.234375
+L 193.84375 59.234375
+Q 195.84375 59.234375 195.84375 57.234375
+L 195.84375 14.2
+Q 195.84375 12.2 193.84375 12.2
+L 53.965625 12.2
+Q 51.965625 12.2 51.965625 14.2
+L 51.965625 57.234375
+Q 51.965625 59.234375 53.965625 59.234375
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_15">
+     <path d="M 55.965625 20.298437
+L 65.965625 20.298437
+L 75.965625 20.298437
+" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_14">
+     <!-- user custom function -->
+     <g transform="translate(83.965625 23.798437) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-66" d="M 2375 4863
+L 2375 4384
+L 1825 4384
+Q 1516 4384 1395 4259
+Q 1275 4134 1275 3809
+L 1275 3500
+L 2222 3500
+L 2222 3053
+L 1275 3053
+L 1275 0
+L 697 0
+L 697 3053
+L 147 3053
+L 147 3500
+L 697 3500
+L 697 3744
+Q 697 4328 969 4595
+Q 1241 4863 1831 4863
+L 2375 4863
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-75"/>
+      <use xlink:href="#DejaVuSans-73" x="63.378906"/>
+      <use xlink:href="#DejaVuSans-65" x="115.478516"/>
+      <use xlink:href="#DejaVuSans-72" x="177.001953"/>
+      <use xlink:href="#DejaVuSans-20" x="218.115234"/>
+      <use xlink:href="#DejaVuSans-63" x="249.902344"/>
+      <use xlink:href="#DejaVuSans-75" x="304.882812"/>
+      <use xlink:href="#DejaVuSans-73" x="368.261719"/>
+      <use xlink:href="#DejaVuSans-74" x="420.361328"/>
+      <use xlink:href="#DejaVuSans-6f" x="459.570312"/>
+      <use xlink:href="#DejaVuSans-6d" x="520.751953"/>
+      <use xlink:href="#DejaVuSans-20" x="618.164062"/>
+      <use xlink:href="#DejaVuSans-66" x="649.951172"/>
+      <use xlink:href="#DejaVuSans-75" x="685.15625"/>
+      <use xlink:href="#DejaVuSans-6e" x="748.535156"/>
+      <use xlink:href="#DejaVuSans-63" x="811.914062"/>
+      <use xlink:href="#DejaVuSans-74" x="866.894531"/>
+      <use xlink:href="#DejaVuSans-69" x="906.103516"/>
+      <use xlink:href="#DejaVuSans-6f" x="933.886719"/>
+      <use xlink:href="#DejaVuSans-6e" x="995.068359"/>
+     </g>
+    </g>
+    <g id="line2d_16">
+     <path d="M 55.965625 34.976562
+L 65.965625 34.976562
+L 75.965625 34.976562
+" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/>
+     <g>
+      <use xlink:href="#m3fe20b50db" x="65.965625" y="34.976562" style="fill: #0000ff; stroke: #0000ff"/>
+     </g>
+    </g>
+    <g id="text_15">
+     <!-- sampled function -->
+     <g transform="translate(83.965625 38.476562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-61" d="M 2194 1759
+Q 1497 1759 1228 1600
+Q 959 1441 959 1056
+Q 959 750 1161 570
+Q 1363 391 1709 391
+Q 2188 391 2477 730
+Q 2766 1069 2766 1631
+L 2766 1759
+L 2194 1759
+z
+M 3341 1997
+L 3341 0
+L 2766 0
+L 2766 531
+Q 2569 213 2275 61
+Q 1981 -91 1556 -91
+Q 1019 -91 701 211
+Q 384 513 384 1019
+Q 384 1609 779 1909
+Q 1175 2209 1959 2209
+L 2766 2209
+L 2766 2266
+Q 2766 2663 2505 2880
+Q 2244 3097 1772 3097
+Q 1472 3097 1187 3025
+Q 903 2953 641 2809
+L 641 3341
+Q 956 3463 1253 3523
+Q 1550 3584 1831 3584
+Q 2591 3584 2966 3190
+Q 3341 2797 3341 1997
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-73"/>
+      <use xlink:href="#DejaVuSans-61" x="52.099609"/>
+      <use xlink:href="#DejaVuSans-6d" x="113.378906"/>
+      <use xlink:href="#DejaVuSans-70" x="210.791016"/>
+      <use xlink:href="#DejaVuSans-6c" x="274.267578"/>
+      <use xlink:href="#DejaVuSans-65" x="302.050781"/>
+      <use xlink:href="#DejaVuSans-64" x="363.574219"/>
+      <use xlink:href="#DejaVuSans-20" x="427.050781"/>
+      <use xlink:href="#DejaVuSans-66" x="458.837891"/>
+      <use xlink:href="#DejaVuSans-75" x="494.042969"/>
+      <use xlink:href="#DejaVuSans-6e" x="557.421875"/>
+      <use xlink:href="#DejaVuSans-63" x="620.800781"/>
+      <use xlink:href="#DejaVuSans-74" x="675.78125"/>
+      <use xlink:href="#DejaVuSans-69" x="714.990234"/>
+      <use xlink:href="#DejaVuSans-6f" x="742.773438"/>
+      <use xlink:href="#DejaVuSans-6e" x="803.955078"/>
+     </g>
+    </g>
+    <g id="line2d_17">
+     <path d="M 55.965625 49.654687
+L 65.965625 49.654687
+L 75.965625 49.654687
+" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #0000ff; stroke-width: 1.5"/>
+    </g>
+    <g id="text_16">
+     <!-- extrapolated function -->
+     <g transform="translate(83.965625 53.154687) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-78" d="M 3513 3500
+L 2247 1797
+L 3578 0
+L 2900 0
+L 1881 1375
+L 863 0
+L 184 0
+L 1544 1831
+L 300 3500
+L 978 3500
+L 1906 2253
+L 2834 3500
+L 3513 3500
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-65"/>
+      <use xlink:href="#DejaVuSans-78" x="59.773438"/>
+      <use xlink:href="#DejaVuSans-74" x="118.953125"/>
+      <use xlink:href="#DejaVuSans-72" x="158.162109"/>
+      <use xlink:href="#DejaVuSans-61" x="199.275391"/>
+      <use xlink:href="#DejaVuSans-70" x="260.554688"/>
+      <use xlink:href="#DejaVuSans-6f" x="324.03125"/>
+      <use xlink:href="#DejaVuSans-6c" x="385.212891"/>
+      <use xlink:href="#DejaVuSans-61" x="412.996094"/>
+      <use xlink:href="#DejaVuSans-74" x="474.275391"/>
+      <use xlink:href="#DejaVuSans-65" x="513.484375"/>
+      <use xlink:href="#DejaVuSans-64" x="575.007812"/>
+      <use xlink:href="#DejaVuSans-20" x="638.484375"/>
+      <use xlink:href="#DejaVuSans-66" x="670.271484"/>
+      <use xlink:href="#DejaVuSans-75" x="705.476562"/>
+      <use xlink:href="#DejaVuSans-6e" x="768.855469"/>
+      <use xlink:href="#DejaVuSans-63" x="832.234375"/>
+      <use xlink:href="#DejaVuSans-74" x="887.214844"/>
+      <use xlink:href="#DejaVuSans-69" x="926.423828"/>
+      <use xlink:href="#DejaVuSans-6f" x="954.207031"/>
+      <use xlink:href="#DejaVuSans-6e" x="1015.388672"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p40ae99131b">
+   <rect x="46.965625" y="7.2" width="348.75" height="277.2"/>
+  </clipPath>
+ </defs>
+</svg>