docs: the affine space chapter rewritten

This commit is contained in:
Mateusz Pusz
2024-03-23 22:21:33 +09:00
parent 67caa04cbe
commit a18b4e6c59
7 changed files with 2104 additions and 286 deletions

View File

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.519447mm"
height="18.977507mm"
viewBox="0 0 96.519447 18.977507"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow-7"
refX="0"
refY="0"
orient="auto-start-reverse"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-4" />
</marker>
</defs>
<g
id="layer1"
transform="translate(-25.688031,-5.1378845)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-7)"
d="M 25.688031,20.190804 H 118.68548"
id="path4-1" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 38.972582,19.150746 v 2.080116"
id="path7-6" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="M 38.972582,6.4770492 V 18.940594"
id="path2-2-2" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="M 106.70024,6.477049 V 18.940594"
id="path2-2-1-0" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="M 94.493026,6.4770489 V 18.940594"
id="path2-2-1-0-0" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 94.493026,19.150746 v 2.080116"
id="path2-5-2" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 106.70024,19.150746 v 2.080116"
id="path2-5-7-8" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="38.294933"
y="23.605515"
id="text2-1"><tspan
id="tspan2-4"
style="font-size:2.46944px;stroke-width:0;stroke-dasharray:none"
x="38.294933"
y="23.605515">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="92.443802"
y="23.628254"
id="text2-2-9"><tspan
id="tspan2-9-9"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="92.443802"
y="23.628254">qp1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="65.724129"
y="15.90378"
id="text2-2-7-49"><tspan
id="tspan2-9-0-96"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="65.724129"
y="15.90378">q1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="104.51233"
y="23.628254"
id="text2-2-2-31"><tspan
id="tspan2-9-6-4"
style="font-size:2.46944px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="104.51233"
y="23.628254">qp2</tspan></text>
<g
id="path8-0">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 38.859025,16.958625 H 93.883213"
id="path19" />
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 38.859375,16.833984 v 0.25 h 55.023437 v -0.25 z"
id="path20" />
<g
id="g18">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 92.587891,16.050781 -0.158204,0.316406 1.183594,0.591797 -1.183594,0.591797 0.158204,0.316406 1.816406,-0.908203 z"
id="path18" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="96.030548"
y="6.683012"
id="text2-2-7-49-5"><tspan
id="tspan2-9-0-96-4"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="96.030548"
y="6.683012">qp2 - qp1</tspan></text>
<g
id="path8-0-9">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 94.668605,8.1347259 H 106.1527"
id="path13" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="m 94.667969,8.0097656 v 0.25 h 11.484371 v -0.25 z"
id="path14" />
<g
id="g12">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 104.85742,7.2265625 -0.1582,0.3164062 1.18359,0.5917969 -1.18359,0.5917969 0.1582,0.3164063 1.81641,-0.9082032 z"
id="path12" />
</g>
</g>
<g
id="path3-2-6">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 38.947347,12.639233 H 106.08562"
id="path16" />
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 38.947266,12.513672 v 0.25 h 67.138674 v -0.25 z"
id="path17" />
<g
id="g15">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 104.78906,11.730469 -0.1582,0.316406 1.18359,0.591797 -1.18359,0.591797 0.1582,0.316406 1.81641,-0.908203 z"
id="path15" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="71.684494"
y="11.65577"
id="text2-2-2-5-1"><tspan
id="tspan2-9-6-2-85"
style="font-size:2.11667px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="71.684494"
y="11.65577">q2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="120.04948"
y="23.910408"
id="text1"><tspan
id="tspan1"
style="font-size:2.82222px;stroke-width:0"
x="120.04948"
y="23.910408">Q</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="54.035492"
y="6.6788778"
id="text2-2-7-49-5-3-2-6-2"><tspan
id="tspan2-9-0-96-4-1-8-8-1"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="54.035492"
y="6.6788778">qp1.quantity_from_zero()</tspan></text>
<g
id="path8-0-9-8-0-0-0"
transform="translate(-0.21367231,-90.9375)">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 39.107719,99.071826 H 94.115772"
id="path56-0" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="m 39.107422,98.947266 v 0.25 h 55.007812 v -0.25 z"
id="path57-8" />
<g
id="g55-4">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 92.820312,98.164062 -0.158203,0.316407 1.183594,0.591797 -1.183594,0.591796 0.158203,0.316407 1.816407,-0.908203 z"
id="path55-9" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.403236mm"
height="18.904934mm"
viewBox="0 0 96.403236 18.904934"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow"
refX="0"
refY="0"
orient="auto-start-reverse"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6" />
</marker>
</defs>
<g
id="layer1"
transform="translate(-25.804236,-30.190578)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow)"
d="M 25.804236,45.161105 H 118.80168"
id="path1" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 39.088787,44.121047 v 2.080116"
id="path2" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="M 39.088787,32.382797 V 43.910895"
id="path2-2" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 94.609231,44.121047 v 2.080116"
id="path2-5" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 106.81644,44.121047 v 2.080116"
id="path2-5-7" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="35.693306"
y="48.575817"
id="text2"><tspan
id="tspan2"
style="font-size:2.46944px;stroke-width:0;stroke-dasharray:none"
x="35.693306"
y="48.575817">origin</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="92.560005"
y="48.598557"
id="text2-2"><tspan
id="tspan2-9"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="92.560005"
y="48.598557">qp1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="65.840332"
y="40.874092"
id="text2-2-7"><tspan
id="tspan2-9-0"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="65.840332"
y="40.874092">q1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="104.62855"
y="48.598557"
id="text2-2-2"><tspan
id="tspan2-9-6"
style="font-size:2.46944px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="104.62855"
y="48.598557">qp2</tspan></text>
<g
id="path3">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 39.107522,41.928926 H 93.999418"
id="path28" />
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 39.107422,41.804687 v 0.25 H 94 v -0.25 z"
id="path29" />
<g
id="g27">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 92.703125,41.021484 -0.158203,0.316407 1.183594,0.591796 -1.183594,0.591797 0.158203,0.316407 1.816406,-0.908204 z"
id="path27" />
</g>
</g>
<g
id="path3-2">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 38.997406,37.609536 H 106.20182"
id="path22" />
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 38.998047,37.484375 v 0.25 h 67.203123 v -0.25 z"
id="path23" />
<g
id="g21">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 104.90625,36.701172 -0.1582,0.316406 1.18359,0.591797 -1.18359,0.591797 0.1582,0.316406 1.81641,-0.908203 z"
id="path21" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="71.800697"
y="36.626076"
id="text2-2-2-5"><tspan
id="tspan2-9-6-2"
style="font-size:2.11667px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="71.800697"
y="36.626076">q2</tspan></text>
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="M 106.77479,31.529741 V 43.993285"
id="path2-2-1-0-3" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="M 94.567582,31.529741 V 43.993285"
id="path2-2-1-0-0-3" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="96.105103"
y="31.735704"
id="text2-2-7-49-5-3"><tspan
id="tspan2-9-0-96-4-1"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="96.105103"
y="31.735704">qp2 - qp1</tspan></text>
<g
id="path8-0-9-8">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 94.677011,33.187418 H 106.22725"
id="path25" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="m 94.677734,33.0625 v 0.25 h 11.548826 v -0.25 z"
id="path26" />
<g
id="g24">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 104.93164,32.279297 -0.1582,0.316406 1.18359,0.591797 -1.18359,0.591797 0.1582,0.316406 1.81641,-0.908203 z"
id="path24" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="120.04948"
y="48.880711"
id="text1-1"><tspan
id="tspan1-0"
style="font-size:2.82222px;stroke-width:0"
x="120.04948"
y="48.880711">Q</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="53.892708"
y="31.731571"
id="text2-2-7-49-5-3-2-6-2-8"><tspan
id="tspan2-9-0-96-4-1-8-8-1-5"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="53.892708"
y="31.731571">qp1.quantity_from(origin)</tspan></text>
<g
id="path8-0-9-8-0-0-0-5"
transform="translate(-0.11139435,-65.884765)">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 39.107719,99.071826 H 94.115772"
id="path56-0-5" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="m 39.107422,98.947266 v 0.25 h 55.007812 v -0.25 z"
id="path57-8-2" />
<g
id="g55-4-6">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 92.820312,98.164062 -0.158203,0.316407 1.183594,0.591797 -1.183594,0.591796 0.158203,0.316407 1.816407,-0.908203 z"
id="path55-9-4" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.999374mm"
height="21.958826mm"
viewBox="0 0 96.999374 21.958826"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="affine space.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="2.8284271"
inkscape:cx="314.13219"
inkscape:cy="405.87929"
inkscape:window-width="1920"
inkscape:window-height="1018"
inkscape:window-x="-6"
inkscape:window-y="-6"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow-4"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Dart arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-0" />
</marker>
<marker
style="overflow:visible"
id="DartArrow-4-63"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Dart arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-0-1" />
</marker>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-25.208098,-62.799826)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-4)"
d="M 25.836095,69.152022 H 118.83353"
id="path4"
inkscape:export-filename="\\wsl.localhost\Ubuntu\home\mpusz\repos\wg21-papers\src\img\affine_space_3.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-4-63)"
d="m 25.8361,75.031614 h 92.99743"
id="path4-19" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="M 39.120646,68.111964 V 70.19208"
id="path7" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 39.120646,63.483088 v 4.418724"
id="path2-2-7" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 106.8483,63.483088 v 4.418724"
id="path2-2-1-5" />
<g
id="g2"
transform="matrix(1,0,0,-1,0,144.1511)">
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="m 94.64109,64.101259 v 3.800547"
id="path2-2-4-4-0" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 94.64109,68.111958 v 2.080116"
id="path2-5-4-1" />
</g>
<g
id="g2-0"
transform="matrix(1,0,0,-1,-40.851506,144.1511)">
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="m 94.64109,64.101259 v 3.800547"
id="path2-2-4-4-0-9" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 94.64109,68.111958 v 2.080116"
id="path2-5-4-1-1" />
</g>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="M 106.8483,68.111964 V 70.19208"
id="path2-5-7-5" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none;stroke-opacity:0"
x="35.017372"
y="72.566734"
id="text2-8"><tspan
sodipodi:role="line"
id="tspan2-6"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none;stroke-opacity:0"
x="35.017372"
y="72.566734">origin2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="49.824974"
y="72.469109"
id="text2-8-7"><tspan
sodipodi:role="line"
id="tspan2-6-4"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="49.824974"
y="72.469109">origin1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="92.591866"
y="72.58947"
id="text2-2-8"><tspan
sodipodi:role="line"
id="tspan2-9-3"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="92.591866"
y="72.58947">qp1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="73.215424"
y="77.620125"
id="text2-2-7-4"><tspan
sodipodi:role="line"
id="tspan2-9-0-9"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="73.215424"
y="77.620125">q1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="104.66041"
y="72.58947"
id="text2-2-2-3"><tspan
sodipodi:role="line"
id="tspan2-9-6-28"
style="font-size:2.46944px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="104.66041"
y="72.58947">qp2</tspan></text>
<g
id="path8">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 53.742163,78.674945 H 94.247248"
id="path34" />
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 53.742187,78.550781 v 0.25 h 40.50586 v -0.25 z"
id="path35" />
<g
id="g33">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 92.951172,77.767578 -0.158203,0.316406 1.183593,0.591797 -1.183593,0.591797 0.158203,0.316406 1.816406,-0.908203 z"
id="path33" />
</g>
</g>
<g
id="path3-2-9"
transform="translate(0,3.7041668)">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="M 38.897633,61.600455 H 106.32656"
id="path31" />
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 38.898437,61.474609 v 0.25 h 67.427733 v -0.25 z"
id="path32" />
<g
id="g30">
<path
style="color:#000000;fill:#0000dd;-inkscape-stroke:none"
d="m 105.03125,60.691406 -0.1582,0.316406 1.18359,0.591797 -1.18359,0.591797 0.1582,0.316406 1.81641,-0.908203 z"
id="path30" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000dd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="71.879326"
y="64.321182"
id="text2-2-2-5-6"><tspan
sodipodi:role="line"
id="tspan2-9-6-2-8"
style="font-size:2.11667px;fill:#0000dd;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="71.879326"
y="64.321182">q2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="36.593639"
y="81.518364"
id="text5"><tspan
sodipodi:role="line"
id="tspan5"
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="36.593639"
y="81.518364">unrelated</tspan><tspan
sodipodi:role="line"
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="36.593639"
y="84.1642"
id="tspan6">(no known translation)</tspan></text>
<g
id="path9">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 29.181641,69.78125 -0.177735,0.08789 4.957031,9.822265 0.177735,-0.08789 z"
id="path39" />
<g
id="g38">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 28.90625,69.457031 0.0059,1.609375 0.28125,-0.002 -0.0039,-1.048828 0.839844,0.626953 0.167969,-0.224609 z"
id="path38" />
</g>
</g>
<g
id="path9-0">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 43.837891,75.837891 -3.462891,3.648437 0.144531,0.134766 3.460938,-3.646485 z"
id="path37" />
<g
id="g36">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 44.193359,75.607422 -1.511718,0.548828 0.09375,0.261719 0.986328,-0.357422 -0.304688,1.003906 0.267578,0.08008 z"
id="path36" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="120.04948"
y="72.87162"
id="text1-0"><tspan
sodipodi:role="line"
id="tspan1-1"
style="font-size:2.82222px;stroke-width:0"
x="120.04948"
y="72.87162">Q</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,449 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.326935mm"
height="29.734055mm"
viewBox="0 0 96.326935 29.734055"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow-4-6"
refX="0"
refY="0"
orient="auto-start-reverse"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-0-2" />
</marker>
</defs>
<g
id="layer1"
transform="translate(-25.880545,-96.604283)">
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="38.968349"
y="123.09805"
id="text5-7"><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="38.968349"
y="123.09805"
id="tspan4">absolute</tspan><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="38.968349"
y="125.74389"
id="tspan7">point origin</tspan></text>
<g
id="path9-0-6">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 38.974609,116.68945 -0.08789,4.44141 0.199218,0.004 0.08594,-4.44141 z"
id="path62" />
<g
id="g61">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 39.082031,116.2793 -0.748047,1.42383 0.248047,0.13085 0.488281,-0.92773 0.449219,0.94531 0.253906,-0.11914 z"
id="path61" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="96.202194"
y="98.149414"
id="text2-2-7-49-5-3-2"><tspan
id="tspan2-9-0-96-4-1-8"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="96.202194"
y="98.149414">qp2 - qp1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="70.745201"
y="98.145279"
id="text2-2-7-49-5-3-2-6"><tspan
id="tspan2-9-0-96-4-1-8-8"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="70.745201"
y="98.145279">qp1.quantity_from(D)</tspan></text>
<g
id="path8-0-9-8-0"
transform="translate(0,0.52916663)">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 94.707954,99.071826 H 106.32434"
id="path59" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="m 94.707031,98.947266 v 0.25 h 11.617189 v -0.25 z"
id="path60" />
<g
id="g58">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 105.0293,98.164062 -0.15821,0.316407 1.1836,0.591797 -1.1836,0.591796 0.15821,0.316407 1.81445,-0.908203 z"
id="path58" />
</g>
</g>
<g
id="path8-0-9-8-0-0">
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;stroke-width:1;-inkscape-stroke:none"
d="m 68.760977,99.476433 v 0.25 h 25.354258 v -0.25 z"
id="path57" />
<g
id="g55"
transform="translate(0,0.52916663)">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 92.820312,98.164062 -0.158203,0.316407 1.183594,0.591797 -1.183594,0.591796 0.158203,0.316407 1.816407,-0.908203 z"
id="path55" />
</g>
</g>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-4-6)"
d="M 25.880545,111.83708 H 118.87798"
id="path4-5" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 39.165096,110.79701 v 2.08013"
id="path7-68" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 39.165096,102.98758 v 7.59928"
id="path2-2-7-4" />
<g
id="g3"
transform="matrix(1,0,0,0.92845207,0,8.0761204)"
style="stroke-width:1.03782">
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.309085;stroke-dasharray:1.23634, 0.309085;stroke-dashoffset:0;stroke-opacity:1"
d="M 106.89275,97.421693 V 110.58686"
id="path2-2-1-5-6" />
<g
id="g5-8"
transform="translate(14.169645,72.847502)"
style="stroke-width:1.03782">
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.309269;stroke-dasharray:1.23708, 0.309269;stroke-dashoffset:0;stroke-opacity:1"
d="m 80.515895,24.584313 v 13.15498"
id="path2-2-4-4-5" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.395717;stroke-dasharray:none"
d="m 80.515895,37.949445 v 2.080116"
id="path2-5-4-8" />
</g>
</g>
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="m 51.027704,106.78628 v 3.80057"
id="path2-2-4-4-9-8" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 51.027704,110.797 v 2.08012"
id="path2-5-4-7-5" />
<g
id="g5-7-5-0"
transform="translate(-18.987307,72.847502)">
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:1"
d="m 80.515895,33.938746 v 3.800547"
id="path2-2-4-4-9-8-3" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 80.515895,37.949445 v 2.080116"
id="path2-5-4-7-5-8" />
</g>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 106.89275,110.79701 v 2.08013"
id="path2-5-7-5-2" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="M 68.944416,98.684542 V 110.75072"
id="path2-2-1-5-6-6" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 68.944417,110.79699 v 2.08013"
id="path2-5-7-5-2-1" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="50.122463"
y="115.51437"
id="text2-8-5"><tspan
id="tspan2-6-7"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="50.122463"
y="115.51437">B</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="38.291954"
y="115.51437"
id="text2-8-7-4"><tspan
id="tspan2-6-4-4"
style="font-size:2.46944px;fill:#000000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="38.291954"
y="115.51437">A</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="92.636322"
y="115.27438"
id="text2-2-8-9"><tspan
id="tspan2-9-3-8"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="92.636322"
y="115.27438">qp1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="77.075813"
y="107.54999"
id="text2-2-7-4-6"><tspan
id="tspan2-9-0-9-4"
style="font-size:2.11667px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="77.075813"
y="107.54999">q1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="42.750381"
y="107.54689"
id="text2-2-7-4-6-45"><tspan
id="tspan2-9-0-9-4-5"
style="font-size:2.11667px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="42.750381"
y="107.54689">qAB</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="54.042065"
y="107.55981"
id="text2-2-7-4-6-45-3"><tspan
id="tspan2-9-0-9-4-5-3"
style="font-size:2.11667px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="54.042065"
y="107.55981">qBC</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="104.70486"
y="115.27438"
id="text2-2-2-3-0"><tspan
id="tspan2-9-6-28-2"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="104.70486"
y="115.27438">qp2</tspan></text>
<g
id="path8-2">
<path
style="color:#000000;fill:#0000df;-inkscape-stroke:none"
d="M 61.486653,108.60488 H 94.289686"
id="path50" />
<path
style="color:#000000;fill:#0000e0;fill-opacity:0.607843;-inkscape-stroke:none"
d="m 61.486328,108.49219 v 0.22461 h 32.802734 v -0.22461 z"
id="path51" />
<g
id="g49">
<path
style="color:#000000;fill:#0000e0;-inkscape-stroke:none"
d="m 93.126953,107.79102 -0.142578,0.2832 1.0625,0.53125 -1.0625,0.53125 0.142578,0.2832 1.628906,-0.81445 z"
id="path49" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="86.728935"
y="102.98244"
id="text2-2-7-4-6-4"><tspan
id="tspan2-9-0-9-4-4"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="86.728935"
y="102.98244">q2</tspan></text>
<g
id="path8-2-5">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="M 68.908173,104.03727 H 106.34598"
id="path53" />
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 68.908203,103.92188 v 0.23046 H 106.3457 v -0.23046 z"
id="path54" />
<g
id="g52">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="60.801697"
y="115.51437"
id="text2-8-5-8"><tspan
id="tspan2-6-7-4"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="60.801697"
y="115.51437">C</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="68.025009"
y="115.48423"
id="text2-8-5-8-3"><tspan
id="tspan2-6-7-4-0"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="68.025009"
y="115.48423">D</tspan></text>
<g
id="path8-2-3">
<path
style="color:#000000;fill:#0000df;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="M 39.317073,108.60488 H 50.523486"
id="path44" />
<path
style="color:#000000;fill:#0000e0;fill-opacity:0.607843;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="m 39.316406,108.49219 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673829,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 H 49.1875 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.439453 v -0.22461 z"
id="path45" />
<g
id="g43">
<path
style="color:#000000;fill:#0000e0;-inkscape-stroke:none"
d="m 49.361328,107.79102 -0.142578,0.2832 1.0625,0.53125 -1.0625,0.53125 0.142578,0.2832 1.628906,-0.81445 z"
id="path43" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="51.8615"
y="102.97934"
id="text2-2-7-4-6-45-8"><tspan
id="tspan2-9-0-9-4-5-32"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="51.8615"
y="102.97934">qAD</tspan></text>
<g
id="path8-2-3-1">
<path
style="color:#000000;fill:#d40000;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="M 39.217077,104.03727 H 68.381658"
id="path41" />
<path
style="color:#000000;fill:#d40000;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="m 39.216797,103.92578 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673829,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449218 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 H 53.125 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673829,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673829,0 v 0.22461 h 0.449218 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.226562 v -0.22461 z"
id="path42" />
<g
id="g40">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 67.21875,103.22266 -0.142578,0.2832 1.0625,0.53125 -1.0625,0.53125 0.142578,0.2832 1.628906,-0.81445 z"
id="path40" />
</g>
</g>
<g
id="path8-2-3-8">
<path
style="color:#000000;fill:#0000df;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="m 51.301773,108.60488 h 9.816239"
id="path47" />
<path
style="color:#000000;fill:#0000e0;fill-opacity:0.607843;stroke-dasharray:0.448642, 0.224321;-inkscape-stroke:none"
d="m 51.302734,108.49219 v 0.22461 H 51.75 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673829,0 v 0.22461 h 0.447265 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449218 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449218 v -0.22461 z m 0.673828,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.449219 v -0.22461 z m 0.673828,0 v 0.22461 h 0.447266 v -0.22461 z m 0.671875,0 v 0.22461 h 0.394531 v -0.22461 z"
id="path48" />
<g
id="g46">
<path
style="color:#000000;fill:#0000e0;-inkscape-stroke:none"
d="m 59.955078,107.79102 -0.142578,0.2832 1.064453,0.53125 -1.064453,0.53125 0.142578,0.2832 1.628906,-0.81445 z"
id="path46" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="120.04948"
y="115.55653"
id="text1-9"><tspan
id="tspan1-2"
style="font-size:2.82222px;stroke-width:0"
x="120.04948"
y="115.55653">Q</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="60.725674"
y="123.09805"
id="text5-7-3"><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="60.725674"
y="123.09805"
id="tspan7-2">relative</tspan><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="60.725674"
y="125.74389"
id="tspan8">point origins</tspan></text>
<g
id="path9-0-6-0">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 52.474609,116.2832 -0.121093,0.15625 5.46875,4.24414 0.121093,-0.1582 z"
id="path64" />
<g
id="g63">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 52.089844,116.10742 0.695312,1.45117 0.251953,-0.12109 -0.453125,-0.94531 1.027344,0.20508 0.05469,-0.27539 z"
id="path63" />
</g>
</g>
<g
id="path9-0-6-2">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 61.380859,116.40234 -1.080078,4.24414 0.191406,0.0488 1.080079,-4.24414 z"
id="path66" />
<g
id="g65">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 61.578125,116.02734 -1.050781,1.2168 0.210937,0.18359 0.685547,-0.79492 0.222656,1.02539 0.273438,-0.0586 z"
id="path65" />
</g>
</g>
<g
id="path9-0-6-8">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 67.429687,116.48633 -4.455078,4.11133 0.134766,0.14648 4.453125,-4.11133 z"
id="path68" />
<g
id="g67">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 67.798828,116.2793 -1.544922,0.44726 0.07813,0.26953 1.007813,-0.29101 -0.371094,0.98047 0.261719,0.0976 z"
id="path67" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,243 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.326942mm"
height="21.466148mm"
viewBox="0 0 96.326942 21.466148"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow-4-6-5"
refX="0"
refY="0"
orient="auto-start-reverse"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-0-2-6" />
</marker>
</defs>
<g
id="layer1"
transform="translate(-25.532292,-131.57026)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-4-6-5)"
d="M 25.532292,149.11196 H 118.52973"
id="path4-5-0" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 38.816843,148.07189 v 2.08013"
id="path7-68-2" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 38.816843,132.79772 v 15.06402"
id="path2-2-7-4-1" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 106.5445,132.85104 v 15.0107"
id="path2-2-1-5-6-4" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 50.679452,137.04534 v 10.81639"
id="path2-2-4-4-9-8-6" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="M 50.679451,148.07188 V 150.152"
id="path2-5-4-7-5-3" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 61.180332,141.0677 v 6.88446"
id="path2-2-4-4-9-8-3-4" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 106.5445,148.07189 v 2.08013"
id="path2-5-7-5-2-5" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.297823;stroke-dasharray:1.19129, 0.297823;stroke-dashoffset:0;stroke-opacity:1"
d="m 68.596164,145.03322 v 2.82852"
id="path2-2-1-5-6-6-3" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="M 68.596164,148.07187 V 150.152"
id="path2-5-7-5-2-1-7" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="49.774212"
y="152.78926"
id="text2-8-5-1"><tspan
id="tspan2-6-7-2"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="49.774212"
y="152.78926">B</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="37.943703"
y="152.78926"
id="text2-8-7-4-7"><tspan
id="tspan2-6-4-4-6"
style="font-size:2.46944px;fill:#000000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="37.943703"
y="152.78926">A</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="104.35661"
y="152.54927"
id="text2-2-2-3-0-1"><tspan
id="tspan2-9-6-28-2-4"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="104.35661"
y="152.54927">qp2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="85.873619"
y="144.83266"
id="text2-2-7-4-6-4-0"><tspan
id="tspan2-9-0-9-4-4-0"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="85.873619"
y="144.83266">qD</tspan></text>
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 68.55992,145.88757 h 37.43781"
id="path53-6" />
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 68.55995,145.77218 v 0.23046 h 37.4375 v -0.23046 z"
id="path54-0" />
<g
id="g52-4"
transform="translate(-0.34825269,41.850296)">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9" />
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="60.453445"
y="152.78926"
id="text2-8-5-8-6"><tspan
id="tspan2-6-7-4-02"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="60.453445"
y="152.78926">C</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="67.676758"
y="152.75911"
id="text2-8-5-8-3-2"><tspan
id="tspan2-6-7-4-0-9"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="67.676758"
y="152.75911">D</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="119.70123"
y="152.83142"
id="text1-9-2"><tspan
id="tspan1-2-9"
style="font-size:2.82222px;stroke-width:0"
x="119.70123"
y="152.83142">Q</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="82.138161"
y="140.82449"
id="text2-2-7-4-6-4-0-7"><tspan
id="tspan2-9-0-9-4-4-0-4"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="82.138161"
y="140.82449">qC</tspan></text>
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="M 68.527082,141.87939 H 105.96489"
id="path53-6-8" />
<path
style="color:#000000;fill:#d40000;stroke-width:1;-inkscape-stroke:none"
d="m 61.11878,141.764 v 0.23046 h 44.84583 V 141.764 Z"
id="path54-0-4" />
<g
id="g52-4-1"
transform="translate(-0.38109056,37.84212)">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9-4" />
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="76.910576"
y="136.98802"
id="text2-2-7-4-6-4-0-7-1"><tspan
id="tspan2-9-0-9-4-4-0-4-4"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="76.910576"
y="136.98802">qB</tspan></text>
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="M 68.593228,138.04292 H 106.03104"
id="path53-6-8-9" />
<path
style="color:#000000;fill:#d40000;stroke-width:1;-inkscape-stroke:none"
d="m 50.60159,137.92753 v 0.23046 h 55.42917 v -0.23046 z"
id="path54-0-4-2" />
<g
id="g52-4-1-6"
transform="translate(-0.31494473,34.005647)">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9-4-7" />
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="70.909393"
y="133.08542"
id="text2-2-7-4-6-4-0-7-16"><tspan
id="tspan2-9-0-9-4-4-0-4-6"
style="font-size:2.11667px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="70.909393"
y="133.08542">qA</tspan></text>
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="M 68.659374,134.00802 H 106.09718"
id="path53-6-8-1" />
<path
style="color:#000000;fill:#d40000;stroke-width:1;-inkscape-stroke:none"
d="m 38.629199,134.02493 v 0.23046 h 67.467711 v -0.23046 z"
id="path54-0-4-0" />
<g
id="g52-4-1-9"
transform="translate(-0.24879868,29.970751)">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9-4-4" />
</g>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="M 61.180335,148.07187 V 150.152"
id="path2-5-7-5-2-1-7-3" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,462 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="96.122437mm"
height="35.44648mm"
viewBox="0 0 96.122437 35.44648"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1">
<marker
style="overflow:visible"
id="DartArrow-4-6-5-5"
refX="0"
refY="0"
orient="auto-start-reverse"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
preserveAspectRatio="xMidYMid">
<path
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
transform="scale(-0.5)"
id="path6-0-2-6-0" />
</marker>
</defs>
<g
id="layer1"
transform="translate(-25.146041,-171.9546)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#DartArrow-4-6-5-5)"
d="m 25.14604,192.36757 h 92.99744"
id="path4-5-0-6" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 38.430591,191.3275 v 2.08013"
id="path7-68-2-1" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 53.468201,191.32749 v 2.08012"
id="path2-5-4-7-5-3-6" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 98.901598,191.32748 v 2.08013"
id="path2-5-7-5-2-1-7-6" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="51.997147"
y="196.13815"
id="text2-8-5-1-9"><tspan
id="tspan2-6-7-2-9"
style="font-size:2.46944px;fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="51.997147"
y="196.13815">F0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#eeb000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="36.820873"
y="196.13815"
id="text2-8-7-4-7-2"><tspan
id="tspan2-6-4-4-6-7"
style="font-size:2.46944px;fill:#eeb000;fill-opacity:1;stroke:#279b14;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.818182"
x="36.820873"
y="196.13815">K0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="106.03098"
y="195.88976"
id="text2-2-2-3-0-1-2"><tspan
id="tspan2-9-6-28-2-4-2"
style="font-size:2.46944px;fill:#d40000;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="106.03098"
y="195.88976">high</tspan></text>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 108.64149,191.3275 v 2.08013"
id="path2-5-7-5-2-5-5" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 89.161704,191.29385 v 2.08013"
id="path2-5-7-5-2-5-5-1" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#0000df;fill-opacity:1;stroke:#0000e1;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.0666667"
x="87.016014"
y="196.13513"
id="text2-2-2-3-0-1-2-3"><tspan
id="tspan2-9-6-28-2-4-2-0"
style="font-size:2.46944px;fill:#0000df;fill-opacity:1;stroke:#0000e1;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.0666667"
x="87.016014"
y="196.13513">low</tspan></text>
<path
style="color:#000000;fill:#d40000;stroke-width:0.999998;-inkscape-stroke:none"
d="m 98.979131,185.79123 v 0.23046 h 9.280659 v -0.23046 z"
id="path54-0-8" />
<g
id="g52-4-2"
transform="translate(1.9140822,81.868415)">
<path
style="color:#000000;fill:#d40000;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9-2" />
</g>
<path
style="color:#000000;fill:#0000df;fill-opacity:1;stroke-width:0.999998;-inkscape-stroke:none"
d="m 98.783113,185.79123 v 0.23046 h -9.280648 v -0.23046 z"
id="path54-0-8-6" />
<g
id="g52-4-2-4"
transform="matrix(-1,0,0,1,195.84815,81.868375)"
style="fill:#0000df;fill-opacity:1">
<path
style="color:#000000;fill:#0000df;fill-opacity:1;-inkscape-stroke:none"
d="m 105.14844,103.19922 -0.14649,0.29101 1.09375,0.54688 -1.09375,0.54687 0.14649,0.29297 1.67773,-0.83984 z"
id="path52-9-2-0" />
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="59.218128"
y="196.14961"
id="text2-8-5-8-6-8"><tspan
id="tspan2-6-7-4-02-5"
style="font-size:2.46944px;fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="59.218128"
y="196.14961">C0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="96.399002"
y="196.1496"
id="text2-8-5-8-6-8-7"><tspan
id="tspan2-6-7-4-02-5-6"
style="font-size:2.46944px;fill:#eeb000;fill-opacity:1;stroke:#0000e0;stroke-width:0;stroke-dasharray:none;stroke-opacity:0.607843"
x="96.399002"
y="196.1496">REF</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.46944px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#09ad00;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="97.205673"
y="199.62463"
id="text2-8-5-8-3-2-0"><tspan
id="tspan2-6-7-4-0-9-9"
style="font-size:2.46944px;fill:#09ad00;fill-opacity:1;stroke:#d40000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1"
x="97.205673"
y="199.62463">ref</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.82222px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#000000;stroke:#000000;stroke-width:0"
x="119.31499"
y="196.08676"
id="text1-9-2-9"><tspan
id="tspan1-2-9-6"
style="font-size:2.82222px;stroke-width:0"
x="119.31499"
y="196.08676">T</tspan></text>
<path
style="fill:#000000;stroke:#000000;stroke-width:0.381298;stroke-dasharray:none"
d="m 60.794083,191.32748 v 2.08013"
id="path2-5-7-5-2-1-7-3-0" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 60.794083,181.33872 v 9.69079"
id="path2-2-4-4-9-8-3-4-1" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 108.64149,184.79985 v 6.22965"
id="path2-2-4-4-9-8-3-4-1-8" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298002;stroke-dasharray:1.192, 0.298002;stroke-dashoffset:0;stroke-opacity:1"
d="M 98.901599,173.60046 V 191.0295"
id="path2-2-4-4-9-8-3-4-1-89" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 89.161704,184.70631 v 6.32319"
id="path2-2-4-4-9-8-3-4-1-89-0" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 38.430591,173.2939 v 17.73561"
id="path2-2-4-4-9-8-3-4-1-2" />
<path
style="fill:#000000;stroke:#a4a4a4;stroke-width:0.298001;stroke-dasharray:1.192, 0.298001;stroke-dashoffset:0;stroke-opacity:1"
d="m 53.468201,177.40986 v 13.61965"
id="path2-2-4-4-9-8-3-4-1-23" />
<g
id="path10">
<path
style="color:#000000;fill:#ffbf00;fill-opacity:0.0156863;stroke-dasharray:0.46, 0.23;-inkscape-stroke:none"
d="M 38.540264,189.14302 H 60.354043"
id="path80" />
<path
style="color:#000000;fill:#eeb000;stroke-dasharray:0.46, 0.23;-inkscape-stroke:none"
d="m 38.541016,189.02734 v 0.23047 H 39 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691407,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689454,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689454,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691407,0 v 0.23047 H 56.25 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.423829 v -0.23047 z"
id="path81" />
<g
id="g79">
<path
style="color:#000000;fill:#eeb000;-inkscape-stroke:none"
d="m 59.162109,188.30664 -0.146484,0.29102 1.089844,0.54492 -1.089844,0.54492 0.146484,0.29102 1.669922,-0.83594 z"
id="path79" />
</g>
</g>
<g
id="path10-3">
<path
style="color:#000000;fill:#ffbf00;fill-opacity:0.0156863;stroke-dasharray:0.46, 0.230001;-inkscape-stroke:none"
d="m 60.932133,189.14303 h 37.77522"
id="path83" />
<path
style="color:#000000;fill:#eeb000;stroke-dasharray:0.46, 0.230001;-inkscape-stroke:none"
d="m 60.931641,189.02734 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689454,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691407,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 H 73.8125 v -0.23047 z m 0.691407,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689454,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689454,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691407,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 H 91.0625 v -0.23047 z m 0.691407,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460937 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458985 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689454,0 v 0.23047 h 0.460937 v -0.23047 z m 0.691406,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.458984 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z m 0.689453,0 v 0.23047 h 0.460938 v -0.23047 z"
id="path84" />
<g
id="g82">
<path
style="color:#000000;fill:#eeb000;-inkscape-stroke:none"
d="m 97.515625,188.30664 -0.146484,0.29102 1.089843,0.54492 -1.089843,0.54492 0.146484,0.29102 1.669922,-0.83594 z"
id="path82" />
</g>
</g>
<g
id="path10-7"
transform="translate(0,0.37033)">
<path
style="color:#000000;fill:#ffbf00;fill-opacity:0.0156863;stroke-dasharray:0.46, 0.23;-inkscape-stroke:none"
d="M 60.715697,185.53631 H 53.875104"
id="path77" />
<path
style="color:#000000;fill:#eeb000;stroke-dasharray:0.46, 0.23;-inkscape-stroke:none"
d="m 54.044922,185.42187 v 0.22852 h 0.460937 v -0.22852 z m 0.691406,0 v 0.22852 h 0.458984 v -0.22852 z m 0.689453,0 v 0.22852 h 0.458985 v -0.22852 z m 0.689453,0 v 0.22852 h 0.460938 v -0.22852 z m 0.691407,0 v 0.22852 h 0.458984 v -0.22852 z m 0.689453,0 v 0.22852 h 0.458984 v -0.22852 z m 0.689453,0 v 0.22852 h 0.460937 v -0.22852 z m 0.689453,0 v 0.22852 h 0.460937 v -0.22852 z m 0.691406,0 v 0.22852 h 0.458985 v -0.22852 z m 0.689453,0 v 0.22852 h 0.458985 v -0.22852 z"
id="path78" />
<g
id="g76">
<path
style="color:#000000;fill:#eeb000;-inkscape-stroke:none"
d="m 55.066406,184.70117 -1.669922,0.83594 1.669922,0.83398 0.146485,-0.29101 -1.089844,-0.54492 1.089844,-0.54297 z"
id="path76" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="67.405975"
y="181.39328"
id="text2-2-7-49-5-3-2-6-8"><tspan
id="tspan2-9-0-96-4-1-8-8-5"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="67.405975"
y="181.39328">ref.quantity_from_zero()</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="58.698536"
y="177.26396"
id="text2-2-7-49-5-3-2-6-8-0"><tspan
id="tspan2-9-0-96-4-1-8-8-5-1"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="58.698536"
y="177.26396">ref.in(deg_F).quantity_from_zero()</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';mix-blend-mode:normal;fill:#a4a4a4;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
x="53.553532"
y="173.49559"
id="text2-2-7-49-5-3-2-6-8-0-2"><tspan
id="tspan2-9-0-96-4-1-8-8-5-1-6"
style="font-size:2.11667px;fill:#a4a4a4;fill-opacity:1;stroke-width:0;stroke-dasharray:none"
x="53.553532"
y="173.49559">ref.in(K).quantity_from_zero()</tspan></text>
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;-inkscape-stroke:none"
d="M 96.795779,182.45468 H 108.41217"
id="path59-4" />
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;stroke-width:1;-inkscape-stroke:none"
d="m 60.875675,182.23658 v 0.25 h 37.435374 v -0.25 z"
id="path60-2" />
<g
id="g58-4"
transform="translate(-8.013114,83.289212)">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 105.0293,98.164062 -0.15821,0.316407 1.1836,0.591797 -1.1836,0.591796 0.15821,0.316407 1.81445,-0.908203 z"
id="path58-3" />
</g>
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;stroke-width:0.999998;-inkscape-stroke:none"
d="m 53.529259,178.23299 v 0.25 h 44.82539 v -0.25 z"
id="path60-2-4" />
<g
id="g58-4-1"
transform="translate(-7.9695261,79.285615)">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 105.0293,98.164062 -0.15821,0.316407 1.1836,0.591797 -1.1836,0.591796 0.15821,0.316407 1.81445,-0.908203 z"
id="path58-3-2" />
</g>
<path
style="color:#000000;fill:#a4a4a4;fill-opacity:0.960784;stroke-width:1;-inkscape-stroke:none"
d="m 38.454855,174.24041 v 0.25 h 59.979562 v -0.25 z"
id="path60-2-4-4" />
<g
id="g58-4-1-0"
transform="translate(-7.8897477,75.293022)">
<path
style="color:#000000;fill:#a4a4a4;-inkscape-stroke:none"
d="m 105.0293,98.164062 -0.15821,0.316407 1.1836,0.591797 -1.1836,0.591796 0.15821,0.316407 1.81445,-0.908203 z"
id="path58-3-2-1" />
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="107.69614"
y="179.50262"
id="text5-4"><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="107.69614"
y="179.50262"
id="tspan6-5">origin doesn't</tspan><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="107.69614"
y="182.14847"
id="tspan74">change</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="38.430073"
y="204.1608"
id="text5-7-4"><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="38.430073"
y="204.1608"
id="tspan4-0">absolute</tspan><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="38.430073"
y="206.80664"
id="tspan7-5">point origin</tspan></text>
<g
id="path9-0-6-5"
transform="translate(-0.62311928,81.062942)">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 38.974609,116.68945 -0.08789,4.44141 0.199218,0.004 0.08594,-4.44141 z"
id="path62-8" />
<g
id="g61-4">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 39.082031,116.2793 -0.748047,1.42383 0.248047,0.13085 0.488281,-0.92773 0.449219,0.94531 0.253906,-0.11914 z"
id="path61-9" />
</g>
</g>
<text
xml:space="preserve"
style="font-weight:bold;font-size:2.11667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.298;stroke-miterlimit:4;stroke-dasharray:1.192, 0.298;stroke-dashoffset:0;stroke-opacity:0"
x="79.547623"
y="204.1608"
id="text5-7-3-4"><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="79.547623"
y="204.1608"
id="tspan7-2-3">relative</tspan><tspan
style="font-size:2.11667px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.298"
x="79.547623"
y="206.80664"
id="tspan8-0">point origins</tspan></text>
<g
id="path9-0-62-3"
transform="matrix(-0.88043225,-0.34268112,0.34149681,-0.88348559,74.3932,292.94917)"
style="stroke-width:1.05711">
<g
id="path74-6">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="M 55.543497,87.783264 34.863524,88.174435"
id="path86" />
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 55.541016,87.677734 -20.679688,0.390625 0.0039,0.210938 20.679688,-0.390625 z"
id="path87" />
<g
id="g85">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 54.433594,87.037109 -0.128907,0.269532 1.009766,0.480468 -0.990234,0.519532 0.138672,0.265625 1.521484,-0.796875 z"
id="path85" />
</g>
</g>
</g>
<g
id="path74-6-5">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 63.088004,196.09182 12.447609,6.08624"
id="path89" />
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 63.132812,196.00195 -0.08789,0.17969 12.447265,6.08594 0.08789,-0.17969 z"
id="path90" />
<g
id="g88">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 64.337891,195.89453 -1.623047,0.0137 0.986328,1.29102 0.224609,-0.17188 -0.642578,-0.83984 1.058594,-0.01 z"
id="path88" />
</g>
</g>
<g
id="path74-6-9">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 95.737262,196.18309 -11.593285,7.11523"
id="path92" />
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 95.685547,196.09766 -11.59375,7.11523 0.103515,0.16992 11.59375,-7.11523 z"
id="path93" />
<g
id="g91">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 96.091797,195.96484 -1.617188,0.14063 0.02344,0.2832 1.05664,-0.0918 -0.560546,0.89844 0.240234,0.14844 z"
id="path91" />
</g>
</g>
<circle
style="fill:#09ad00;fill-opacity:1;stroke:none;stroke-width:0.2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path75"
cx="98.909256"
cy="185.9398"
r="0.49345818" />
<g
id="path9-0-62"
transform="matrix(-0.88043226,-0.34268111,0.34149681,-0.88348558,112.41926,270.70219)"
style="stroke-width:1.05711">
<g
id="path74">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 45.118218,79.121239 -2.044871,4.333544"
id="path95" />
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="M 45.023437,79.076172 42.978516,83.410156 43.169922,83.5 45.212891,79.166016 Z"
id="path96" />
<g
id="g94">
<path
style="color:#000000;fill:#000000;-inkscape-stroke:none"
d="m 45.306641,78.722656 -1.351563,1.0625 0.185547,0.234375 0.880859,-0.691406 0.02539,1.119141 0.298828,-0.0078 z"
id="path94" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -3,13 +3,16 @@
The affine space has two types of entities: The affine space has two types of entities:
- **_Point_** - a position specified with coordinate values (e.g., location, address, etc.) - **_Point_** - a position specified with coordinate values (e.g., location, address, etc.)
- **_Vector_** - the difference between two points (e.g., shift, offset, displacement, duration, etc.) - **_Displacement vectors_** - the difference between two points (e.g., shift, offset,
displacement, duration, etc.)
In the following subchapters, we will often refer to _displacement vectors_ simply as _vectors_ for
brevity.
!!! note !!! note
The _Vector_ described here is specific to the affine space theory and is not the same thing The _displacement vector_ described here is specific to the affine space theory and is not the same
as the quantity of a vector character that we discussed in the thing as the quantity of a vector character that we discussed in the
["Scalars, vectors, and tensors" chapter](character_of_a_quantity.md#scalars-vectors-and-tensors) ["Scalars, vectors, and tensors" chapter](character_of_a_quantity.md#scalars-vectors-and-tensors)
(although, in some cases, those terms may overlap). (although, in some cases, those terms may overlap).
@ -18,24 +21,24 @@ The affine space has two types of entities:
Here are the primary operations one can do in the affine space: Here are the primary operations one can do in the affine space:
- _Vector_ + _Vector_ -> _Vector_ - _vector_ + _vector_ -> _vector_
- _Vector_ - _Vector_ -> _Vector_ - _vector_ - _vector_ -> _vector_
- -_Vector_ -> _Vector_ - -_vector_ -> _vector_
- _Vector_ * Scalar -> _Vector_ - _vector_ * scalar -> _vector_
- Scalar * _Vector_ -> _Vector_ - scalar * _vector_ -> _vector_
- _Vector_ / Scalar -> _Vector_ - _vector_ / scalar -> _vector_
- _Point_ - _Point_ -> _Vector_ - _point_ - _point_ -> _vector_
- _Point_ + _Vector_ -> _Point_ - _point_ + _vector_ -> _point_
- _Vector_ + _Point_ -> _Point_ - _vector_ + _point_ -> _point_
- _Point_ - _Vector_ -> _Point_ - _point_ - _vector_ -> _point_
!!! important !!! important
It is not possible to: It is not possible to:
- add two _Points_, - add two _points_,
- subtract a _Point_ from a _Vector_, - subtract a _point_ from a _vector_,
- multiply nor divide _Points_ with anything else. - multiply nor divide _points_ with anything else.
## _Points_ are more common than most of us imagine ## _Points_ are more common than most of us imagine
@ -55,7 +58,7 @@ more popular in the products we implement. They can be used to implement:
Improving the affine space's _Points_ intuition will allow us to write better and safer software. Improving the affine space's _Points_ intuition will allow us to write better and safer software.
## _Vector_ is modeled by `quantity` ## _Displacement vector_ is modeled by `quantity`
Up until now, each time we used a `quantity` in our code, we were modeling some kind of a Up until now, each time we used a `quantity` in our code, we were modeling some kind of a
difference between two things: difference between two things:
@ -64,15 +67,15 @@ difference between two things:
- _duration_ between two time points, - _duration_ between two time points,
- the difference in _speed_ (even if relative to zero). - the difference in _speed_ (even if relative to zero).
As we already know, a `quantity` type provides all operations required for a _Vector_ type in As we already know, a `quantity` type provides all operations required for a _displacement vcector_
the affine space. abstraction in an affine space.
## _Point_ is modeled by `quantity_point` and `PointOrigin` ## _Point_ is modeled by `quantity_point` and `PointOrigin`
In the **mp-units** library the _Point_ abstraction is modelled by: In the **mp-units** library, the _Point_ abstraction is modelled by:
- [`PointOrigin` concept](concepts.md#PointOrigin) that specifies measurement origin, - [`PointOrigin` concept](concepts.md#PointOrigin) that specifies measurement origin, and
- `quantity_point` class template that specifies a _Point_ relative to a specific predefined origin. - `quantity_point` class template that specifies a _Point_ relative to a specific predefined origin.
@ -90,125 +93,119 @@ class quantity_point;
As we can see above, the `quantity_point` class template exposes one additional parameter compared As we can see above, the `quantity_point` class template exposes one additional parameter compared
to `quantity`. The `PO` parameter satisfies a [`PointOriginFor` concept](concepts.md#PointOriginFor) to `quantity`. The `PO` parameter satisfies a [`PointOriginFor` concept](concepts.md#PointOriginFor)
and specifies the origin of our measurement scale. By default, it is initialized with a quantity's and specifies the origin of our measurement scale.
zeroth point using the following rules:
Each `quantity_point` internally stores a `quantity` object, which represents a _displacement vector_
from the predefined origin. Thanks to this, an instantiation of a `quantity_point` can be considered
as a model of a vector space from such an origin.
Forcing the user to manually predefine an origin for every domain may be cumbersome and discourage
users from using such abstractions at all. This is why, by default, the `PO` template
parameter is initialized with the `default_point_origin(R)` that provides the quantity points'
scale zeroth point using the following rules:
- if the measurement unit of a quantity specifies its point origin in its definition - if the measurement unit of a quantity specifies its point origin in its definition
(e.g., degree Celsius), then this point is being used, (e.g., degree Celsius), then this point is being used,
- otherwise, an instantiation of `zeroth_point_origin<QuantitySpec>` is being used which - otherwise, an instantiation of `zeroth_point_origin<QuantitySpec>` is being used which
provides a zeroth point for a specific quantity type. provides a well-established zeroth point for a specific quantity type.
!!! tip !!! tip
The `quantity_point` definition can be found in the `mp-units/quantity_point.h` header file. The `quantity_point` definition can be found in the `mp-units/quantity_point.h` header file.
### Implicit point origin #### `zeroth_point_origin<QuantitySpec>`
Let's assume that Alice goes for a trip driving a car. She likes taking notes about interesting `zeroth_point_origin<QuantitySpec>` is meant to be used in cases where the specific domain has
places that she visits on the road. For every such item, she writes down: a well-established, non-controversial zeroth point on the measurement scale. This saves the user
from the need to write a boilerplate code that would predefine such a type for such a domain.
- its name, ![affine_space_1](affine_space_1.svg){style="width:80%;display: block;margin: 0 auto;"}
- a readout from the car's odometer at the location,
- a current timestamp.
We can implement this in the following way:
```cpp ```cpp
using std::chrono::system_clock; quantity_point<isq::distance[si::metre]> qp1{100 * m};
quantity_point<isq::distance[si::metre]> qp2{120 * m};
struct trip_log_item { assert(qp1.quantity_from_zero() == 100 * m);
std::string name; assert(qp2.quantity_from_zero() == 120 * m);
quantity_point<isq::distance[km]> odometer;
quantity_point<si::second> timestamp; assert(qp2 - qp1 == 20 * m);
}; assert(qp1 - qp2 == -20 * m);
using trip_log = std::vector<trip_log_item>;
// auto res = qp1 + qp2; // Compile-time error
``` ```
In the above code `100 * m` and `120 * m` still create two quantities that serve as _displacement
vectors_ here. Quantity point objects can be explicitly constructed from such quantities only when
their origin is an instantiation of the `zeroth_point_origin<QuantitySpec>`.
It is really important to understand that even though we can use `.quantity_from_zero()` to obtain
the _displacement vector_ of a point from the origin, the point by itself does not represent or have
any associated physical value. It is just a point in some space. The same point can be expressed
with different _displacement vectors_ from different origins.
It is also worth mentioning that simplicity comes with a safety cost here. For some users, it
might be surprising that the usage of `zeroth_point_origin<QuantitySpec>` makes various quantity
point objects compatible as long as quantity types used in the origin and reference are
compatible:
```cpp ```cpp
trip_log log; quantity_point<si::metre> qp1{isq::distance(100 * m)};
quantity_point<si::metre> qp2{isq::height(120 * m)};
quantity_point timestamp_1{quantity{system_clock::now().time_since_epoch()}}; assert(qp2 - qp1 == 20 * m);
log.emplace_back("home", quantity_point{1356 * km}, timestamp_1); assert(qp1 - qp2 == -20 * m);
// some time passes
quantity_point timestamp_2{quantity{system_clock::now().time_since_epoch()}};
log.emplace_back("castle", quantity_point{1401 * km}, timestamp_2);
``` ```
This is an excellent example of where points are helpful. There is no doubt about the correctness
of their usage in this scenario:
- adding two odometer readouts or two timestamps have no physical sense, and that is why we will ### Absolute _point_ origin
expect a compile-time error when we try to perform such operations accidentally,
- subtracting two odometer readouts or timestamps is perfectly valid and results in a quantity
storing the interval value between the two points.
Having such a database, we can print the trip log in the following way: In cases where we want to implement an isolated independent space in which points are not compatible
with other spaces, even of the same quantity type, we should manually predefine an absolute point
origin.
![affine_space_2](affine_space_2.svg){style="width:80%;display: block;margin: 0 auto;"}
```cpp ```cpp
for (const auto& item : log) { inline constexpr struct origin : absolute_point_origin<origin, isq::distance> {} origin;
std::cout << "POI: " << item.name << "\n";
std::cout << "- Distance from home: " << item.odometer - log.front().odometer << "\n"; // quantity_point<si::metre, origin> qp1{100 * m}; // Compile-time error
std::cout << "- Trip duration from start: " << (item.timestamp - log.front().timestamp).in(non_si::minute) << "\n"; // quantity_point<si::metre, origin> qp2{120 * m}; // Compile-time error
} quantity_point<si::metre, origin> qp1 = origin + 100 * m;
quantity_point<si::metre, origin> qp2 = 120 * m + origin;
// assert(qp1.quantity_from_zero() == 100 * m); // Compile-time error
// assert(qp2.quantity_from_zero() == 120 * m); // Compile-time error
assert(qp1.quantity_from(origin) == 100 * m);
assert(qp2.quantity_from(origin) == 120 * m);
assert(qp1 - origin == 100 * m);
assert(qp2 - origin == 120 * m);
assert(origin - qp1 == -100 * m);
assert(origin - qp2 == -120 * m);
assert(qp2 - qp1 == 20 * m);
``` ```
Moreover, if Alice had reset the car's trip odometer before leaving home, we could have rewritten This time, we can't construct a quantity point from any quantity. In order to prevent potential safety
one of the previous lines like that: issues, when a custom point origin is being used, we always need to provide its object in
an expression that results in a quantity point instantiation.
!!! info
A rationale for this longer construction syntax can be found in the
[Why can't I create a quantity by passing a number to a constructor?](../../getting_started/faq.md#why-cant-i-create-a-quantity-by-passing-a-number-to-a-constructor)
chapter.
Similarly to [creation of a quantity](../../getting_started/quick_start.md#creating-a-quantity),
if someone does not like the operator-based syntax to create a `quantity_point`, the same results
can be achieved with a two-parameter constructor:
```cpp ```cpp
std::cout << "Distance from home: " << item.odometer.quantity_from_zero() << "\n"; quantity_point qp1{100 * m, origin};
``` ```
The above always returns a quantity measured from the "ultimate" zeroth point of a scale used for Again, CTAD always helps to use precisely the type we need in a current case.
this specific quantity type.
!!! tip
Storing _Points_ is the most efficient representation we can choose in this scenario:
- to store a value, we read it directly from the instrument, and no additional transformation
is needed,
- to print the absolute value (e.g., odometer), we have the value available right away,
- to get any relative quantity (e.g., distance from the start, distance from the previous point,
etc.), we have to perform a single subtraction operation.
If we stored _Vectors_ in our database instead, we would have to pay at runtime for additional
operations:
- to store a quantity, we would have to perform the subtraction right away to get the interval
between the current value and some reference point,
- to print the absolute value, we would have to add the quantity to the reference point that
we need to store somewhere in the database as well,
- to get a relative quantity, only the currently stored one is immediate; all other values
will require at least one quantity addition operation.
Now, let's assume that Bob, a friend of Alice, also keeps a log of his trips but he, of
course, measures distances from his own home with the odometer in his car. Everything is fine as
long as we deal with one trip at a time, but if we start to work with both at once, we may
accidentally subtract points from different trips. The library will not prevent
us from doing so.
The points from Alice's and Bob's trips should be considered separate, and to enforce it at
compilation time, we need to introduce explicit origins.
### Absolute _Point_ origin
The **absolute point origin** specifies the "zero" of our measurement's scale. User can
specify such an origin by deriving from the `absolute_point_origin` class template:
```cpp
enum class actor { alice, bob };
template<actor A>
struct zeroth_odometer_t : absolute_point_origin<zeroth_odometer_t<A>, isq::distance> {};
template<actor A>
inline constexpr zeroth_odometer_t<A> zeroth_odometer;
```
!!! info !!! info
@ -225,212 +222,148 @@ inline constexpr zeroth_odometer_t<A> zeroth_odometer;
- we can't define the above in one line of code, - we can't define the above in one line of code,
- provide the same identifier for a class and variable template. - provide the same identifier for a class and variable template.
Odometer is not the only one that can get an explicit point origin in our case. As timestamps are Finally, please note that it is not allowed to subtract two point origins defined in terms of
provided by the `std::chrono::system_clock`, their values are always relative to the epoch of this `absolute_point_origin` (e.g., `origin - origin`) as those do not contain information about the
clock. unit, so we cannot determine a resulting `quantity` type.
!!! note Absolute point origins are also perfect for establishing independent spaces even if the same quantity
type and unit is being used:
The **mp-units** library provides means to specify ![affine_space_3](affine_space_3.svg){style="width:80%;display: block;margin: 0 auto;"}
[interoperability with other units libraries](../use_cases/interoperability_with_other_libraries.md).
It also has built-in compatibility with `std::chrono` types, so users do not have to define
interoperability traits or point origins for such types by themselves. Those are already
provided in the `mp-units/systems/si/chrono.h` header file.
Now, we can refactor our database to benefit from the explicit points:
```cpp ```cpp
template<actor A> inline constexpr struct origin1 : absolute_point_origin<origin1, isq::distance> {} origin1;
struct trip_log_item { inline constexpr struct origin2 : absolute_point_origin<origin2, isq::distance> {} origin2;
std::string point_name;
quantity_point<si::kilo<si::metre>, zeroth_odometer<A>> odometer;
quantity_point<si::second, chrono_point_origin<system_clock>> timestamp;
};
template<actor A> quantity_point qp1 = origin1 + 100 * m;
using trip_log = std::vector<trip_log_item<A>>; quantity_point qp2 = origin2 + 120 * m;
assert(qp1.quantity_from(origin1) == 100 * m);
assert(qp2.quantity_from(origin2) == 120 * m);
assert(qp1 - origin1 == 100 * m);
assert(qp2 - origin2 == 120 * m);
assert(origin1 - qp1 == -100 * m);
assert(origin2 - qp2 == -120 * m);
// assert(qp2 - qp1 == 20 * m); // Compile-time error
// assert(qp1 - origin2 == 100 * m); // Compile-time error
// assert(qp2 - origin1 == 120 * m); // Compile-time error
// assert(qp1.quantity_from(origin2) == 100 * m); // Compile-time error
// assert(qp2.quantity_from(origin1) == 120 * m); // Compile-time error
``` ```
We also need to update the initialization part in our code. In the case of implicit zeroth origins,
we could construct `quantity_point` directly from the value of a `quantity`. This is no longer
the case.
As a _Point_ can be represented with a _Vector_ from the origin, to improve the safety of the code
we write, a `quantity_point` class template must be created with one of the following operations:
```cpp
quantity_point qp1 = zeroth_odometer<actor::alice> + 1356 * km;
quantity_point qp2 = 1356 * km + zeroth_odometer<actor::alice>;
quantity_point qp3 = zeroth_odometer<actor::alice> - 1356 * km;
```
Although, the `qp3` above does not have a physical sense in this specific scenario.
!!! note
[It is not allowed to subtract a _Point_ from a _Vector_](#operations-in-the-affine-space)
thus `1356 * km - zeroth_odometer<actor::alice>` is an invalid operation.
!!! info
A rationale for this longer construction syntax can be found in the
[Why can't I create a quantity by passing a number to a constructor?](../../getting_started/faq.md#why-cant-i-create-a-quantity-by-passing-a-number-to-a-constructor)
chapter.
Similarly to [creation of a quantity](../../getting_started/quick_start.md#creating-a-quantity),
if someone does not like the operator-based syntax to create a `quantity_point`, the same results
can be achieved with a two-parameter constructor:
```cpp
quantity_point qp4{1356 * km, zeroth_odometer<actor::alice>};
```
Also, as now our timestamps have a proper point origin provided in a type, we can simplify the
previous code by directly converting `std::chrono::time_point` to our `quantity_point` type.
With all the above, we can refactor our initialization part to the following:
```cpp
trip_log<actor::alice> alice_log;
alice_log.emplace_back("home", zeroth_odometer<actor::alice> + 1356 * km, system_clock::now());
// some time passes
alice_log.emplace_back("castle", zeroth_odometer<actor::alice> + 1401 * km, system_clock::now());
```
### _Point_ arithmetics
As another example, let's assume we will attend the CppCon conference hosted in Aurora, CO,
and we want to estimate the distance we will travel. We have to take a taxi to a local airport,
fly to DEN airport with a stopover in FRA, and, in the end, get a cab to the Gaylord Rockies
Resort & Convention Center:
```cpp
constexpr struct home : absolute_point_origin<home, isq::distance> {} home;
quantity_point<isq::distance[km], home> home_airport = home + 15 * km;
quantity_point<isq::distance[km], home> fra_airport = home_airport + 829 * km;
quantity_point<isq::distance[km], home> den_airport = fra_airport + 8115 * km;
quantity_point<isq::distance[km], home> cppcon_venue = den_airport + 10.1 * mi;
```
As we can see above, we can easily get a new point by adding a quantity to an origin or another
quantity point.
If we want to find out the distance traveled between two points, we simply subtract them:
```cpp
quantity<isq::distance[km]> total = cppcon_venue - home;
quantity<isq::distance[km]> flight = den_airport - home_airport;
```
If we would like to find out the total distance traveled by taxi as well, we have to do a bit
more calculations:
```cpp
quantity<isq::distance[km]> taxi1 = home_airport - home;
quantity<isq::distance[km]> taxi2 = cppcon_venue - den_airport;
quantity<isq::distance[km]> taxi = taxi1 + taxi2;
```
Now, if we print the results:
```cpp
std::cout << "Total distance: " << total << "\n";
std::cout << "Flight distance: " << flight << "\n";
std::cout << "Taxi distance: " << taxi << "\n";
```
we will see the following output:
```text
Total distance: 8975.25 km
Flight distance: 8944 km
Taxi distance: 31.2544 km
```
!!! note
It is not allowed to subtract two point origins defined in terms of `absolute_point_origin`
(e.g., `home - home`) as those do not contain information about the unit, so we are not able
to determine a resulting `quantity` type.
### Relative _Point_ origin ### Relative _Point_ origin
We often do not have only one ultimate "zero" point when we measure things. We often do not have only one ultimate "zero" point when we measure things. Often, we have one
common scale, but we measure various quantities relative to different points and expect
those points to be compatible. There are many examples here, but probably the most common are
temperatures, timestamps, and altitudes.
For example, let's assume that we have the following absolute point origin: For such cases, relative point origins should be used:
![affine_space_4](affine_space_4.svg){style="width:80%;display: block;margin: 0 auto;"}
```cpp ```cpp
constexpr struct mean_sea_level : absolute_point_origin<mean_sea_level, isq::altitude> {} mean_sea_level; inline constexpr struct A : absolute_point_origin<A, isq::distance> {} A;
``` inline constexpr struct B : relative_point_origin<A + 10 * m> {} B;
inline constexpr struct C : relative_point_origin<B + 10 * m> {} C;
inline constexpr struct D : relative_point_origin<A + 30 * m> {} D;
If we want to model a trip to Mount Everest, measuring all daily hikes from the `mean_sea_level` quantity_point qp1 = C + 100 * m;
might not be efficient. We may know that we are not good climbers, so all our climbs can be quantity_point qp2 = D + 120 * m;
represented with an 8-bit integer type, allowing us to save memory in our database of climbs.
For this purpose, we can define a `relative_point_origin` in the following way: assert(qp1.quantity_ref_from(qp1.point_origin) == 100 * m);
assert(qp2.quantity_ref_from(qp2.point_origin) == 120 * m);
```cpp assert(qp1 - A == 120 * m);
constexpr struct everest_base_camp : relative_point_origin<mean_sea_level + 5364 * m> {} everest_base_camp; assert(qp1 - B == 110 * m);
``` assert(qp1 - C == 100 * m);
assert(qp1 - D == 90 * m);
assert(qp1.quantity_from(A) == 120 * m);
assert(qp1.quantity_from(B) == 110 * m);
assert(qp1.quantity_from(C) == 100 * m);
assert(qp1.quantity_from(D) == 90 * m);
The above can be used as an origin for subsequent _Points_: assert(qp2 - A == 150 * m);
assert(qp2 - B == 140 * m);
assert(qp2 - C == 130 * m);
assert(qp2 - D == 120 * m);
assert(qp2.quantity_from(A) == 150 * m);
assert(qp2.quantity_from(B) == 140 * m);
assert(qp2.quantity_from(C) == 130 * m);
assert(qp2.quantity_from(D) == 120 * m);
```cpp assert(qp2 - qp1 == 30 * m);
constexpr quantity_point first_climb_alt = everest_base_camp + isq::altitude(std::uint8_t{42} * m);
static_assert(first_climb_alt.quantity_from(everest_base_camp) == 42 * m); assert(B - A == 10 * m);
static_assert(first_climb_alt.quantity_from(mean_sea_level) == 5406 * m); assert(C - A == 20 * m);
static_assert(first_climb_alt.quantity_from_zero() == 5406 * m); assert(D - A == 30 * m);
assert(D - C == 10 * m);
``` ```
As we can see above, the `quantity_from()` member function returns a relative distance from the As we can see above, the `quantity_from()` member function returns a relative distance from the
provided point origin while the `quantity_from_zero()` returns the distance from the absolute point provided point origin while the `quantity_from_zero()` always returns the distance from the
origin. absolute point origin.
Also, please note that as long as we can't subtract two absolute point origins from each other,
it is possible to subtract relative ones or a relative and absolute one.
### Converting between different representations of the same _Point_ ### Converting between different representations of the same _point_
As we might represent the same _Point_ with _Vectors_ from various origins, the **mp-units** library As we might represent the same _point_ with _displacement vectors_ from various origins, the
provides facilities to convert the _Point_ to `quantity_point` class templates expressed in library provides facilities to convert the same _point_ to the `quantity_point` class templates
terms of origins relative to each other in the type system. expressed in terms of different origins.
For this purpose, we can use: ![affine_space_5](affine_space_5.svg){style="width:80%;display: block;margin: 0 auto;"}
- a converting constructor: For this purpose, we can use either:
- A converting constructor:
```cpp ```cpp
constexpr quantity_point<isq::altitude[m], mean_sea_level, int> qp = first_climb_alt; quantity_point<si::metre, C> qp2C = qp2;
static_assert(qp.quantity_ref_from(qp.point_origin) == 5406 * m); assert(qp2C.quantity_ref_from(qp2C.point_origin) == 130 * m);
``` ```
- a dedicated conversion interface: - A dedicated conversion interface:
```cpp ```cpp
constexpr quantity_point qp = first_climb_alt.point_for(mean_sea_level); quantity_point qp2B = qp2.point_for(B);
static_assert(qp.quantity_ref_from(qp.point_origin) == 5406 * m); quantity_point qp2A = qp2.point_for(A);
assert(qp2B.quantity_ref_from(qp2B.point_origin) == 140 * m);
assert(qp2A.quantity_ref_from(qp2A.point_origin) == 150 * m);
``` ```
It is important to understand that the point remains the same after such a translation
(all of them compare equal):
```cpp
assert(qp2 == qp2C);
assert(qp2 == qp2B);
assert(qp2 == qp2A);
```
!!! note !!! note
It is only allowed to convert between various origins defined in terms of the same It is only allowed to convert between various origins defined in terms of the same
`absolute_point_origin`. Even if it is theoretically possible to express the same _Point_ as `absolute_point_origin`. Even if it is possible to express the same _point_ as a
a _Vector_ from another `absolute_point_origin`, the library will not allow such a conversion. _displacement vector_ from another `absolute_point_origin`, the library will not provide such
A custom user-defined conversion function will be needed to add this functionality. a conversion. A custom user-defined conversion function will be needed to add this functionality.
Said otherwise, in the **mp-units** library, there is no way to spell how two distinct Said another way, in the library, there is no way to spell how two distinct `absolute_point_origin`
`absolute_point_origin` types relate to each other. types relate to each other.
### Temperature support ### Temperature support
Another important example of [relative point origins](#relative-point-origins) is the support Support for temperature quantity points is probably one of the most common examples of relative
of temperature quantity points. The **mp-units** library provides a few predefined point origins point origins in action that we use in daily life.
for this purpose:
The [@SI] definition in the library provides a few predefined point origins for this purpose:
```cpp ```cpp
namespace si { namespace si {
@ -459,7 +392,7 @@ The above is a great example of how point origins can be stacked on top of each
!!! note !!! note
Notice that while stacking point origins, we can use not only different representation types Notice that while stacking point origins, we can use not only different representation types
but also different units for origins and a _Point_. In the above example, the relative but also different units for origins and a _point_. In the above example, the relative
point origin for degree Celsius is defined in terms of `si::kelvin`, while the quantity point point origin for degree Celsius is defined in terms of `si::kelvin`, while the quantity point
for it will use `si::degree_Celsius` as a unit. for it will use `si::degree_Celsius` as a unit.
@ -479,13 +412,14 @@ inline constexpr struct degree_Celsius :
namespace usc { namespace usc {
inline constexpr struct degree_Fahrenheit : inline constexpr struct degree_Fahrenheit :
named_unit<{u8"°F", "`F"}, mag<ratio{5, 9}> * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; named_unit<{u8"°F", "`F"}, mag<ratio{5, 9}> * si::degree_Celsius,
zeroth_degree_Fahrenheit> {} degree_Fahrenheit;
} }
``` ```
Now let's see how we can benefit from the above definitions. We have quite a few alternatives to Now, let's see how we can benefit from the above definitions. We have quite a few alternatives to
choose from here. Depending on our needs or taste we can: choose from here. Depending on our needs or tastes, we can:
- be explicit about the unit and origin: - be explicit about the unit and origin:
@ -511,13 +445,13 @@ choose from here. Depending on our needs or taste we can:
quantity_point q9{20.5 * deg_C}; quantity_point q9{20.5 * deg_C};
``` ```
*[CTAD]: Class Template Argument Deduction
In all of the above cases, we end up with the `quantity_point` of the same type and value. In all of the above cases, we end up with the `quantity_point` of the same type and value.
To play a bit more with temperatures, we can implement a simple room AC temperature controller in To play a bit more with temperatures, we can implement a simple room AC temperature controller in
the following way: the following way:
![affine_space_6](affine_space_6.svg){style="width:80%;display: block;margin: 0 auto;"}
```cpp ```cpp
constexpr struct room_reference_temp : relative_point_origin<quantity_point{21 * deg_C}> {} room_reference_temp; constexpr struct room_reference_temp : relative_point_origin<quantity_point{21 * deg_C}> {} room_reference_temp;
using room_temp = quantity_point<isq::Celsius_temperature[deg_C], room_reference_temp>; using room_temp = quantity_point<isq::Celsius_temperature[deg_C], room_reference_temp>;
@ -539,7 +473,7 @@ std::println("| {:<14} | {:^18} | {:^18} | {:^18} |",
std::println("|{0:=^16}|{0:=^20}|{0:=^20}|{0:=^20}|", ""); std::println("|{0:=^16}|{0:=^20}|{0:=^20}|{0:=^20}|", "");
auto print = [&](std::string_view label, auto v) { auto print = [&](std::string_view label, auto v) {
std::println("| {:<14} | {:^18} | {:^18} | {:^18{%N:.2f} %U} |", label, std::println("| {:<14} | {:^18} | {:^18} | {:^18:N[.2f]} |", label,
v - room_reference_temp, (v - si::ice_point).in(deg_C), (v - si::absolute_zero).in(deg_C)); v - room_reference_temp, (v - si::ice_point).in(deg_C), (v - si::absolute_zero).in(deg_C));
}; };
@ -563,13 +497,20 @@ Room reference temperature: 21 °C (69.8 °F, 294.15 K)
### No text output for _Points_ ### No text output for _Points_
The library does not provide a text output for quantity points, as printing just a number and a unit The library does not provide a text output for quantity points. The quantity stored inside
is not enough to adequately describe a quantity point. Often, an additional prefix or postfix is is just an implementation detail of this type. It is a vector from a specific origin.
required. Without the knowledge of the origin, the vector by itself is useless as we can't determine
which point it describes.
For example, the text output of `42 m` may mean many things and can also be confused with an output In the current library design, point origin does not provide any text in its definition.
of a regular quantity. On the other hand, printing `42 m AMSL` for altitudes above mean sea level is Even if we could add such information to the point's definition, we would not
a much better solution, but the library does not have enough information to print it that way by itself. know how to output it in the text. There may be many ways to do it. For example, should we
prepend or append the origin part to the quantity text?
For example, the text output of `42 m` for a quantity point may mean many things. It may be
an offset from the mountain top, sea level, or maybe the center of Mars.
Printing `42 m AMSL` for altitudes above mean sea level is a much better solution, but the
library does not have enough information to print it that way by itself.
## The affine space is about type-safety ## The affine space is about type-safety