diff options
Diffstat (limited to '')
47 files changed, 8119 insertions, 0 deletions
diff --git a/doc/2geom-logo.svg b/doc/2geom-logo.svg new file mode 100644 index 0000000..91a6dff --- /dev/null +++ b/doc/2geom-logo.svg @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="113.27319mm" + height="113.59513mm" + viewBox="0 0 113.27319 113.59513" + version="1.1" + id="svg8" + inkscape:version="0.92.1 r15371" + sodipodi:docname="2geom-logo.svg" + inkscape:export-filename="/home/tweenkpl/2geom-logo.png" + inkscape:export-xdpi="111.80057" + inkscape:export-ydpi="111.80057"> + <defs + id="defs2" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="166.69098" + inkscape:cy="240.82631" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:object-paths="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1722" + inkscape:window-height="1358" + inkscape:window-x="639" + inkscape:window-y="321" + inkscape:window-maximized="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-28.785322,-45.762063)"> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:12.45454025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 107.19276,55.400456 c -15.230149,0 -24.140387,9.013472 -24.140387,24.554437 0,0.621638 2.2e-4,1.45063 0.103836,2.590299 h 13.883015 v -2.383058 c 0,-8.184908 3.833366,-12.950644 10.464176,-12.950644 6.4236,0 10.36078,4.454975 10.36078,11.811032 0,8.081301 -2.58994,11.293214 -18.752545,22.793528 -12.432769,8.49573 -16.266387,15.02298 -16.991633,28.59542 h 37.554848 c -1.05021,4.0163 -4.60797,6.85313 -9.02421,6.85313 H 60.194912 c -5.284123,0 -9.344303,-4.0602 -9.344303,-9.34431 V 77.464994 c 0,-5.284125 4.060178,-9.342587 9.344303,-9.342587 h 22.70085 c 1.164171,-3.007917 2.822357,-5.632208 4.960058,-7.80351 1.913386,-1.943461 4.188188,-3.497369 6.76988,-4.651129 H 60.194912 c -11.968506,0 -21.798514,9.82872 -21.798514,21.797226 v 50.455296 c 0,11.96851 9.830003,21.79851 21.798514,21.79851 h 50.455728 c 11.96851,0 21.79679,-9.83 21.79679,-21.79851 V 117.4604 h -0.38916 -12.06548 -19.01641 c 1.86492,-3.93705 4.14415,-6.00893 14.91922,-13.88301 12.74359,-9.324584 16.47374,-14.919299 16.47374,-24.865515 0,-14.194083 -9.73922,-23.311419 -25.17658,-23.311419 z" + id="rect3680" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..c8ab4a1 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,6 @@ +all: manual.pdf + +manual.pdf: manual.tex + pdflatex manual.tex + bibtex manual + pdflatex manual.tex diff --git a/doc/bezier-utils-work.txt b/doc/bezier-utils-work.txt new file mode 100644 index 0000000..8604c12 --- /dev/null +++ b/doc/bezier-utils-work.txt @@ -0,0 +1,34 @@ +min .5 * sum_i lensq(bez_pt(b, u[i]) - d[i]) + +lensq(d)=dot(d, d) = d.x * d.x + d.y * d.y + +sum_i (f(i) + g(i)) = sum_i f(i) + sum_i g(i), so +we can separate into x,y parts. Since they are the same, we write `z' in the below +to mean either x or y. + +.5 * sum_i (bez_pt(b, u[i]) - d[i]).z^2 + += .5 * sum_i (B0(u[i]) * b[0] + + B1(u[i]) * b[1] + + B2(u[i]) * b[2] + + B3(u[i]) * b[3] + - d[i] ).z^2 + += H. + +Suppose that b[0,1,3] are fixed (with b[1] perhaps being calculated +from a prior call to existing generate_bezier). + +d H / d b[2].z = sum_i B2(u[i]) * (bez_pt(b, u[i]) - d[i]).z + +Solve for dH/db[2].z==0: + +-sum_i B2(u[i]) B2(u[i]) * b[2].z = sum_i B2(u[i]) * (B0(u[i]) * b[0] + + B1(u[i]) * b[1] + + B3(u[i]) * b[3] + - d[i] ).z +b[2].z = ((sum_i B2(u[i]) * (B0(u[i]) * b[0] + + B1(u[i]) * b[1] + + B3(u[i]) * b[3] + - d[i] ).z) + / -sum_i (B2(u[i]))^2) diff --git a/doc/boolops.svg b/doc/boolops.svg new file mode 100644 index 0000000..093e03d --- /dev/null +++ b/doc/boolops.svg @@ -0,0 +1,1622 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45+devel" + sodipodi:docname="boolops.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <marker + inkscape:stockid="Dot_m" + orient="auto" + refY="0.0" + refX="0.0" + id="Dot_m" + style="overflow:visible"> + <path + id="path13539" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none" + transform="scale(0.4) translate(7.4, 1)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path5066" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path5063" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path5069" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path3301" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3298" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.8) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3304" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.7071068" + inkscape:cx="244.82275" + inkscape:cy="325.44392" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="787" + inkscape:window-height="1020" + inkscape:window-x="0" + inkscape:window-y="0"> + <sodipodi:guide + orientation="vertical" + position="0" + id="guide2519" /> + <sodipodi:guide + orientation="vertical" + position="745.29055" + id="guide2576" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:0.5070422;fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M -1144.3715,-909.29614 C -1130.7209,-908.95152 -1113.1883,-906.68446 -1101.5143,-895.01043 C -1092.3992,-885.89531 -1090.0857,-871.31959 -1090.0857,-857.86757 C -1090.0857,-841.37471 -1094.9013,-835.74816 -1098.6572,-820.72472 C -1101.8376,-808.00312 -1109.561,-796.05986 -1115.8,-783.58186 C -1120.9667,-773.24862 -1118.6572,-752.60685 -1118.6572,-737.86757 C -1118.6572,-718.79529 -1107.396,-706.6622 -1098.6572,-695.01043 C -1081.2138,-671.75256 -1051.4077,-665.67141 -1030.0857,-655.01043 C -980.56756,-630.25133 -908.25189,-608.68486 -850.08576,-589.29615 C -816.67987,-578.16085 -794.4911,-580.07024 -761.51433,-563.58186 C -744.30839,-554.97889 -730.76848,-550.8954 -712.9429,-546.439 C -689.48675,-540.57497 -678.27784,-533.29735 -661.51433,-520.72472 C -651.27578,-513.0458 -648.2704,-502.11376 -638.65719,-489.29615 C -628.79688,-476.14908 -639.1503,-457.37446 -647.22862,-449.29615 C -660.19555,-436.32921 -689.09109,-423.58186 -707.22862,-423.58186 C -730.23567,-423.58186 -747.34884,-420.20138 -770.08576,-429.29615 C -817.68916,-448.33751 -860.87437,-478.60664 -910.08576,-495.01043 C -943.48116,-506.14223 -974.84358,-524.21338 -1001.5143,-546.439 C -1037.7259,-576.61531 -1076.5889,-604.37076 -1104.3715,-632.15329 C -1112.8389,-640.62075 -1119.5019,-665.27125 -1124.3715,-675.01043 C -1130.8513,-687.97013 -1134.9167,-697.19129 -1138.6572,-712.15329 C -1142.8203,-728.80565 -1148.2285,-741.8673 -1152.9429,-760.72472 C -1156.5643,-775.21039 -1163.4566,-788.49393 -1167.2286,-803.58186 C -1170.3434,-816.04089 -1167.2286,-833.52054 -1167.2286,-846.439 C -1167.2286,-861.44208 -1175.315,-864.55186 -1167.2286,-880.72471 C -1159.9567,-895.26852 -1160.7884,-896.16257 -1144.3715,-909.29614 z" + id="path2987" + sodipodi:nodetypes="cssssssssssssssssssssssssc" /> + <path + style="opacity:0.50568183;fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M -799.91455,-681.43839 C -887.51109,-684.38249 -965.32915,-744.70237 -1012.0466,-814.77852 C -1038.3927,-854.29768 -983.70547,-970.38465 -951.43743,-994.58567 C -855.64892,-1066.4271 -765.09423,-1097.3837 -648.39167,-1039.0324 C -579.60284,-1004.638 -506.18771,-985.96939 -454.44238,-923.875 C -416.40934,-878.23535 -469.68766,-766.16722 -496.86879,-729.92571 C -548.70738,-660.80759 -618.25596,-598.60588 -711.02113,-598.60588 C -737.82948,-598.60588 -838.11897,-599.3314 -828.19883,-639.01198 C -825.17618,-651.10255 -815.62052,-655.63089 -810.01608,-661.23533 C -805.73975,-665.51166 -802.81768,-675.63214 -799.91455,-681.43839 z" + id="path2227" /> + <path + style="opacity:0.50568183;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M -672.63532,-422.83933 C -673.30876,-423.51276 -673.98219,-424.1862 -674.65563,-424.85963 C -678.92567,-429.12967 -708.38695,-517.35852 -711.02112,-527.89519 C -714.39367,-541.3854 -711.02112,-560.32707 -711.02112,-574.36221 C -711.02112,-585.19036 -693.37737,-605.96843 -686.77746,-614.76831 C -677.92264,-626.57474 -670.9646,-640.6827 -662.5338,-649.1135 C -654.50114,-657.14616 -641.38773,-664.50154 -630.20892,-667.29624 C -619.95785,-669.85901 -607.73876,-671.39856 -599.90434,-673.35716 C -590.05857,-675.8186 -579.73699,-673.34823 -571.62007,-675.37747 C -560.52166,-678.15207 -548.66015,-679.41808 -537.27488,-679.41808 C -529.26369,-679.41808 -515.01085,-681.95363 -508.99061,-683.45869 C -502.09255,-685.1832 -494.56272,-692.69294 -488.78756,-695.58052 C -481.41977,-699.26441 -476.18116,-704.63088 -472.62512,-711.74296 C -469.19797,-718.59725 -473.11806,-735.93806 -474.64542,-742.04753 C -477.11091,-751.90948 -484.23165,-759.71498 -488.78756,-764.27089 C -493.69612,-769.17945 -496.96676,-782.84555 -498.88909,-790.53486 C -501.80768,-802.20925 -504.0379,-812.366 -500.90939,-824.88004 C -497.34889,-839.12203 -479.38936,-843.04037 -468.58451,-851.14401 C -458.91681,-858.39478 -446.07286,-858.79222 -436.25963,-861.24553 C -424.5508,-864.17274 -416.44575,-863.46042 -407.97536,-859.22523 C -403.29877,-856.88694 -400.69319,-841.84153 -395.85353,-837.00187 C -391.6837,-832.83205 -385.37678,-817.31825 -383.7317,-810.73791 C -380.57044,-798.09287 -376.38375,-784.0997 -373.63017,-770.3318 C -371.10634,-757.71264 -380.57159,-744.32713 -385.752,-733.96631 C -391.88886,-721.6926 -400.6153,-710.95021 -405.95505,-697.60082 C -407.07357,-694.80453 -408.64879,-692.21334 -409.99566,-689.5196 C -417.6298,-674.25132 -412.39478,-665.23387 -403.93475,-651.1338 C -390.47687,-628.70401 -354.82679,-598.76211 -335.24437,-582.44343 C -325.74155,-574.52441 -323.73745,-560.65938 -321.10224,-550.11855 C -320.57124,-547.99456 -335.58282,-525.19799 -337.26468,-521.83428 C -350.61508,-495.13347 -366.16504,-464.64965 -387.77231,-443.04238 C -422.13187,-408.68282 -470.95732,-366.18266 -519.09214,-354.14891 C -532.84253,-350.71131 -544.7411,-350.10831 -559.49824,-350.10831 C -578.46057,-350.10831 -593.91201,-348.53321 -610.00587,-358.18957 C -620.56665,-364.52603 -625.34158,-376.73916 -630.20892,-386.47384 C -634.24368,-394.54336 -648.94253,-398.73339 -656.47288,-400.61597 C -669.0554,-403.7616 -680.82347,-406.46305 -672.63532,-422.83933 z" + id="path2808" /> + <path + id="path2810" + d="M -1157.5085,-885.48919 C -1158.182,-886.16262 -1158.8554,-886.83606 -1159.5288,-887.50949 C -1163.7989,-891.77953 -1193.2602,-980.00838 -1195.8943,-990.54505 C -1199.2669,-1004.0353 -1195.8943,-1022.9769 -1195.8943,-1037.0121 C -1195.8943,-1047.8402 -1178.2506,-1068.6183 -1171.6507,-1077.4182 C -1162.7958,-1089.2246 -1155.8378,-1103.3326 -1147.407,-1111.7634 C -1139.3743,-1119.796 -1126.2609,-1127.1514 -1115.0821,-1129.9461 C -1104.8311,-1132.5089 -1092.612,-1134.0484 -1084.7776,-1136.007 C -1074.9318,-1138.4685 -1064.6102,-1135.9981 -1056.4933,-1138.0273 C -1045.3949,-1140.8019 -1033.5334,-1142.0679 -1022.1481,-1142.0679 C -1014.1369,-1142.0679 -999.88407,-1144.6035 -993.86383,-1146.1086 C -986.96577,-1147.8331 -979.43594,-1155.3428 -973.66078,-1158.2304 C -966.29299,-1161.9143 -961.05438,-1167.2807 -957.49834,-1174.3928 C -954.07119,-1181.2471 -957.99128,-1198.5879 -959.51864,-1204.6974 C -961.98413,-1214.5593 -969.10487,-1222.3649 -973.66078,-1226.9208 C -978.56934,-1231.8293 -981.83998,-1245.4954 -983.76231,-1253.1847 C -986.6809,-1264.8591 -988.91112,-1275.0159 -985.78261,-1287.5299 C -982.22211,-1301.7719 -964.26258,-1305.6902 -953.45773,-1313.7939 C -943.79003,-1321.0446 -930.94608,-1321.4421 -921.13285,-1323.8954 C -909.42401,-1326.8226 -901.31896,-1326.1103 -892.84857,-1321.8751 C -888.17198,-1319.5368 -885.5664,-1304.4914 -880.72674,-1299.6517 C -876.55691,-1295.4819 -870.24999,-1279.9681 -868.60491,-1273.3878 C -865.44365,-1260.7427 -861.25696,-1246.7496 -858.50338,-1232.9817 C -855.97955,-1220.3625 -865.4448,-1206.977 -870.62521,-1196.6162 C -876.76207,-1184.3425 -885.48851,-1173.6001 -890.82826,-1160.2507 C -891.94678,-1157.4544 -893.522,-1154.8632 -894.86887,-1152.1695 C -902.50301,-1136.9012 -897.26799,-1127.8837 -888.80796,-1113.7837 C -875.35008,-1091.3539 -839.7,-1061.412 -820.11758,-1045.0933 C -810.61476,-1037.1743 -808.61066,-1023.3092 -805.97545,-1012.7684 C -805.44445,-1010.6444 -820.45603,-987.84785 -822.13789,-984.48414 C -835.48829,-957.78333 -984.37839,-981.84775 -1005.9857,-960.24048 C -1040.3452,-925.88092 -955.83054,-828.83252 -1003.9654,-816.79877 C -1017.7157,-813.36117 -1029.6143,-812.75817 -1044.3715,-812.75817 C -1063.3338,-812.75817 -1078.7852,-811.18307 -1094.8791,-820.83943 C -1105.4399,-827.17589 -1110.2148,-839.38902 -1115.0821,-849.1237 C -1119.1169,-857.19322 -1133.8157,-861.38325 -1141.3461,-863.26583 C -1153.9286,-866.41146 -1165.6967,-869.11291 -1157.5085,-885.48919 z" + style="opacity:0.50568183;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="csssssssssssssssssssssssssssssssssssc" /> + <g + id="g2816" + transform="translate(-1113.6536,-1178.6859)"> + <path + id="path2812" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2814" /> + </g> + <g + transform="translate(-1252.4629,-1087.3029)" + id="g2820"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2822" /> + <path + id="path2824" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2826" + transform="translate(-1290.1344,-934.47404)"> + <path + id="path2828" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2830" /> + </g> + <g + transform="translate(-976.86456,-717.58711)" + id="g2832"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2834" /> + <path + id="path2836" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2838" + transform="translate(-817.28148,-798.99105)"> + <path + id="path2840" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2842" /> + </g> + <g + transform="translate(-758.91671,-873.3957)" + id="g2844"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2846" /> + <path + id="path2848" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + transform="translate(-719.93919,-978.7982)" + id="g2850"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2852" /> + <path + id="path2854" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2981" + transform="translate(-1285.32,-1020.1601)"> + <path + id="path2983" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2985" /> + </g> + <path + style="fill:#ff0000;fill-opacity:0.50588229;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M -921.13286,-295.5601 C -921.8063,-296.2335 -922.47973,-296.907 -923.15317,-297.5804 C -984.29068,-358.71794 -1016.0872,-423.42411 -1016.0872,-509.71245 C -1016.0872,-597.3637 -983.4151,-664.39202 -931.23439,-733.96631 C -865.35525,-821.80516 -815.84832,-922.08336 -737.2851,-1000.6466 C -693.29002,-1044.6417 -647.52402,-1120.4273 -628.18862,-1178.4334 C -613.76267,-1221.7113 -573.21021,-1251.8097 -549.39673,-1287.5299 C -536.11145,-1307.4578 -516.82915,-1316.0569 -500.9094,-1331.9766 C -488.49296,-1344.3931 -494.06725,-1302.7767 -496.86879,-1291.5705 C -501.74793,-1272.054 -496.97324,-1248.6219 -500.9094,-1228.9411 C -508.41847,-1191.3957 -530.38151,-1145.7532 -547.37642,-1111.7634 C -561.26485,-1083.9865 -583.92755,-1060.8845 -597.88405,-1032.9715 C -608.19334,-1012.3529 -622.12385,-996.61369 -632.22923,-976.40292 C -639.55197,-961.75745 -642.61989,-946.38567 -648.39168,-931.95621 C -652.90572,-920.6711 -658.98037,-908.75852 -664.55412,-897.61103 C -667.07062,-892.57801 -716.39482,-897.61103 -725.16327,-897.61103 C -734.0549,-897.61103 -748.276,-880.5592 -755.46784,-873.36737 C -764.57241,-864.26279 -767.9049,-857.45805 -775.67089,-847.1034 C -783.07496,-837.23132 -788.25189,-819.9211 -793.85364,-808.7176 C -803.04235,-790.34018 -811.09243,-768.04671 -816.077,-748.10845 C -821.96008,-724.57613 -824.46405,-700.41812 -830.21913,-677.39777 C -833.85459,-662.85593 -836.28005,-649.01243 -836.28005,-632.95106 C -836.28005,-598.82269 -856.2672,-555.02276 -864.56432,-521.83428 C -868.77151,-505.00551 -872.64554,-480.9603 -872.64554,-463.24543 C -872.64554,-452.00743 -874.66584,-438.87968 -874.66584,-426.87994 C -874.66584,-412.06437 -874.66584,-397.2488 -874.66584,-382.43323 C -874.66584,-367.88549 -881.26848,-345.9212 -884.76737,-331.9256 C -889.19493,-314.2153 -902.41425,-300.6724 -909.01103,-287.4789 C -914.1625,-277.1759 -926.05581,-283.2527 -921.13286,-295.5601 z" + id="path2989" /> + <g + transform="translate(-988.39466,-665.52836)" + id="g2280"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2282" /> + <path + id="path2284" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2286" + transform="translate(-956.06978,-550.37097)"> + <path + id="path2288" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2290" /> + </g> + <g + transform="translate(-1147.9988,-594.81768)" + id="g2292"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2294" /> + <path + id="path2296" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2298" + transform="translate(-1121.9988,-706.81768)"> + <path + id="path2300" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2302" /> + </g> + <g + transform="translate(-1267.9988,-752.81768)" + id="g2304"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2306" /> + <path + id="path2308" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2310" + transform="translate(-1289.9988,-672.81768)"> + <path + id="path2312" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2314" /> + </g> + <g + transform="translate(-1375.9988,-940.81768)" + id="g2316"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2318" /> + <path + id="path2320" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2322" + transform="translate(-1439.9988,-1012.8177)"> + <path + id="path2324" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2326" /> + </g> + <g + transform="translate(-969.99876,-1174.8177)" + id="g2328"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2330" /> + <path + id="path2332" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2334" + transform="translate(-879.99876,-1140.8177)"> + <path + id="path2336" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2338" /> + </g> + <g + transform="translate(-1105.9988,-804.81768)" + id="g2340"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2342" /> + <path + id="path2344" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2346" + transform="translate(-1211.9988,-846.81768)"> + <path + id="path2348" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2350" /> + </g> + <path + style="opacity:0.50568183;fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 215.90706,-1069.5786 C 150.58786,-1069.8445 91.365364,-1040.602 30.000864,-994.57855 C -2.2673361,-970.37753 -56.970236,-854.28523 -30.624136,-814.76605 C 16.093264,-744.6899 93.904164,-684.39763 181.50086,-681.45355 C 178.59766,-675.6473 165.68336,-592.66743 161.40706,-588.39105 C 155.80266,-582.78661 -84.509136,-475.38784 144.65706,-463.2973 C 185.50206,-461.14236 245.03616,-540.04733 271.84456,-540.0473 C 364.60966,-540.0473 432.72466,-660.80417 484.56326,-729.9223 C 511.74446,-766.16381 565.03386,-878.22015 527.00086,-923.8598 C 475.25556,-985.95419 408.07096,-1034.3404 339.28206,-1068.7348 C 297.34206,-1089.7048 252.54956,-1069.4294 215.90706,-1069.5786 z M 346.25086,-1022.9223 C 360.30246,-1022.9223 426.37576,-958.11727 426.37576,-947.57855 C 426.37586,-937.03983 360.30246,-984.7348 346.25086,-984.7348 C 332.19916,-984.73481 292.65706,-1030.7898 292.65706,-1041.3286 C 292.65706,-1051.8673 332.19916,-1022.9223 346.25086,-1022.9223 z" + id="path2352" + sodipodi:nodetypes="csscssssssccsssc" /> + <path + style="fill:#ff0000;fill-opacity:0.50588229;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 484.37586,-1334.2661 C 483.34546,-1334.2376 482.08416,-1333.5369 480.53206,-1331.9848 C 464.61236,-1316.0651 445.31736,-1307.444 432.03206,-1287.5161 C 408.21856,-1251.7958 367.67676,-1221.7002 353.25086,-1178.4223 C 333.91536,-1120.4161 288.15206,-1044.6361 244.15706,-1000.6411 C 165.59386,-922.07783 116.06746,-821.7924 50.188264,-733.95355 C -1.9924361,-664.37926 -34.655436,-597.35479 -34.655436,-509.70355 C -34.655436,-423.41521 -70.087736,-479.73419 58.282064,-297.5785 C 58.830664,-296.8 59.608764,-296.2207 60.282064,-295.5473 C 55.359164,-283.2399 67.255564,-277.1818 72.407064,-287.4848 C 79.003864,-300.6783 92.229464,-314.212 96.657064,-331.9223 C 100.15596,-345.9179 106.75076,-367.87456 106.75086,-382.4223 C 106.75086,-397.23787 106.75076,-412.07548 106.75086,-426.89105 C 106.75086,-438.89079 108.78206,-451.99681 108.78206,-463.2348 C 108.78206,-480.94967 112.66866,-504.99977 116.87586,-521.82855 C 125.17296,-555.01703 145.15706,-598.82519 145.15706,-632.95355 C 145.15706,-649.01492 147.58406,-662.84922 151.21956,-677.39105 C 156.97466,-700.4114 159.46146,-724.57747 165.34456,-748.1098 C 170.32916,-768.04806 178.37466,-790.32614 187.56326,-808.70355 C 193.16506,-819.90705 198.34676,-837.23773 205.75086,-847.1098 C 213.51686,-857.46445 216.86496,-864.25522 225.96956,-873.3598 C 233.16136,-880.55163 247.35926,-897.60981 256.25086,-897.6098 C 265.01936,-897.6098 314.35926,-892.57679 316.87586,-897.6098 C 322.44946,-908.75729 328.51806,-920.66844 333.03206,-931.95355 C 338.80386,-946.38301 341.86546,-961.74558 349.18826,-976.39105 C 359.29366,-996.60182 373.22276,-1012.3662 383.53206,-1032.9848 C 397.48856,-1060.8978 420.17486,-1083.9892 434.06326,-1111.7661 C 451.05826,-1145.7559 473.02296,-1191.4082 480.53206,-1228.9536 C 484.46826,-1248.6344 479.68416,-1272.062 484.56326,-1291.5786 C 487.01466,-1301.384 491.58856,-1334.4653 484.37586,-1334.2661 z M 331.28206,-1066.0473 C 343.77236,-1066.0473 353.90706,-1054.6302 353.90706,-1040.5786 C 353.90706,-1026.5269 343.77236,-1015.1411 331.28206,-1015.1411 C 318.79176,-1015.1411 308.65706,-1026.5269 308.65706,-1040.5786 C 308.65706,-1054.6302 318.79176,-1066.0473 331.28206,-1066.0473 z" + id="path2354" + sodipodi:nodetypes="cssssssscssssssssssssssssssssccsssc" /> + <g + transform="translate(99.144064,-1138.8177)" + id="g2356"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2358" /> + <path + id="path2360" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2362" + transform="translate(-124.57024,-804.81768)"> + <path + id="path2364" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2366" /> + </g> + <g + transform="translate(-230.57019,-846.81768)" + id="g2368"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2370" /> + <path + id="path2372" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <g + id="g2374" + transform="translate(12.858364,-1176.532)"> + <path + id="path2376" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2378" /> + </g> + <g + id="g2380" + transform="translate(-143.42734,-693.96054)"> + <path + id="path2382" + d="M 264.65997,106.8594 L 289.91378,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 289.91378,106.8594 L 264.65997,132.11321" + id="path2384" /> + </g> + <g + transform="translate(-169.14163,-583.96054)" + id="g2386"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 264.65997,106.8594 L 289.91378,132.11321" + id="path2388" /> + <path + id="path2390" + d="M 289.91378,106.8594 L 264.65997,132.11321" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> + <path + style="opacity:0.5070422;fill:#ff0000;fill-opacity:0.50588229;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 1135.7757,-973.9516 C 929.63638,-973.9516 709.30528,-890.79941 709.30528,-712.1047 C 709.30528,-533.40998 839.03848,-428.12946 1045.1777,-428.12946 C 1212.0524,-428.12945 1364.5424,-450.26799 1412.3705,-581.27925 C 1417.5407,-595.44179 1370.7938,-753.65554 1373.69,-768.58369 C 1377.0977,-786.14812 1467.26,-631.83353 1467.26,-650.23286 C 1467.26,-828.92758 1341.9152,-973.9516 1135.7757,-973.9516 z M 1162.3053,-962.886 C 1206.2166,-962.8859 1241.8677,-943.0936 1241.8677,-918.69845 C 1241.8677,-894.30327 1206.2165,-874.51095 1162.3053,-874.51095 C 1118.3939,-874.51096 1082.7427,-894.30327 1082.7427,-918.69845 C 1082.7428,-943.0936 1118.3939,-962.886 1162.3053,-962.886 z M 1216.4303,-772.8547 C 1299.9838,-772.85468 1367.8053,-741.16824 1367.8053,-702.13595 C 1367.8053,-663.10366 1299.9837,-631.44845 1216.4303,-631.44845 C 1132.8767,-631.44847 1065.0865,-663.10366 1065.0865,-702.13595 C 1065.0864,-741.16824 1132.8766,-772.8547 1216.4303,-772.8547 z M 1182.1803,-565.13595 C 1243.1682,-565.13593 1292.6803,-539.89606 1292.6803,-508.7922 C 1292.6803,-477.68834 1243.1682,-452.44845 1182.1803,-452.44845 C 1121.1923,-452.44847 1071.7115,-477.68834 1071.7115,-508.7922 C 1071.7114,-539.89606 1121.1923,-565.13595 1182.1803,-565.13595 z" + id="path3727" + sodipodi:nodetypes="csssssccsssccsssccsssc" /> + <path + style="opacity:0.5070422;fill:#000080;fill-opacity:0.50588229;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 1129.1506,-1000.4648 L 1129.1506,-319.87102 L 1732.4006,-319.87102 L 1732.4006,-1000.4648 L 1129.1506,-1000.4648 z M 1187.7131,-783.90227 C 1196.8613,-783.90225 1204.3068,-706.69974 1204.3068,-611.55852 L 1204.2756,-611.55852 C 1204.2757,-516.4173 1196.8613,-439.18352 1187.7131,-439.18352 C 1178.5649,-439.18354 1171.1506,-516.4173 1171.1506,-611.55852 C 1171.1505,-706.69974 1178.5649,-783.90227 1187.7131,-783.90227 z M 1367.8068,-724.24602 C 1447.0912,-724.24603 1511.4318,-688.11098 1511.4318,-643.58977 C 1511.4318,-599.06856 1447.0913,-562.93352 1367.8068,-562.93352 C 1288.5225,-562.93351 1224.1818,-599.06856 1224.1818,-643.58977 C 1224.1819,-688.11098 1288.5226,-724.24602 1367.8068,-724.24602 z" + id="rect3729" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:bold;text-align:end;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="723.4375" + y="35.174683" + id="text2328"><tspan + sodipodi:role="line" + id="tspan2330" + x="723.4375" + y="35.174683">Intersection Project</tspan><tspan + sodipodi:role="line" + x="723.4375" + y="55.681184" + id="tspan2332" + style="font-size:16px;font-weight:normal;text-align:end;text-anchor:end;font-family:Sans">Michael Sloan</tspan></text> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="15.625" + y="84.570549" + id="text2334"><tspan + sodipodi:role="line" + id="tspan2336" + x="15.625" + y="84.570549">Layer 1: Curve</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 15.60073,87.695549 L 728.14921,87.695549" + id="path2339" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="29.6875" + y="109.57055" + id="text2343"><tspan + sodipodi:role="line" + x="29.6875" + y="109.57055" + id="tspan2347"><tspan + style="font-weight:bold" + id="tspan8521">Curve</tspan>: A continuous 2d function on the interval [0,1], with precise start and end points</tspan></text> + <text + id="text2351" + y="336.49829" + x="15.625" + style="font-size:24px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="336.49829" + x="15.625" + id="tspan2353" + sodipodi:role="line">Layer 2: Path & Region</tspan></text> + <path + id="path2355" + d="M 15.60073,339.62327 L 728.14921,339.62327" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 39.0625,142.38305 C 50.953679,82.266289 39.708637,183.98347 140.625,117.38305" + id="path2375" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="33.59375" + y="154.10181" + id="text2972"><tspan + sodipodi:role="line" + id="tspan2974" + x="33.59375" + y="154.10181">0</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="142.1875" + y="124.4143" + id="text2976"><tspan + sodipodi:role="line" + id="tspan2978" + x="142.1875" + y="124.4143">1</tspan></text> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1, 47.99999964;stroke-dashoffset:0;stroke-opacity:1" + id="rect2994" + width="514.0625" + height="175.08554" + x="201.5625" + y="118.94555" /> + <flowRoot + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot3395"><flowRegion + id="flowRegion3397"><use + x="0" + y="0" + xlink:href="#rect2994" + id="use3399" + width="744.09448" + height="1052.3622" + transform="translate(0,24.041631)" /></flowRegion><flowPara + id="flowPara3401"><flowSpan + style="font-weight:bold" + id="flowSpan8519">Crossing</flowSpan>: A location where two curves cross. This is a subset of the intersections of the curves. Crossings are stored as two time values and a boolean indicating the relationship between the curves.</flowPara><flowPara + id="flowPara8507" /><flowPara + id="flowPara8511">This relationship is defined by the 'direction' of the curves at the intersection, and is quite useful in the later layers. When the curves are portions of paths with the same winding, this relation boolean indicates whether the first path is exiting (true), or leaving (false).</flowPara><flowPara + id="flowPara8515" /><flowPara + id="flowPara8517">In curve terms it is the orientation of the derivatives and the origin.</flowPara></flowRoot> <path + sodipodi:nodetypes="cc" + id="path3802" + d="M 39.0625,226.75805 C 50.953679,166.64129 39.708637,268.35847 140.625,201.75805" + style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Send);marker-mid:none;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Send);marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 68.75,265.82055 C 31.50892,217.735 75.40193,186.36624 125,179.88305" + id="path3806" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 57.8125,213.4768 L 57.8125,223.63305" + id="path4211" /> + <path + id="path4213" + d="M 52.73437,218.55493 L 62.89062,218.55493" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="81.25" + y="245.50806" + id="text4215"><tspan + sodipodi:role="line" + id="tspan4217" + x="81.25" + y="245.50806">A<tspan + style="font-size:8px" + id="tspan4219" + dy="2.34375">t <tspan + style="font-size:12px" + id="tspan4221" + dy="-1.5625">= 0.4</tspan></tspan></tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="85.15625" + y="186.13306" + id="text4223"><tspan + sodipodi:role="line" + id="tspan4225" + x="85.15625" + y="186.13306">A</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="117.96875" + y="206.44556" + id="text4227"><tspan + sodipodi:role="line" + id="tspan4229" + x="117.96875" + y="206.44556">B</tspan></text> + <text + id="text4231" + y="260.35181" + x="80.46875" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="260.35181" + x="80.46875" + id="tspan4233" + sodipodi:role="line"><tspan + dy="0 2.34375" + id="tspan4235" + style="font-size:8px"><tspan + style="font-size:12px" + id="tspan4247">B</tspan>t <tspan + dy="-1.5625" + id="tspan4237" + style="font-size:12px">= 0.15</tspan></tspan></tspan></text> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000001, 48.00000051;stroke-dashoffset:0;stroke-opacity:1" + id="rect8527" + width="700" + height="57.396477" + x="27.34375" + y="347.43579" /> + <flowRoot + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot8934" + transform="translate(0,-42.426407)"><flowRegion + id="flowRegion8936"><use + x="0" + y="0" + xlink:href="#rect8527" + id="use8938" + transform="translate(0,42.426407)" + width="744.09448" + height="1052.3622" /></flowRegion><flowPara + id="flowPara8940"><flowSpan + style="font-weight:bold" + id="flowSpan8942">Path</flowSpan>: A series of connected Curves, implicitly closed with a final line segment. For some applications, however, this line segment must be treated specially, such that if it is still expressed, it is the last segment of the path. In some cases this is impossible.</flowPara></flowRoot> <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + x="27.125" + y="468.62329" + id="text8946"><tspan + sodipodi:role="line" + id="tspan8948" + x="27.125" + y="468.62329">0</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 36.5,443.80039 C 36.5,443.80039 66.583183,434.01208 81.03125,430.51914 C 152.125,413.33164 150.5625,411.76914 99,432.86289 C 78.75366,441.14548 113.84375,446.14414 117.75,443.80039 C 287.26549,396.25895 87.015116,455.9959 165.40625,450.05039 C 177.90625,448.48789 234.9375,410.98789 234.9375,410.98789 C 251.87833,448.11151 247.88044,478.79245 210.71875,499.26914" + id="path8950" + sodipodi:nodetypes="csscccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 37.28125,444.58164 L 210.71875,499.26914" + id="path8952" + sodipodi:nodetypes="cc" /> + <text + id="text9359" + y="427.30042" + x="77.875" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="427.30042" + x="77.875" + id="tspan9361" + sodipodi:role="line">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + x="83.875" + y="441.30042" + id="text9363"><tspan + sodipodi:role="line" + id="tspan9365" + x="83.875" + y="441.30042">2</tspan></text> + <text + id="text9367" + y="455.30042" + x="111.875" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="455.30042" + x="111.875" + sodipodi:role="line" + id="tspan9371">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + x="163.875" + y="461.30042" + id="text9375"><tspan + id="tspan9377" + sodipodi:role="line" + x="163.875" + y="461.30042">4</tspan></text> + <text + id="text9379" + y="427.30042" + x="228.875" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="427.30042" + x="228.875" + sodipodi:role="line" + id="tspan9381">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Serif" + x="203.22182" + y="511.77289" + id="text9383"><tspan + sodipodi:role="line" + id="tspan9385" + x="203.22182" + y="511.77289">6</tspan></text> + <path + id="path9318" + d="M 181.00779,605.47923 L 181.00779,756.79173 L 326.69529,756.79173 L 326.69529,605.47923 L 181.00779,605.47923 z M 255.13279,630.91673 C 280.89411,630.91673 301.82029,651.84292 301.82029,677.60423 C 301.82027,703.36552 280.8941,724.26048 255.13279,724.26048 C 229.37148,724.2605 208.47654,703.36554 208.47654,677.60423 C 208.47653,651.84289 229.37148,630.91673 255.13279,630.91673 z" + style="opacity:1;fill:#6e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000007, 48.0000034;stroke-dashoffset:0;stroke-opacity:1" + id="rect9411" + width="440" + height="44.715744" + x="44.483189" + y="862.271" /> + <g + id="g2521" + transform="translate(0,301.12698)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 5.2867965,666.45725 C 5.2867965,666.45725 35.369977,656.66894 49.818047,653.176 C 120.9118,635.9885 119.3493,634.426 67.786797,655.51975 C 47.540457,663.80234 82.630547,668.801 86.536797,666.45725 C 256.05229,618.91581 55.801917,678.65276 134.19305,672.70725 C 146.69305,671.14475 203.7243,633.64475 203.7243,633.64475 C 220.66513,670.76837 216.66724,701.44931 179.50555,721.926" + id="path9389" + sodipodi:nodetypes="csscccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.0680465,667.2385 L 179.50555,721.926" + id="path9391" + sodipodi:nodetypes="cc" /> + <path + transform="translate(-30.213203,-10.811184)" + d="M 180,671.36218 A 53,53 0 1 1 74,671.36218 A 53,53 0 1 1 180,671.36218 z" + sodipodi:ry="53" + sodipodi:rx="53" + sodipodi:cy="671.36218" + sodipodi:cx="127" + id="path9834" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <g + transform="translate(-21.213203,-38.811184)" + id="g10655"> + <path + id="path10651" + d="M 65.3125,688.01843 L 65.3125,698.17468" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 60.23437,693.09656 L 70.39062,693.09656" + id="path10653" /> + </g> + <g + transform="translate(-17.713203,-12.311184)" + id="g10659"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 65.3125,688.01843 L 65.3125,698.17468" + id="path10661" /> + <path + id="path10663" + d="M 60.23437,693.09656 L 70.39062,693.09656" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g10665" + transform="translate(60.286797,12.188816)"> + <path + id="path10667" + d="M 65.3125,688.01843 L 65.3125,698.17468" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 60.23437,693.09656 L 70.39062,693.09656" + id="path10669" /> + </g> + <g + transform="translate(84.286797,-26.311184)" + id="g10671"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 65.3125,688.01843 L 65.3125,698.17468" + id="path10673" /> + <path + id="path10675" + d="M 60.23437,693.09656 L 70.39062,693.09656" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g10677" + transform="translate(83.786797,-40.811183)"> + <path + id="path10679" + d="M 65.3125,688.01843 L 65.3125,698.17468" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 60.23437,693.09656 L 70.39062,693.09656" + id="path10681" /> + </g> + <g + transform="translate(82.286797,-44.311183)" + id="g10683"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 65.3125,688.01843 L 65.3125,698.17468" + id="path10685" /> + <path + id="path10687" + d="M 60.23437,693.09656 L 70.39062,693.09656" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> + <g + id="g2554" + transform="translate(0,301.12698)"> + <path + id="path11208" + d="M 220.05888,649.49465 L 263.83033,649.49465" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + id="text12445" + y="638.83783" + x="222.01724" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="638.83783" + x="222.01724" + id="tspan12447" + sodipodi:role="line">Union</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 414.70605,930.12161 L 517.4494,870.17357" + id="path13315" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 416.70608,941.12165 L 526.01012,979.92317" + id="path13317" /> + <g + id="g2544" + transform="translate(0,301.12698)"> + <path + id="path12896" + d="M 415.51098,636.39534 C 415.96828,639.19439 416.20607,642.06692 416.20607,644.99465 L 416.20607,644.99465 C 416.20607,646.96475 416.0984,648.90985 415.88862,650.82438" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path12892" + d="M 310.51289,639.2627 C 313.37363,612.69928 335.88664,591.99465 363.20607,591.99465 C 388.72601,591.99465 410.05186,610.06154 415.0824,634.09412" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path12888" + d="M 392.28508,689.30395 C 383.93485,694.79747 373.94156,697.99465 363.20607,697.99465 C 340.78343,697.99465 321.59861,684.04712 313.85985,664.36028" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path12460" + d="M 415.27762,650.89645 C 436.57244,639.8338 469.64357,618.0884 469.64357,618.0884 C 486.5844,655.21202 482.58651,685.89296 445.42482,706.36965" + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path12456" + d="M 416.89529,633.40969 C 426.42762,631.19088 423.32669,632.81532 415.90125,636.06666" + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path12449" + d="M 310.81469,638.88458 C 295.40026,643.02872 271.20607,650.9009 271.20607,650.9009 L 313.95542,663.53315" + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cc" + id="path12900" + d="M 390.59038,689.68218 L 446.42479,706.36968" + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.99999996, 1.99999998;stroke-dashoffset:0;stroke-opacity:1" /> + <path + transform="translate(-118.29394,-51.367533)" + d="M 540,685.86218 A 5.5,5.5 0 1 1 529,685.86218 A 5.5,5.5 0 1 1 540,685.86218 z" + sodipodi:ry="5.5" + sodipodi:rx="5.5" + sodipodi:cy="685.86218" + sodipodi:cx="534.5" + id="path12902" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:0.8, 0.8;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + </g> + <g + id="g2564" + transform="translate(0,301.12698)"> + <path + sodipodi:nodetypes="cc" + id="path13335" + d="M 523.51519,620.60763 C 520.12981,602.83246 515.33803,584.38874 510.2072,573.72907" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:19.23264885;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:19.23264885;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 540.87055,613.95765 C 632.53653,592.62085 602.717,608.242 531.31153,639.50794" + id="path13337" /> + <path + sodipodi:nodetypes="ccccc" + id="path13351" + d="M 537.05362,641.11822 L 518.0652,644.21465 C 520.08982,656.60699 521.65827,669.15297 522.75281,681.83516 C 534.90606,684.33516 534.16149,677.70481 541.83282,679.90433 C 540.72774,666.83066 539.14076,653.8932 537.05362,641.11822 z" + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:39.59658432;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:0.8, 0.8;stroke-dashoffset:0;stroke-opacity:1" + id="path13339" + sodipodi:cx="534.5" + sodipodi:cy="685.86218" + sodipodi:rx="5.5" + sodipodi:ry="5.5" + d="M 540,685.86218 A 5.5,5.5 0 1 1 529,685.86218 A 5.5,5.5 0 1 1 540,685.86218 z" + transform="matrix(9.6163242,0,0,9.6163242,-4605.6823,-5971.0816)" /> + <path + transform="matrix(9.6163242,0,0,9.6163242,-4605.6823,-5971.0816)" + d="M 540,685.86218 A 5.5,5.5 0 1 1 529,685.86218 A 5.5,5.5 0 1 1 540,685.86218 z" + sodipodi:ry="5.5" + sodipodi:rx="5.5" + sodipodi:cy="685.86218" + sodipodi:cx="534.5" + id="path13356" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:0.8, 0.8;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + </g> + <g + id="g2571" + transform="translate(-6,301.12698)"> + <path + sodipodi:nodetypes="ccccccsssssssscc" + id="path17529" + d="M 669.90625,568.88609 L 652.59375,577.22984 C 668.38738,617.91025 658.91917,631.04706 701.75,623.38609 C 661.44527,641.13907 670.89896,635.14549 673.8125,681.13609 C 685.96576,683.63612 685.20367,677.03032 692.875,679.22984 C 692.02305,669.15078 692.20265,658.99187 691.375,649.01109 C 705.86844,642.91912 717.48537,637.56766 726.0625,633.01109 C 731.20833,630.27738 735.25679,627.8742 738.5,625.41734 C 740.12161,624.18891 741.53504,622.95333 742.90625,621.32359 C 744.27746,619.69385 745.99222,617.53449 746.1875,613.57359 C 746.38278,609.61269 743.46312,605.17416 740.9375,603.54234 C 738.41188,601.91052 736.38131,601.53447 734.375,601.22984 C 732.36869,600.92521 730.28822,600.83068 728.03125,600.85484 C 725.77428,600.879 723.34589,601.04254 720.5625,601.29234 C 711.49835,602.10581 699.14713,604.09782 683.09375,607.32359 C 679.47139,592.40484 674.50899,578.44864 669.90625,568.88609 z" + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:19.23264885;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + transform="matrix(9.6163242,0,0,9.6163242,-4454.6363,-5971.7659)" + d="M 540,685.86218 A 5.5,5.5 0 1 1 529,685.86218 A 5.5,5.5 0 1 1 540,685.86218 z" + sodipodi:ry="5.5" + sodipodi:rx="5.5" + sodipodi:cy="685.86218" + sodipodi:cx="534.5" + id="path17535" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:0.8, 0.8;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:0.8, 0.8;stroke-dashoffset:0;stroke-opacity:1" + id="path17537" + sodipodi:cx="534.5" + sodipodi:cy="685.86218" + sodipodi:rx="5.5" + sodipodi:ry="5.5" + d="M 540,685.86218 A 5.5,5.5 0 1 1 529,685.86218 A 5.5,5.5 0 1 1 540,685.86218 z" + transform="matrix(9.6163242,0,0,9.6163242,-4454.6363,-5971.7659)" /> + </g> + <g + id="g2559" + transform="translate(0,301.12698)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 584.92598,583.02661 L 628.69743,583.02661" + id="path2443" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="590.88434" + y="576.36975" + id="text2445"><tspan + sodipodi:role="line" + id="tspan2447" + x="590.88434" + y="576.36975">Fix</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 73.436386,852.85756 L 663.36887,852.85756" + id="path2449" /> + <flowRoot + id="flowRoot2451" + style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve" + transform="translate(-235.46656,388.08684)"><flowRegion + id="flowRegion2453"><use + id="use2455" + xlink:href="#rect9411" + y="0" + x="0" + width="744.09448" + height="1052.3622" + transform="translate(235.46656,-386.78742)" /></flowRegion><flowPara + id="flowPara2457">One problem with storing crossings as a time value is that the locations on the two paths may not perfectly coincide. To maintain continuity, the output portions must be tweaked.</flowPara></flowRoot> <path + id="path2477" + d="M 73.436386,1034.4627 L 663.36887,1034.4627" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <rect + y="415.47995" + x="272.02945" + height="91.384789" + width="440" + id="rect2501" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000004, 48.00000264;stroke-dashoffset:0;stroke-opacity:1" /> + <flowRoot + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot2503" + transform="translate(0,-48.870058)"><flowRegion + id="flowRegion2505"><use + x="0" + y="0" + xlink:href="#rect2501" + id="use2507" + width="744.09448" + height="1052.3622" + transform="translate(0,48.083262)" /></flowRegion><flowPara + id="flowPara2511">The Crossing data type is also valid on Paths, where a particular time value corresponds to the point on curve i at f, where i is the integral part, and f is the fractional part. The crossings function for paths is the basis of the important path_boolean function.</flowPara></flowRoot> <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="15.625" + y="1081.7888" + id="text2513"><tspan + sodipodi:role="line" + id="tspan2515" + x="15.625" + y="1081.7888">Layer 3: Shape</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 15.60073,1084.9138 L 728.14921,1084.9138" + id="path2517" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000004, 48.00000245;stroke-dashoffset:0;stroke-opacity:1" + id="rect2596" + width="690.3158" + height="72.698502" + x="21.713648" + y="520.41602" /> + <rect + y="347.43579" + x="27.34375" + height="57.396477" + width="700" + id="rect2602" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000001, 48.00000051;stroke-dashoffset:0;stroke-opacity:1" /> + <flowRoot + xml:space="preserve" + style="font-size:14;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot2630"><flowRegion + id="flowRegion2632"><use + x="0" + y="0" + xlink:href="#rect2596" + id="use2634" + width="744.09448" + height="1052.3622" /></flowRegion><flowPara + id="flowPara2636"><flowSpan + style="font-style:normal;font-weight:bold;font-size:14" + id="flowSpan2640">Region</flowSpan>: A simple path (a path with no self-intersection), specifying a subset of the plane. Such a path also has a defined winding direction which specifies what the boundary means - a region of 'fill' will have a counter-clockwise wind, whereas a region of 'non-fill' will have a clockwise wind. Reversing the direction of the region's path will give the boolean complement of the region.</flowPara></flowRoot> <path + sodipodi:type="arc" + style="opacity:1;fill:#6e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.45454550000000005;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6202" + sodipodi:cx="91.923882" + sodipodi:cy="633.75494" + sodipodi:rx="22.627417" + sodipodi:ry="22.627417" + d="M 114.5513,633.75494 A 22.627417,22.627417 0 1 1 69.296465,633.75494 A 22.627417,22.627417 0 1 1 114.5513,633.75494 z" + transform="matrix(2.0625,0,0,2.0625,-91.428942,-630.93823)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.4545455;marker-start:url(#Arrow1Mstart);marker-mid:url(#Arrow1Mstart);marker-end:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2656" + sodipodi:cx="91.923882" + sodipodi:cy="633.75494" + sodipodi:rx="22.627417" + sodipodi:ry="22.627417" + d="M 114.5513,633.75494 A 22.627417,22.627417 0 1 1 69.296465,633.75494 A 22.627417,22.627417 0 1 1 114.5513,633.75494 z" + transform="matrix(2.0625,0,0,2.0625,-92.843157,-629.52402)" /> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect9127" + width="145.66399" + height="151.32086" + x="22.627422" + y="605.4707" /> + <path + transform="matrix(2.0625,0,0,2.0625,65.548763,-629.52403)" + d="M 114.5513,633.75494 A 22.627417,22.627417 0 1 1 69.296465,633.75494 A 22.627417,22.627417 0 1 1 114.5513,633.75494 z" + sodipodi:ry="22.627417" + sodipodi:rx="22.627417" + sodipodi:cy="633.75494" + sodipodi:cx="91.923882" + id="path9129" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.4545455;marker-start:url(#Arrow1Mend);marker-mid:url(#Arrow1Mend);marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="77.781746" + y="769.51947" + id="text11070"><tspan + sodipodi:role="line" + id="tspan11072" + x="77.781746" + y="769.51947">(Outer box represents the plane)</tspan></text> + <rect + y="606.68304" + x="344.15433" + height="143.40918" + width="367.87509" + id="rect11074" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-dasharray:1, 48.00000017;stroke-dashoffset:0;stroke-opacity:1" /> + <flowRoot + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot11080"><flowRegion + id="flowRegion11082"><use + x="0" + y="0" + xlink:href="#rect11074" + id="use11084" + width="744.09448" + height="1052.3622" /></flowRegion><flowPara + id="flowPara11086">This behavior is mainly important for the main region boolean function, which takes two regions and performs an operation. The operation which is performed is specified by a bool which indicates either union (false) or intersection (true).</flowPara><flowPara + id="flowPara11777" /><flowPara + id="flowPara11779">This operation may be considered from the standpoint of regular path booleans:</flowPara></flowRoot> <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="390.38602" + y="771.6131" + id="text11088" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11090" + x="390.38602" + y="771.6131">Union</tspan></text> + <text + id="text11092" + y="786.07953" + x="455.04291" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="786.07953" + x="455.04291" + id="tspan11094" + sodipodi:role="line">A</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="340.86606" + y="823.54407" + id="text11096" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11098" + x="340.86606" + y="823.54407">B</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="415.87198" + y="798.57526" + id="text11100" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11102" + x="415.87198" + y="798.57526">Fill</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.00000002, 1.00000002;stroke-dashoffset:0;stroke-opacity:1" + d="M 510.65997,802.88125 L 390.54555,802.88125 L 390.54555,837.88488" + id="path11104" /> + <text + id="text11106" + y="798.57526" + x="466.74768" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="798.57526" + x="466.74768" + id="tspan11108" + sodipodi:role="line">Hole</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.00000002, 1.00000002;stroke-dashoffset:0;stroke-opacity:1" + d="M 460.69754,802.57541 L 460.69754,840.23336" + id="path11110" /> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="395.08356" + y="817.79944" + id="text11112" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11114" + x="395.08356" + y="817.79944">A+B</tspan></text> + <text + id="text11116" + y="817.79944" + x="465.38834" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.79944" + x="465.38834" + id="tspan11118" + sodipodi:role="line">A-B</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="395.08356" + y="834.02338" + id="text11120" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11122" + x="395.08356" + y="834.02338">B-A</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="442.45596" + y="833.52515" + id="text11124" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11126" + x="442.45596" + y="833.52515">H</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="434.12323" + y="817.61108" + id="text11128" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11130" + x="434.12323" + y="817.61108">F</tspan></text> + <text + id="text11132" + y="817.89258" + x="442.45596" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.89258" + x="442.45596" + id="tspan11134" + sodipodi:role="line">H</tspan></text> + <text + id="text11136" + y="817.61108" + x="434.12323" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.61108" + x="434.12323" + id="tspan11138" + sodipodi:role="line">F</tspan></text> + <text + id="text11188" + y="817.89258" + x="498.86911" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.89258" + x="498.86911" + id="tspan11190" + sodipodi:role="line">H</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="465.38834" + y="834.11163" + id="text11260" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11262" + x="465.38834" + y="834.11163">AxB</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="498.86911" + y="834.20483" + id="text11264" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11266" + x="498.86911" + y="834.20483">H</tspan></text> + <text + id="text11268" + y="816.24683" + x="368.29462" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="816.24683" + x="368.29462" + id="tspan11270" + sodipodi:role="line">Fill</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="352.56204" + y="832.55908" + id="text11272" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11274" + x="352.56204" + y="832.55908">Hole</tspan></text> + <text + id="text11693" + y="771.6131" + x="555.71558" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="771.6131" + x="555.71558" + id="tspan11695" + sodipodi:role="line">Intersection</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="641.52271" + y="786.07953" + id="text11697" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11699" + x="641.52271" + y="786.07953">A</tspan></text> + <text + id="text11701" + y="825.54053" + x="539.36707" + style="font-size:16.31223488px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="825.54053" + x="539.36707" + id="tspan11703" + sodipodi:role="line">B</tspan></text> + <text + id="text11705" + y="798.57526" + x="608.36243" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="798.57526" + x="608.36243" + id="tspan11707" + sodipodi:role="line">Fill</tspan></text> + <path + id="path11709" + d="M 710.80928,802.88125 L 590.69486,802.88125 L 590.69486,837.88488" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.00000002, 1.00000002;stroke-dashoffset:0;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="655.01807" + y="798.57526" + id="text11711" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11713" + x="655.01807" + y="798.57526">Hole</tspan></text> + <path + id="path11715" + d="M 647.27741,802.57541 L 647.27741,840.23336" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.00000002, 1.00000002;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text11717" + y="817.79944" + x="595.58807" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.79944" + x="595.58807" + id="tspan11719" + sodipodi:role="line">AxB</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="653.65869" + y="817.79944" + id="text11721" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11723" + x="653.65869" + y="817.79944">B-A</tspan></text> + <text + id="text11725" + y="836.06238" + x="595.58807" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="836.06238" + x="595.58807" + id="tspan11727" + sodipodi:role="line">A-B</tspan></text> + <text + id="text11733" + y="817.61108" + x="634.62775" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.61108" + x="634.62775" + id="tspan11735" + sodipodi:role="line">F</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="634.62775" + y="817.61108" + id="text11741" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11743" + x="634.62775" + y="817.61108">F</tspan></text> + <text + id="text11749" + y="835.47101" + x="653.65869" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="835.47101" + x="653.65869" + id="tspan11751" + sodipodi:role="line">A+B</tspan></text> + <text + id="text11753" + y="835.56415" + x="689.17853" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="835.56415" + x="689.17853" + id="tspan11755" + sodipodi:role="line">H</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="568.79919" + y="816.24683" + id="text11757" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11759" + x="568.79919" + y="816.24683">Fill</tspan></text> + <text + id="text11761" + y="832.55908" + x="553.06659" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="832.55908" + x="553.06659" + id="tspan11763" + sodipodi:role="line">Hole</tspan></text> + <text + id="text11765" + y="835.96234" + x="634.62775" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="835.96234" + x="634.62775" + id="tspan11767" + sodipodi:role="line">F</tspan></text> + <text + id="text11769" + y="817.61108" + x="700.5564" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve" + transform="scale(0.9982283,1.0017748)"><tspan + y="817.61108" + x="700.5564" + id="tspan11771" + sodipodi:role="line">F</tspan></text> + <text + xml:space="preserve" + style="font-size:16.31223488px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="700.5564" + y="835.96234" + id="text11773" + transform="scale(0.9982283,1.0017748)"><tspan + sodipodi:role="line" + id="tspan11775" + x="700.5564" + y="835.96234">F</tspan></text> + <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-dasharray:0.99999998, 47.99999926;stroke-dashoffset:0;stroke-opacity:1" + id="rect11781" + width="312.72076" + height="59.970577" + x="23.127848" + y="783.45972" /> + <flowRoot + xml:space="preserve" + style="font-size:14px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + id="flowRoot11787"><flowRegion + id="flowRegion11789"><use + x="0" + y="0" + xlink:href="#rect11781" + id="use11791" /></flowRegion><flowPara + id="flowPara11793">Though not on the chart, fill subtraction and hole subtraction may be performed by reversing one of the arguments.</flowPara></flowRoot> <rect + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:1.00000001, 48.00000051;stroke-dashoffset:0;stroke-opacity:1" + id="rect12212" + width="700" + height="57.396477" + x="27.34375" + y="346.02158" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;marker-start:url(#Dot_m)" + d="M 33.234019,725.63596 L 33.234019,748.26338" + id="path12214" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Mend);stroke-opacity:1" + d="M 34.062445,725.67885 L 56.689865,725.67885" + id="path12218" /> + </g> +</svg> diff --git a/doc/degenerate_conic_decomposition.pdf b/doc/degenerate_conic_decomposition.pdf Binary files differnew file mode 100644 index 0000000..9d5e1cf --- /dev/null +++ b/doc/degenerate_conic_decomposition.pdf diff --git a/doc/extradoxygen.css b/doc/extradoxygen.css new file mode 100644 index 0000000..2e0c486 --- /dev/null +++ b/doc/extradoxygen.css @@ -0,0 +1,14 @@ +#top {
+ width: 1000px;
+ margin: 0 auto;
+}
+
+div.contents {
+ width: 1000px;
+ margin: 0 auto;
+}
+
+div.header {
+ width: 1000px;
+ margin: 0 auto;
+}
\ No newline at end of file diff --git a/doc/features.txt b/doc/features.txt new file mode 100644 index 0000000..2dab29e --- /dev/null +++ b/doc/features.txt @@ -0,0 +1,28 @@ +* C++ +* Functional programming style. +* Points +* Efficient affine transformations +* Rectangles +* Convex Hulls +* Bounded error +* General purpose paths: +- exact elliptical arcs +- area +- centroid and bending moments +* Path Locations +- determination of special spots (e.g. maximum curvature) +- splitting +- point, tangent, curvature at location +- efficient arc length and inverse arc length +* Path algebra +- computations such as offset curves can be written with their mathematical definition and still get a bounded error, efficient curve. (preliminary trials indicate offset done this way out performs the method used in Inkscape) +- arbitrary distortion (with bounded error) +-- mesh distorts +-- computational distorts such as the GIMP's 'vortex' plugin +-- 3d mapping (perspective, flag, sphere) +* exact boolean ops (elliptic arcs remain elliptic arcs) +* efficient 2d database +* implicit function plotting +* NURBs input and output +* tunable path simplification +* PDoF constraint system for CAD/ CAGD
\ No newline at end of file diff --git a/doc/manual.bib b/doc/manual.bib new file mode 100644 index 0000000..af7f0d7 --- /dev/null +++ b/doc/manual.bib @@ -0,0 +1,55 @@ +@article{SanchezReyes1997, + author = {J. S\'{a}nchez-Reyes}, + title = {The symmetric analogue of the polynomial power basis}, + journal = {ACM Trans. Graph.}, + volume = {16}, + number = {3}, + year = {1997}, + issn = {0730-0301}, + pages = {319--357}, + doi = {http://doi.acm.org/10.1145/256157.256162}, + publisher = {ACM}, + address = {New York, NY, USA}, + } + +@article{SanchezReyes2001, + author = {J. S\'{a}nchez-reyes}, + title = {Inversion approximations for functions via s-power series}, + journal = {Comput. Aided Geom. Des.}, + volume = {18}, + number = {6}, + year = {2001}, + issn = {0167-8396}, + pages = {587--608}, + doi = {http://dx.doi.org/10.1016/S0167-8396(01)00054-1}, + publisher = {Elsevier Science Publishers B. V.}, + address = {Amsterdam, The Netherlands, The Netherlands}, + } + +@article{SanchezReyes2000, + author = {Javier S\'{a}nchez-Reyes}, + title = {Applications of the polynomial s-power basis in geometry processing}, + journal = {ACM Trans. Graph.}, + volume = {19}, + number = {1}, + year = {2000}, + issn = {0730-0301}, + pages = {27--55}, + doi = {http://doi.acm.org/10.1145/343002.343018}, + publisher = {ACM}, + address = {New York, NY, USA}, + } + +@article{SanchezReyes2005, + author = {J. S\'{a}nchez-Reyes and J. M. Chac\'{o}n}, + title = {s-power series: an alternative to Poisson expansions for representing analytic functions}, + journal = {Comput. Aided Geom. Des.}, + volume = {22}, + number = {2}, + year = {2005}, + issn = {0167-8396}, + pages = {103--119}, + doi = {http://dx.doi.org/10.1016/j.cagd.2004.09.003}, + publisher = {Elsevier Science Publishers B. V.}, + address = {Amsterdam, The Netherlands, The Netherlands}, + } diff --git a/doc/manual.tex b/doc/manual.tex new file mode 100644 index 0000000..196c990 --- /dev/null +++ b/doc/manual.tex @@ -0,0 +1,734 @@ +\documentclass[openany]{book} +\usepackage{tabularx} +\usepackage{graphicx} + +\title{Lib2geom Manual} + +\newcommand{\code}[1]{\textsf{#1}} + +\begin{document} +\maketitle{} + +\chapter{Overview} + +\section{Introduction} + +This manual focuses on the lib2geom computational geometry framework. +The main goal of this framework is the eventual replacement of +Inkscape's multiple and shoddy geometry frameworks. As with any decent +module or lib, 2geom is designed to achieve the desired functionality +while maintaining a generality encouraging usage within other +applications. The focus on robust, accurate algorithms, as well as +utilization of newer and better representations makes the lib +very attractive for many applications. + +\section{Design Considerations} +2Geom is written with a functional programming style in mind. +Generally data structures are considered immutable and rather than +assignment we use labeling. However, C++ can become unwieldy if +this is taken to extreme and so a certain amount of pragmatism is +used in practice. In particular, usability is not forgotten in the +mires of functional zeal. + +The code relies strongly on the type system and uses some of the more +'tricky' elements of C++ to make the code more elegant and 'correct'. +Despite this, the intended use of 2Geom is a serious vector graphics +application. In such domains, performance is still used as a quality +metric, and as such we consider inefficiency to be a bug, and have +traded elegance for efficiency where it matters. + +In general the data structures used in 2Geom are relatively 'flat' +and require little from the memory management. Currently most data +structures are built on standard STL headers\cite{stl}, and new and +delete are used sparingly. It is intended for 2Geom to be fully +compatible with Boehm garbage collector\cite{boehm} though this has +not yet been tested. + +\section{Toy-Based Development} +We have managed to come up with a method of library development +that is perfect for geometry: the development of toys exemplifying +a feature while the feature is perfected. This has somewhat subsumed +the role of tests, and provides immediate motivation/reward for work. + +Every toy uses the same framework, which hides the details of making a +user interface. You simply request some handles to interact with, and +write some code to draw the output from the handles. + +\begin{figure} + \begin{center} + \includegraphics[width=90mm]{media/gear.png} + \caption{The gear toy demonstrates constructing paths, and computing a path with a known function for the teeth.} + \label{fig:gear-toy} + \end{center} +\end{figure} + +Every toy can save a screenshot in SVG, PDF or PNG format. You can +save the current handles to a handle file (.hnd) and load an existing +handle file. Every toy can be called with \verb|-s filename| to save +a screenshot to file filename (the type being determined by the +extension). The toy can be started in a known state from a handle +file. + +If you find some strange or buggy behaviour, save a handle file and a +screenshot and submit them with your bug report. + +\section{Getting started} + +Build the library and play with all the toys in src/2geom/toys. Copy one that is similar to the problem you want to solve, and modify it. For example, say you wanted to compute the involute of a curve. + +An involute of a curve is defined by +$$I(t) = B(t) - \frac{dB(t) \int_0^t|dB(\tau)|_2 d\tau}{|dB(\tau)|_2}$$ + +If we reparameterise this curve to have unit speed (arc length parameterisation) the equation simplifies to: + +$$I(t) = B(t) - \frac{dB_x(t) t}{1}$$ + +so if we can reparameterise a path to have unit speed the involute is almost trivial. Let's start with \verb|arc_length_param.cpp|. We see that the function required is simply: +\begin{verbatim} +Piecewise<D2<SBasis> > uniform_B = arc_length_parametrization(B); +\end{verbatim} + +Take the resulting function and apply the calculations. You'll get +the involute of the curve, as shown in Figure~\ref{fig:involute-toy}. +We do not include an involute toy, but we would welcome someone to +work out how to make non-circular gears. + +\begin{figure} + \begin{center} + \includegraphics[width=70mm]{media/involute.pdf} + \caption{The output of an involute toy.} + \label{fig:involute-toy} + \end{center} +\end{figure} + + +\chapter{Geometric Primitives} + +What good is a geometry library without geometric primitives? By this +I mean the basic stuff that every decent geometry library has: +Points/Vectors, Matrices, etc. + +2geom's primitives are descendant from libNR's geometric primitives. +They have been modified quite a bit since that initial import, and +will likely change in the future. + +\section{Points} + +\includegraphics[height=30mm]{media/point.png} + +The mathematical concepts of points and vectors are merged into the +2geom class called \code{Point}. See Appendix A for a further +discussion of this decision. + +2geom also breaks with the more traditional point \code{struct} with +\code{.x} and \code{.y} fields. Rather, each 2geom point has a 2 +element array of coordinates. + +We found that the availability of \code{.x} and \code{.y} encouraged +people to attempt to inline geometry operations rather than using the +operators, perhaps in pursuit of a performance enhancement. By using +an array, we encourage people to think about \code{Point}s as +symmetric objects and discourage direct use of the components. We +still provide direct access for the rare occasion that it is needed. +Even in these cases, the array method prevents bugs by encouraging +iteration over the array rather than explicit element reference. + +\section{Transformations} + +Affine transformations are either represented with a canonical 6 +element matrix, or special forms. + +\subsection{Scale} + +\includegraphics[height=50mm]{media/scale.png} + +A \code{Scale} transformation stores x and y scaling factors. + +\subsection{Rotate} + +\includegraphics[height=50mm]{media/rotate.png} + +A \code{Rotate} transformation uses a vector(\code{Point}) to store +a rotation about the origin. + +In correspondence with mathematical convention (y increasing upwards), +0 degrees is encoded as a vector pointing along the x axis, and positive +angles indicate anticlockwise rotation. So, for example, a vector along +the y axis would encode a 90 degree anticlockwise rotation of 90 degrees. + +In the case that the computer convention of y increasing downwards, +the \verb}Rotate} transformation works essentially the same, except +that positive angles indicate clockwise rotation. + +\subsection{Translate} + +\includegraphics[height=70mm]{media/translate.png} + +A \code{Translate} transformation is a simple vector(\code{Point}) +which stores an offset. + +\subsection{Matrix} + +\includegraphics[height=70mm]{media/matrix.png} + +A \code{Matrix} is a general affine transform. Code is provided for +various decompositions, constructions, and manipulations. A +\code{Matrix} is composed of 6 coordinates, essentially storing the +x axis, y axis, and offset of the transformation. A detailed +explanation for matrices is given in Appendix B. + +\subsection{D2} +The \code{D2} class takes two instances of a scalar data type and treats them like a point. All operations which make sense on a point are defined for D2. + +A \verb|D2<double>| is a \code{Point}. A \verb|D2<Interval>| is a standard axis aligned rectangle. +\verb|D2<SBasis>| provides a 2d parametric function which maps $t$ to a point $x(t), y(t)$ +\verb|D2<SBasis2d>| provides a 2d parametric function which maps a point $u,v$ to a point $x(u,v), y(u,v)$ --- a distortion. + +\section{Bounding Structures} + +2geom currently provides two classes for storing approximate bounding +regions: \code{Rect} and \code{ConvexHull}. These are mostly intended +for use in (mathematical) optimization, however provide manipulations suitable for +other uses. + +\subsection{Interval} + +An interval is simply a pair of Coords which define a closed interval $[min, max]$. + +\subsection{Rect} + +\includegraphics[height=50mm]{media/rect.png} + +\code{Rect}s are rectangles with all sides parallel to the axes. +\code{Rect}s are in fact defined as a \verb|D2<Interval>|. + +A rectangle can have 0 area and not be empty --- $[0,0] \times [0,0]$ contains exactly 1 point 0,0 and has 0 area. Similarly, $[0,0] \times [0,1]$ defines a 0 area line segment. + +\subsection{ConvexHull} + +\includegraphics[height=50mm]{media/convex.png} + +\verb|convex-cover.h| defines convex hulls with a set of points in clockwise direction. These can bee unioned and tested for intersection. + +\subsubsection{Operations} +\begin{description} +\item[empty:] contains no points +\item[singular:] contains exactly one point +\item[linear:] all points are on a line +\item[area:] area of the convex hull +\item[furthest:] furthest point in a direction (log time) +\item[intersect:] do two convex hulls intersect? +\item[intersection:] find the convex hull intersection +\item[merge:] find the convex hull of a set of convex hulls +\item[hausdorf distance:] the greatest least distance between a point $a$ in convex hull $A$ and a second convex hull $B$. +\end{description} + +\subsection{Piecewise} +The \code{Piecewise} class manages a sequence of elements of a type as +segments and the 'cuts' between them. These cuts are time values which +separate the pieces. This function representation allows for +more interesting functions, as it provides a viable output for operations +such as inversion, which may require multiple SBasis to properly invert +the original. + +As for technical details, while the actual SBasis segments begin on the +first cut and end on the last, the function is defined throughout all +inputs by extending the first and last segments. The exact switching +between segments is arbitrarily such that beginnings (t=0) have +preference over endings (t=1). That is, each segment is $[t_0, t_1)$. +This only matters if it is discontinuous at the location. + +$$ +f(t) \rightarrow \left\{ +\begin{array}{cc} +s_1,& t <= c_2 \\ +s_2,& c_2 <= t <= c_3\\ +\ldots +s_n,& c_n <= t +\end{array}\right. +$$ + +\chapter{Paths} + +A \code{Path} is an ordered set of \code{Curve}s. Each \code{Path} is $C0$ continuous. To make multiple contours for a region, use \code{PathVector}. + +A \code{PathVector} in Inkscape is drawn in a single fill and stroke. + +This allows us lots of flexibility with what sort of elements we can +'understand', while only taking slightly more memory than a sequence +of points in the poly line or poly bezier case. + +The Curves themselves are immutable, which means that they can be shared between Paths. + +There is an implicit line segment from the initialPoint to the finalPoint which is used if the path is closed. + +An empty (size() == 0) path defines a naked move to. + +\section{Curves} +2Geom has a diversity of curve types and conversions between them. + +Curves define a continuous segments which yields points for values of +t in the range of [0,1]. The start-point is at t=0, and the endpoint +at t=1. + +We require that each \code{Curve} implements virtual functions which +allow for traversers of a path to perform generic operations. All +curves must provide functions which give a position and gradient of a +$t \in [0,1]$, bounds functions, and conversion to s-basis. + +\subsection{Bezier Curve} +We use a \code{Bezier} curve class to store lines and quadratic/cubic +beziers. This flexibility is attained by templating on order: +\code{Bezier$<1>$} is a line segment, \code{Bezier$<2>$} is a quadratic +bezier, and \code{Bezier$<3>$} is a cubic bezier. + +Bezier curves have some nice properties: +\begin{itemize} +\item Affine transforming the handles also affine transforms the values. +\item The convex hull of the handles encompasses the curve. +\end{itemize} + +\subsection{SVG Elliptical Arc} +The \code{SVGEllipticalArc} curve class is implemented for support of +the SVG elliptical arc. See the svg documentation for details on this +curve. + +\subsection{S-Basis Curve} +The \code{SBasisCurve} wraps the \code{MultidimSBasis$<2>$} class +described later. + +\subsection{Possible Future Curve Types} +\begin{itemize} +\item Clothoids / Raphoids +\item NURBS +\end{itemize} + +\chapter{S-Power-Basis Form} + +2Geom provides a very powerful algebra for modifying paths. Although +paths are kept in an extended SVG native form where possible, many +operations require approximation. To do this we can convert a path +into a sequence of symmetric power basis polynomials, henceforth +referred to as s-basis, perform the required operations and convert +back, approximating to a requested tolerance as required. + +The precise details of the s-basis form are beyond the scope of this +manual, the interested reader should consult \cite{SanchezReyes1997,SanchezReyes2000,SanchezReyes2001,SanchezReyes2003,SanchezReyes2005}. +An elementary, functional description is given in Appendix C. + +Geometrically important properties: +\begin{itemize} +\item exact representation of bezier segments +\item low condition number on bezier conversion. +\item strong convergence guarantees +\item $C^0$ continuity guarantee +\end{itemize} + +The following operations are implemented and are very efficient: +\begin{itemize} +\item fast conversion from all svg elements +\item basic arithmetic --- $+$, $-$, $\times$, $\div$ +\item algebraic derivative and integral +\item elementary trigonometric functions: $\sqrt{\cdot}$, $\sin(\cdot)$, $\cos(\cdot)$, $\exp(\cdot)$ +\item efficient degree elevation and reduction +\item function inversion +\item exact solutions for many non trivial operations +\item root finding +\item composition +\end{itemize} + +All of these operations are fast. For example, multiplication of two +beziers by converting to s-basis form, multiplying and converting back +takes roughly the same time as performing the bezier multiplication +directly, and furthermore, subdivision and degree reduction and +elevation are straightforward in this form. + +\section{Implementation} +As described in Appendix C, SBasis functions have the form $f(t) \rightarrow y$. +Just S-Basis functors (in the C++ sense) alone are not enough to perform +useful geometric operations. There are quite a few 2geom classes to +address these needs. + +\subsection{SBasis} +The \code{SBasis} class provides the most basic function form, +$f(t) \rightarrow y$. This is useful in its own right, as well as being an +element of constructing more complicated forms. \code{SBasis} are made +up of \code{BezOrd}s, which store from/to values for each polynomial +coefficient. + +\subsection{SBasis2D} +SBasis2D provides multivariate form --- functions of the form +$f(u,v) \rightarrow z$. These can be used for arbitrary distortion +functions (take a path $p(t) \rightarrow (u,v)$ and a pair of surfaces +$f(u,v),g(u,v)$ and compose: $q(t) = (f(p(t)), g(p(t)))$. + +Subdivision for surfaces may be done with either quadtrees or kd-trees. + +In general it is recommended to use the \verb|Piecewise<SBasis>| type rather than the SBasis type directly, as it manages the domain arithmetic automatically. It also automatically subdivides when necessary to improve accuracy/convergence. + +\chapter{2D databases} + +2Geom provides an implementation of a 2D database using quad trees and +using a list. Quad trees aren't the best data-structure for queries, +but they usually out perform the linear list. We provide a +standard interface for object databases with performance guarantees +and provide a set of useful operations Operations: + +\begin{description} +\item[Insert:] given a bounding box and a 'reference', insert into the db +\item[Delete:] given a bounding box and a 'reference', delete from the db +\item[Search:] given a box, find all objects that may interact with this box +\item[Cast:] given a path (including rays) return a list of objects that interact with the path, roughly sorted by path order +\item[Shape query:] given a closed path, find all objects whose bounding boxes intersect path. (this and cast are nearly the same) +\item[Nearest:] given a point (or maybe box) find the nearest objects, perhaps as a generator to get all objects in order. To do this, we walk around the quad tree neighbourhood, pushing all the elements into a priority queue, while the queue is empty, move out a bit. Nearest could be manhattan, max norm or euc? +\item[Binary:] take two dbs, generate all pairs that have intersecting boxes. +\item[Sweep:] traverse the tree in say y order, maintaining a y-range of relevant objects. (to implement sweepline algorithms) +\item[Walk:] traverse the tree in an arbitrary order. +\end{description} + +\chapter{Root like operations} + +\section{Roots} + +Given a function $x(t)$ we often wish to know where it is 0. +$roots(x)$ quickly finds all values of $t \in [0,1)$ for which this is +true. For example, if you wish to find where a path intersects a line you can rotate the path to make the line the x-axis and find the crossings with roots: $B(t) = \langle x(t), y(t)\rangle$, $roots(B \cdot \vec n)$. + +\section{Path intersection} + +Given a pair of paths, we often wish to know where they intersect. \verb|pair_intersect| finds all points where $A(t) = B(s), t \in [0,1], s \in [0,1]$. This can be performed on paths or \verb|piecewise<d2<sbasis> >|. + +\section{Self intersection} + +Sometimes we wish to know where a path intersects itself. + +\section{Contour finding} + +Given a function $f(x, y)$ we wish to construct approximate paths such that $f = 0$. Find two points on the same contour and use \verb|sb2d_cubic_solve|. (still needs code to refine and integration with aa.cpp to find the initial points) + +\section{Collinear normals} + +Given two paths we wish to find all pairs of points where a line through these points is parallel to the normal at that point. + +\section{Bounds: fast and exact} + +We provide two classes of bounding for functions, fast and exact. +Fast is merely guaranteed to contain the function, Exact is the +smallest bound that completely contains the function. + +\chapter{Topological operations: sweepline, boolops, sanitize} +\section{Layer 1: Path Intersection} + +\begin{verbatim} +src/path-intersection.cpp +src/path-intersection.h +src/crossing.h +src/crossing.h +src/toys/winding-test.cpp +\end{verbatim} + +\subsection{Winding Number:} + the number of times the path goes around a particular point. Since paths are closed, the result is always integral. A counter-clockwise rotation corresponds to a positive wind, whereas a clockwise rotation is represented as a negative wind. Here, and throughout, the terms clockwise and counter-clockwise refer to the standard mathematical coordinate system rather than the computer, inverted y-axis, coordinate system. + +\subsection{Crossing:} + a location where two paths cross. This is a subset of the intersections of the paths, with the requirement that the winding must change. Crossings are stored as two time values and a boolean indicating the relationship between the curves at the crossing. A particular time value corresponds to the point on curve i at f, where i is the integral part, and f is the fractional part. This boolean is useful for making decisions during a traversal of crossings. It is defined as the sign of the cross product of the derivatives. When the paths are regions with the same winding, this indicates that along B, A crosses 'outside'. + +\subsection{Winding functions:} + +\verb|int winding(Path, Point);| +\verb|bool path_direction(Path);| — assumes the path is simple (like a region) +\verb|bool contains(Path, Point, bool even-odd = true);| — convenience wrapper around winding + +There are a few convenience typedefs for the popular crossing collections: +\verb|typedef std::vector<Crossing> Crossings;| +\verb|typedef std::vector<Crossings> CrossingSet;| + +The intersection system is designed to be modular, so that different algorithms may be used. The current algorithms are generic, and apply to anything that implements Curve. A custom curve type might provide an algorithm with special cases, and default to the generic algorithms. The following crossing functions use the DefaultCrosser, which is currently a simple binary search. + +\verb|Crossings crossings(Path, Path);| — finds the crossings between two paths +\verb|CrossingSet crossings(PathVector, PathVector);| — finds the crossings between two sets of paths. + + +\section{Layer 2: Regions} + +\begin{verbatim} +src/region.cpp +src/region.h +\end{verbatim} + +\subsection{Region:} +A limited point-set, defined by a boundary. This boundary is stored as a simple (non-self-crossing) path. Regions with positive winding (counter-clockwise) include points which are inside the boundary (fills), whereas Regions with negative winding include all points outside the boundary (holes). It also caches information such as winding direction and bounding box. + +Most of the public api for region simply wraps and caches queries to a Path. It also provides various convenience functions such as \verb|as_fill| and \verb|as_hole|. Region should usually only be used by clients of this library when dealing with paths with the same invariants as regions. + + +\section{Layer 3: Shapes} + +\begin{verbatim} +src/shape.cpp +src/shape.h +src/toys/boolops.cpp +\end{verbatim} + +\subsection{Shape:} +A point-set upon which boolean operations may be performed. Shapes are defined by a list of regions, where the resulting point-set is the cumulative intersection. Though it may be figured out from the regions, shapes also store whether the most outer paths are fill or hole. In other words, it stores the value of all the points completely outside the boundary of all its constituent regions. Shapes have the following invariants: + +\begin{itemize} +\item{ The regions must not cross, or intersect for more than a point.} +\item{ Filled regions only contain 'hole' regions, and vice-versa.} +\item{ The 'top level' regions are all the same type (fill or hole).} +\end{itemize} + +The shape files really constitutes the main body of my work, while the other stuff is peripheral support. It contains the algorithms which perform boolean operations and sanitization on shapes. + +The most important function looks like this: + +\verb|Shape shape_boolean(bool, Shape, Shape, CrossingSet);| + +If the initial boolean is false, the function unions the shapes. If it is true, it intersects them. The CrossingSet contains the crossings between the regions of the two shapes (an overload of this function allows omission of this parameter). The functions operation is actually surprisingly simple. It traverses the crossings, keeping track of which it has hit, collecting portions of path as it goes, until it reaches a crossing it has already visited, at which point it stores the path and starts again at an unvisited crossing. + +The real magic happens in the traversal. It took me quite a long time to really figure it out, but eventually I realized that quite simple logic would allow for traversing intersecting sets of regions correctly. If the boolean input doesn't equal the direction of the crossing, path A is followed, if they are equal, the path B is followed. I actually figured this particular bit fairly early on, but it was with a pair of regions. At the time I had no idea it could also work for doing boolean operations on sets of regions. + +While the previous function contains the main code, the actual public function intended for public use is quite different. +\verb|Shape boolop(Shape, Shape, unsigned)| + +It takes the two shapes, and a flag integer specifying which of 16 boolean operations to perform. These flags use the first 4 bits to represent a boolean truth table. This is the function which is used in the boolops toy. Half of the operations, the complements, deal with cases where the output shape is filled in areas where neither of the input shapes are. The binary complement operation(~) applied to the flags, will yield flags specifying the complementary boolean operation. 6 of the combinations of flags don't even call \verb|shape_boolean| - the various identity, inversion, and none/all operations. + +\begin{verbatim} +src/sweep.cpp +src/sweep.h +src/toys/sweep.cpp +src/tests/intersection-test.cpp +\end{verbatim} + +These are some support algorithms which provide a sweep on bounds, for efficient intersections between sets of bounded objects. +\section{Current Issues} + +The main current deficiency is the sanitizer. I've only recently managed to get a path uncrosser somewhat working. I have a variety of sanitization methods implemented to various degrees, yet have only recently figured out the real reasons I haven't yet gotten it fully functioning. I hope to fix it soon, so that boolops may be used as a live-path-effect within inkscape (the live-path-effects project is a Summer-of-Code project). I think this is a good way to introduce the new boolean operations, and I definitely want my work to be used. + +There's also some code which is currently unused: + +I have an implementation of intersection routines which splits paths into monotonic portions, and uses the properties of these sections to perform very fast intersection. It works somewhat, but there are bugs I haven't had time to work out, which make the current implementation unstable. This intersection algorithm is especially valuable for self intersections, as monotonic splits are already required. + +\section{Possible Future Design Changes} + +It may be possible for the boolean operations to return a set of portions. When the actual path data is required, the portion operations would be applied. The actual boolean operations would take no time to execute, as all the computational load would be in the crossing-finder and path synthesizer. This would also work for the sanitization step, saving many spurious portions. The portions found in the boolean operations could be composed onto those produced by the sanitization routine, so that the unnecessary intermediary paths between sanitization and boolean operations are never generated. + +The current representation of crossings between sets of paths is fairly awkward. The main core of the data structure, storing times and the direction boolean is fine, the main issue is the storage methods of collections of these crossings. I've come to realize it's actually one of the main reasons that sanitization is as hard as it has been. I've figured out that a better representation would be for each crossing to store pointers to the next and previous crossings along both its participating paths. This would form a connectivity graph, where each vertex has a degree of 4. A dedicated structure such as this would likely be worth it, as algorithms that use it would be more efficient, simpler, and less buggy. + +Without too much work, it should also be possible to do boolean operations with non-filled paths. The main change would be to have \verb|shape_boolean| handle coincident crossings, and to derive the resultant region fill from the fill of the contributing regions. This would allow all combinations of boolean operations between filled regions and paths. + +\chapter{Acknowledgements and history} + +2Geom is a group project, having many authors and contributors. The +original code was sketched out by Nathan Hurst and Peter Moulder for +the Inkscape vector graphics program to provide well typed, correct +and easy to use C++ classes. Since then many people have refined and +debugged the code. One of the earliest C++ification projects for +inkscape was replacing NRPoint with NR::Point. + +A conspicuous absence was a Path datatype, and indeed Inkscape +developed at least 3 different internal path datatypes, plus several +others in related projects. Considering the core importance of path +operations in vector graphics, this led to much re-implementation of +algorithms, numerous bugs, and many round trips converting between +forms. + +Many attempts have been made to try and develop a single path data +structure, but all were fated to sit in random SCMs scattered across +the web. + +Several unrelated projects had copied out various portions of the NR +code from Inkscape and in 2006 MenTaLguY and Nathan felt that it was +time to separate out the geometry portions of inkscape into a +separate library for general use and improvement. The namespace was +changed from NR to Geom and a prototype for paths sketched out. +Nathan studied the state of the art for computational geometry whilst +MenTaLguY focused on the design of Paths. + +Before the re-merging of 2Geom with the inkscape svn HEAD it was felt +that a few smaller projects should be ported to use 2Geom. Michael +Wybrow's libavoid advanced connector routing system was ported first. + +--now. + +\pagebreak + +\section{People who have contributed to 2Geom} +\begin{description} +\item[Aaron C.\ Spike] +\item[Alex Mac] +\item[Fred:] livarot +\item[Javier Sanchez-Reyes] +\item[Jean-Francois Barraud] +\item[Johan B.\ C.\ Engelen] +\item[Jonathon Wright] +\item[Joshua Blocher] +\item[Kim Marriott] +\item[Marco Cecchetti] +\item[MenTaLguY] +\item[Michael J.\ Wybrow] +\item[Michael G.\ Sloan] +\item[Nathan J.\ Hurst] +\item[Peter J.\ R.\ Moulder] +\end{description} + +\chapter{Appendix} +\renewcommand{\thesection}{\Alph{section}} + +\section{Geometric Points} +In standard geometry, points and vectors are quite distinguished: a +point is a location, whereas a vector is an unbased direction and +magnitude. Allowed operations on vectors and points also vary: + +\begin{tabular}{r l} + $P - P$ & $= V$ \\ + + $P - P$ & $= V$ \\ + + $P + V$ & $= P$ \\ + + $P - V$ & $= P$ \\ + + $V + V$ & $= V$ \\ + + $V - V$ & $= V$ \\ + + $V \times S$ & $= V$ \\ + + $V \div S$ & $= V$ \\ +\end{tabular} + +Here, $P$ represents points, $V$ represents vectors, and $S$ scalars. + +Ideally we would render these restrictions in code, as they would +reinforce algorithm correctness. This is because as far as arithmetic +operations go, the above are all that you sanely require, unless you +are prematurely optimizing. + +\section{Understanding Matrices} + +\section{S-Power-Basis Explanation} + +\section{Concepts} + +The C++ Standard Template Library\cite{stl} introduces the notion of +\emph{concepts}\cite{stl_concepts}, which specify families of types related +by a common interface. In template-based programming with the STL, concepts +serve a similar purpose to type classes in Haskell. While, unlike Haskell's +language-level support for type classes, concept-checking is not directly +supported by the C++ compiler or language, C++ libraries have been written +which use template techniques to provide compile-time checking and enforcement +of concepts\cite{boost_concept_check}. + +There are several important lib2geom concepts in this sense: + +\subsection{ScalarFunction} + +\subsubsection{Description} + +Scalar functions are C++ function objects which behave like functions +with type {\tt double (double)}. They take a single time value and return +a scalar, and are defined over at least the interval $[0, 1]$. + +\subsubsection{Refinement of} + +\subsubsection{Associated types} + +\subsubsection{Notation} + +\begin{tabular}{r l} + {\tt X} & A type which models ScalarFunction \\ + {\tt a} & An object of type {\tt X} \\ + {\tt t} & A time value of type {\tt double} \\ + {\tt n} & A count of type {\tt unsigned int} \\ +\end{tabular} + +\subsubsection{Definitions} + +\subsubsection{Valid expressions} + +\begin{tabularx}{300pt}{X l X l} + Name & Expression & Type requirements & Return type \\ + Evaluate & {\tt a(t)} & & {\tt double} \\ + Evaluate & {\tt a.valueAt(t)} & & {\tt double} \\ + Evaluate with derivatives & {\tt a.valueAndDerivativesAt(t, n, out)} & {\tt out} should be a model of OutputIterator whose {\tt value\_type} is convertible to & {\tt void} \\ + Range & {\tt a.fastRange()} & & {\tt Range} \\ + Range & {\tt a.exactRange()} & & {\tt Range} \\ + SBasis & {\tt a.sbasis()} & & {\tt SBasis} \\ + Subdivide & {\tt a.subdivide(start, end)} & & {\tt Piecewise<X>} \\ +\end{tabularx} + +\subsubsection{Expression semantics} + +\begin{tabularx}{300pt}{X l l X l} + \bf{Name} & \bf{Expression} & \bf{Precondition} & \bf{Semantics} & \bf{Postcondition} \\ + Evaluate & {\tt a(t)} & $0\le t\le 1$ & Returns the value of the function at $t$; the function must be exact at $t = 0$ and $t = 1$ and defined over the interval $0\le t\le 1$ & \\ + Evaluate & {\tt a.valueAt(t)} & $0 \le t \le 1$ & Returns the value of the function at {\tt t}; the function must be exact at $t = 0$ and $t = 1$ and defined over the interval $0 \le t \le 1$ & \\ + Evaluate with derivatives & {\tt a.valueAndDerivativesAt(t, n, out)} & $0 \le t \le 1$ & Evaluates the function and the first n derivatives at {\tt t}, writing them to {\tt out} & $n + 1$ values have been written to {\tt out} \\ + Range & {\tt a.fastRange()} & & The result should be a {\tt Range} which includes the function's range & \\ + Range & {\tt a.exactRange()} & & The result should be a {\tt Range} representing the exact range of the function & \\ + SBasis conversion & {\tt a.sbasis()} & & The result should be an sbasis approximation of the function & \\ +\end{tabularx} + +\subsubsection{Complexity guarantees} + +\subsubsection{Invariants} + +\subsubsection{Models} + +\subsection{Curve} + +\section{Location Sequences} + +Many algorithms are more efficient on a sorted sequence of locations, +than calling the function repeatedly for each. So we have algorithms +that take a sequence of locations, assumed in order, and perform an +action on those. For example, cutting a path at one location is +basically linear in the number of path segments, but cutting a path in +10 locations is still about the same amount of work. Similarly, +working out the arc length for a location is about the same amount of +work as working out the arc length for 1000 locations on that path. + +Many operations are best described as returning an ordered set of +locations. For example, we have a function that returns +intersections between two paths. Rather than return just one +intersection, we might return all intersections, either in order along +the path, or in order of distance along other path. +% I don't understand the distinction between "order along the path" and "order +% of distance along the path". As for the case of a path that goes back on +% itself, e.g. a path whose y coordinate is unchanging and whose x coordinate +% goes from 0 to 10 then back to 5 then to 15, I think most callers (including +% the dashes case below) want it to behave the same as if the y coordinate did +% change, i.e. want the same point reported three times if there's an +% intersection at x=7. Whereas the case of a "stationary path" (bezier whose +% control points are all coincident) is considered to have just one point and +% zero length. -- pjrm. + +Think about dashes: a dash is a fixed arclength offset. So rather +than getting the location for a point at arc length 1, at arc length +2, 3, 4, $\ldots$, up to the length of the curve, instead we just ask for all of +these, and the algorithm can chug along the curve outputting the +answer for each. The reason it is faster is because to work out the +location at arc length say 100, we basically need to work out the +length for many spots up to 100. + +Perhaps we then want to split the curve at each of those points. To +split a segment at a location first requires finding that segment, +then splitting it and finally constructing a new path to output a whole +new path so we can fit the two new segments in. If we started at the +beginning, and split at the first location, then that would be $n+1$ steps: $n$ +segs in the original, plus an extra one. If we wanted to split at 100 +points, it would be $n+1$ steps for the first, $n+2$ for the +second, $\ldots$, $n+100$ steps for the last, this would take a total of $100n + +100*101/2$ steps! Whereas, if we split as we went along, it would take +just $n+100$ steps. + +The downside is that I'll probably not provide a separate split +routine that takes a single point, to discourage people from making +exactly that mistake. + +\bibliographystyle{plain} % A good style to use with the Harvard package +\bibliography{manual}\label{chapter:bibliography} + +\end{document} diff --git a/doc/manual2/ack b/doc/manual2/ack new file mode 100644 index 0000000..c6325fd --- /dev/null +++ b/doc/manual2/ack @@ -0,0 +1,47 @@ +h1. Acknowledgements and History +2Geom is a group project, having many authors and contributors. The +original code was sketched out by Nathan Hurst and Peter Moulder for +the Inkscape vector graphics program to provide well typed, correct +and easy to use C++ classes. Since then many people have refined and +debugged the code. One of the earliest C++ification projects for +inkscape was replacing NRPoint with NR::Point. + +A conspicuous absence was a Path datatype, and indeed Inkscape +developed at least 3 different internal path datatypes, plus several +others in related projects. Considering the core importance of path +operations in vector graphics, this led to much re-implementation of +algorithms, numerous bugs, and many round trips converting between +forms. + +Many attempts have been made to try and develop a single path data +structure, but all were fated to sit in random SCMs scattered across +the web. + +Several unrelated projects had copied out various portions of the NR +code from Inkscape and in 2006 MenTaLguY and Nathan felt that it was +time to separate out the geometry portions of inkscape into a +separate library for general use and improvement. The namespace was +changed from NR to Geom and a prototype for paths sketched out. +Nathan studied the state of the art for computational geometry whilst +MenTaLguY focused on the design of Paths. + +Before the re-merging of 2Geom with the inkscape svn HEAD it was felt +that a few smaller projects should be ported to use 2Geom. Michael +Wybrow's libavoid advanced connector routing system was ported first. + +(TODO: did this happen? also, add the rest of history..) + +h2. People who have contributed to 2Geom +* Aaron C. Spike +* Alex Mac +* Fred: livarot +* Javier Sanchez-Reyes +* Jean-Francois Barraud +* Jonathon Wright +* Joshua Blocher +* Kim Marriott +* MenTaLguY +* Michael J. Wybrow +* Michael G. Sloan +* Nathan J. Hurst +* Peter J. R. Moulder diff --git a/doc/manual2/concepts b/doc/manual2/concepts new file mode 100644 index 0000000..e89bf55 --- /dev/null +++ b/doc/manual2/concepts @@ -0,0 +1,128 @@ +h1. Concept Checking + +The C++ Standard Template Library introduces the notion of _concepts_, +which specify families of types related by a common interface. In +template-based programming with the STL, concepts serve a similar +purpose to type classes in Haskell. While, unlike Haskell's language-level +support for type classes, concept-checking is not directly supported by the +C++ compiler or language, C++ libraries have been written which use template +techniques to provide compile-time checking and enforcement of concepts. +We use the Boost Concept Checking library. + +h2. Lib2geom's 'Concepts' + +There are several important lib2geom 'concepts'. + +h3. *FragmentConcept* + +This is perhaps the most important concept within lib2geom, as it defines +the interface for the basic, one-dimensional functions. Fragments are +defined on the interval [0,1], which is referred to as the _intended domain_ +of the function. Functions may be well defined for all values (many are), +but the 0-to-1 domain has significant semantic value. When the functions +are used to represent a *Curve*, 0 is the start and 1 is the end. + +h4. @ T::output_type @ + +Every fragment must typedef an *output_type*. This is usually *Coord*, however, +in order to support considering @D2<T>@ a fragment, this typedef was added. +This information is also used by the compiler to infer the proper bounds and +sbasis types. + +h4. Value Query + +<pre><code> +output_type T::valueAt(double); +output_type T::operator()(double); +output_type T::at0(); +output_type T::at1(); +</code></pre> + +*FragmentConcept* defines several methods for retrieving the value at a point. +One method is to use the *valueAt* function, which returns output_type given +a t-value. Fragments are also functors, which in C++ lingo means they look +like function calls, as they overload the () operator. This is essentially +the same as calling valueAt. The functions *at0* and *at1* are also +provided, and should be used whenever the start or end of the function is +required, as many functions directly store this information. + +h4. @ sbasis_type T::toSBasis() @ + +As *SBasis* will be the main function representation, it is desirable to always +be able to approximate and deal with other functions in this way. Therefore, +the *toSBasis* function is required. When *output_type* is @double@, +@sbasis_type@ is *SBasis*. When *output_type* is *Point*, @sbasis_type@ is +*SBasisCurve*. + +(TODO: in writing this it occurs to me that toSBasis should take a tolerance) + +h4. @ T reverse(T) @ + +As most of the implementors of fragment consider functions in a fairly +symmetric way, the *reverse* function was included in the *FragmentConcept*. +*reverse* flips the function's domain on 0.5, such that f'(t) = f(1-t). + +h4. Bounds + +<code><pre> +bounds_type bounds_fast(T); +bounds_type bounds_exact(T); +bounds_type bounds_local(T, Interval); +</pre></code> + +Finding the bounds of a function is essential for many optimizations and +algorithms. This is why we provide 3 functions to do it. *bounds_fast* +provides a quick bounds which contains the actual bounds of the function. +This form is ideal for optimization, as it hopefully does not require too +much computation. *bounds_exact*, on the other hand, provides the exact +bounds of the function. *bounds_local* only returns the bounds of an +interval on the function - at the moment it is unclear if this is exact. +When *output_type* is @double@, @bounds_type@ is *Interval*. When +*output_type* is @Point@, @bounds_type@ is *Rect*. + +See the linear.h code for an example of an implementation of *FragmentConcept*. + +h3. *OffsetableConcept* + +*OffsetableConcept* defines what it means to be offsetable. Like +*FragmentConcept*, this concept requires an output_type, which is used +as the offset type. This still makes since when the implementor is +also a fragment, as in pretty much all cases you would want to offset +a function using the same type it outputs. + +The following operators are defined by *OffsetableConcept*: + +@T + output_type, T - output_type, T += output_type, T -= output_type@, + +h3. *ScalableConcept* + +*ScalableConcept* defines what it means to be scalable. Like +*OffsetableConcept*, it requires an output_type, which is used as the +scalar-type. This is an assumption that may not pan out in the future, +however, for all function types we've used this always applies. +Technically points should not be multiplicable, however, they provide a +convenient storage mechanism for non-uniform scaling. If this changes +in the future, the implementations will remain the same, while the +concept definitions are loosened. + +The following operators are defined by *ScalableConcept*: +@T * scalar_type, T / scalar_type, T *= scalar_type, T /= scalar_type, -x@, + +h3. *AddableConcept* + +*AddableConcept* defines a concept for classes which are closed under +addition (the classes may be added to themselves, and the result is the +same type). The following operators are included: + +@x + y, x - y, x += y, x -= y@ + +h3. *MultiplicableConcept* + +*MultiplicableConcept* defines a concept for classes which are closed under +multiplication (the classes may be multiplied by themselves, and the result +is the same type). The following operators are included: + +@x * y, x *= y@ + +At some point a DividableConcept may be implemented, however, at the moment +it is not very useful. diff --git a/doc/manual2/d2 b/doc/manual2/d2 new file mode 100644 index 0000000..b4769e0 --- /dev/null +++ b/doc/manual2/d2 @@ -0,0 +1,106 @@ +h1. Dealing with two Dimensions: *D2* + +After writing a few classes for two dimensional objects, we realized +that there is a lot of boilerplate associated with what is essentially +lifting one dimensional concepts into two. Instead of frequently +rewriting this code, we instead created the *D2* template class. + +For example, a point in space might be represented by *D2<double>*. +This may, in fact, become the actual representation for Point. +We have not yet replaced Point with this, as not all of Points +operations have been ported (or are applicable), and we are not +yet sure if there is 0 performance loss. + +(TODO remove previous stuff if D2<double> becomes point repr) + +h2. Component Access + +One might expect such an object to have @.x@ and @.y@ fields, however, +it instead consists of 2 element array. With LibNR, it was found that +the availability of @.x@ and @.y@ encouraged people to attempt to +inline operations rather than using the operators, perhaps in (vain) +pursuit of a performance enhancement. By using an array, we encourage +people to think about points as symmetric objects and discourage +direct use of the components. However, we still provide direct access +for the rare occasion that it is needed. Even in these cases, the array +method reduces bugs by encouraging iteration over the array rather than +explicit element reference. + +The components of a *D2* are accessed through the indexing operator, []. +The input value to the index operator is the @enum@ *Dim2*, which +defines *X* = 0 and *Y* = 1. This is to encourage using the +@for(int d=0; i<2; i++)@ idiom when normal operations do not suffice. + +h2. Arithmetic Operators + +@D2<T>@ implements the *AddableConcept*, *OffsetableConcept*, and +*ScalableConcept* (if @T@ implements them as well) yielding the +following operators: + +<pre><code> +AddableConcept: x + y, x - y, x += y, x -= y +OffsetableConcept: x + p, x - p, x += p, x -= p +ScalableConcept: x * p, x / p, x *= p, x /= p, -x + x * d, x / d, x *= d, x /= d +</code></pre> + +(where @x@ and @y@ are *D2*, d is *Coord*, and @p@ is a *Point* and all +return @D2<T>@) + +These operators all just apply the operation on @T@ to the components. +So, @a + b@ just returns @D2<T>(a[X] + b[X], a[Y] + b[Y])@, though the +actual code uses a loop (which is unrolled) in order to avoid +bugs. + +h2. Geometric Operations + +<pre><code> +T dot(D2<T> const &, D2<T> const &); +T cross(D2<T> const &, D2<T> const &); +</code></pre> + +The *dot*:http://en.wikipedia.org/wiki/Dot@product and +*cross*:http://en.wikipedia.org/wiki/Cross@product products are defined +on D2<T> when T implements *AddableConcept* and *MultiplicableConcept. +The cross function returns the length of the resultant 3d vector +perpendicular to the 2d plane. + +@ D2<T> operator*(D2<T> const &, Matrix const &)@ + +This operation applies an affine transformation to the 2d object. + +h2. Fragment Lifting + +*D2<T>* also implements FragmentConcept if T implements it as well, +allowing *D2* to lift one dimensional functions into two-dimensional +parametric curves. As a fragment, a *D2* will represent a function +from a double to a Point. + +h3. Fragment Operations + +In addition to the normal set of Fragment methods, D2 has the following +functions: + +h4. @ D2<T> compose(D2<T> const &a, T const &b); @ + +The *compose* function is defined when @T@ is a function representation which +supports composition. The only forms in 2geom are *SBasis* and *SBasis2d*. +The *D2* *compose* function composes @b@ on both components of @a@. This +makes sense, as a D2<SBasis> is double -> D2<double> and the function for +composition is double -> double. One way to think of composition is that +the output is equivalent to applying @b@ to the input, and then applying a +to @b@'s output. + +h4. @ D2<T> compose_each(D2<T> const &a, D2<T> &b); @ + +The *compose_each* function is similar to the *compose* function, except that +@b@ is also a *D2*, so instead of composing the same function on each component, +the two functions in @b@ are used. + + +h4. @ Point D2<T>::operator()(double x, double y) const @ + +*D2* wraps this operator for when @T@ is a function taking a 2 component input. +The only case of this currently within 2geom is SBasis2d. + +(TODO: derivative/integral) diff --git a/doc/manual2/geometric primitives b/doc/manual2/geometric primitives new file mode 100644 index 0000000..b78370e --- /dev/null +++ b/doc/manual2/geometric primitives @@ -0,0 +1,65 @@ +h1. Geometric Primitives + +What good is a geometry library without geometric primitives? By this +I mean the very basic stuff, Points/Vectors, Matrices, etc. + +2geom's primitives are descendant from libNR's geometric primitives. +They have been modified quite a bit since that initial import. + +h2. Point + +!media/point.png! + +The mathematical concepts of points and vectors are merged into the +2geom class called *Point*. See Appendix A for a further +discussion of this decision. + +Point may be interpreted as a D2<double> with some additional operations. + +(TODO: document these ops.) + +\section{Transformations} + +Affine transformations are either represented with a canonical 6 +element matrix, or special forms. + +\subsection{Scale} + +\includegraphics[height=50mm]{media/scale.png} + +A \code{Scale} transformation stores a vector representing a scaling +transformation. + +\subsection{Rotate} + +\includegraphics[height=50mm]{media/rotate.png} + +A \code{Rotate} transformation uses a vector(\code{Point}) to store +a rotation about the origin. + +In correspondence with mathematical convention (y increasing upwards), +0 degrees is encoded as a vector pointing along the x axis, and positive +angles indicate anticlockwise rotation. So, for example, a vector along +the y axis would encode a 90 degree anticlockwise rotation of 90 degrees. + +In the case that the computer convention of y increasing downwards, +the \verb}Rotate} transformation works essentially the same, except +that positive angles indicate clockwise rotation. + +\subsection{Translate} + +\includegraphics[height=70mm]{media/translate.png} + +A \code{Translate} transformation is a simple vector(\code{Point}) +which stores an offset. + +\subsection{Matrix} + +\includegraphics[height=70mm]{media/matrix.png} + +A \code{Matrix} is a general affine transform. Code is provided for +various decompositions, constructions, and manipulations. A +\code{Matrix} is composed of 6 coordinates, essentially storing the +x axis, y axis, and offset of the transformation. A detailed +explanation for matrices is given in Appendix B. + diff --git a/doc/manual2/introduction b/doc/manual2/introduction new file mode 100644 index 0000000..f8c71fc --- /dev/null +++ b/doc/manual2/introduction @@ -0,0 +1,41 @@ +h1. Introduction + +This manual focuses on the lib2geom computational geometry framework. +The main goal of this framework is the eventual replacement of +Inkscape's multiple and shoddy geometry frameworks. As with any decent +module or lib, 2geom is designed to achieve the desired functionality +while maintaining a generality encouraging usage within other +applications. The focus on robust, accurate algorithms, as well as +utilization of newer and better representations makes the lib +very attractive for many applications. + +h2. Design Considerations + +2Geom is written with a functional programming style in mind. +Generally data structures are considered immutable and rather than +assignment we use labeling. However, C++ can become unwieldy if +this is taken to extreme and so a certain amount of pragmatism is +used in practice. In particular, usability is not forgotten in the +mires of functional zeal. + +The code relies strongly on the type system and uses some of the more +'tricky' elements of C++ to make the code more elegant and 'correct'. +Despite this, the intended use of 2Geom is a serious vector graphics +application. In such domains, performance is still used as a quality +metric, and as such we consider inefficiency to be a bug, and have +traded elegance for efficiency where it matters. + +In general the data structures used in 2Geom are relatively 'flat' +and require little from the memory management. Currently most data +structures are built on standard STL headers, and new and delete are +used sparingly. It is intended for 2Geom to be fully compatible with +Boehm garbage collector though this has not yet been tested. + +h2. Toy-Based Development + +We have managed to come up with a method of library development +which is perfect for geometry - the development of toys exemplifying +a feature while the feature is perfected. This has somewhat subsumed +the role of tests, and provides immediate motivation/reward for work. + +!media/gear.png! diff --git a/doc/manual2/piecewise b/doc/manual2/piecewise new file mode 100644 index 0000000..9f1bd98 --- /dev/null +++ b/doc/manual2/piecewise @@ -0,0 +1,134 @@ +h1. *Piecewise* + +In order to represent functions with a complex shape, it is necessary +to define functions in a piecewise manner. In the graphics world this +sort of function, when parametric, is often referred to as a 'spline'. +Even beyond the representation of paths, it is also often necessary +for mathematical operations to return piecewise functions, as otherwise +the single-fragment versions would require an inordinate degree to +still be accurate. An example of this is the *inverse* function. + +In the world of lib2geom, this is implemented as the *Piecewise* +template class. It manages a sequence of fragment 'segments' and the +cuts between them. These cuts are the various t-values which separate +the different segments. + +h2. Cuts + +The first and last cuts of a piecewise define it's intended range, and +the intermediary cuts separate the segments. With indices, segment i +is always bordered on the left with cut i and on the right with cut i+1. +In general, c = s+1, where c is the number of cuts and s is the number +of segments. These invariants are checked by the +@bool Piecewise<T>::invariants();@ method. + +The cuts essentially define the position and scale of each segment. +For example, if the left and right cuts are 0.5 apart, the segment is +half its regular size; the derivative will be twice as big. + +h4. Cut Query Functions + +<pre><code> +unsigned Piecewise<T>::segN(double, int low = 0, int high = -1) const; +double Piecewise<T>::segT(double, int = -1) const; +double mapToDomain(double t, unsigned i) const; +</code></pre> + +These functions use the cut information to ascertain which segment a +t-value lies within ( *segN* ), and what the t-value is for that segment +at that particular point ( *segT* ). *segN* takes two optional parameters +which limit the range of the search, and are used internally as it is +defined as a recursive binary search. These may be used if you are sure +that the desired segment index lies within the range. *segT* takes an +optional parameter for the case where you already know the segment number. + +mapToDomain is the inverse of segT, as it takes a t-value for a particular +segment, and returns the global piecewise time for that point. + +h4. @ Interval Piecewise<T>::domain() const; @ + +The *domain* function returns the Interval of the intended domain of the +function, from the first cut to the last cut. + +h4. Cut Modification Functions + +<pre><code> +void Piecewise<T>::offsetDomain(double o) +void Piecewise<T>::scaleDomain(double s) +void Piecewise<T>::setDomain(Interval dom) +</code></pre> + +These functions very simply transform the cuts with linear transformations. + +h3. Technical Details + +As the cuts are simply a public std::vector, they may also be accessed as +@pw.cuts@. + +While the actual segments begin on the first cut and end on the last, +the function is defined throughout all inputs by extending the first +and last segments. The exact switching between segments is arbitrarily +such that beginnings (t=0) have priority over endings (t=1). This only +really matters if it is discontinuous at that location. + +In the context of 2d parametrically defined curves, the usefulness of cuts +becomes less apparrent, as they make no real difference for the display +of the curves. Rather, cuts become more of an agreement between various +functions such that the proper data aligns. + +h2. Construction + +Most of the time there is no need for raw construction of *Piecewise* +functions, as they are usually obtained from operations and other sources. + +The following constructors defined for *Piecewise*: +* The blank constructor +* A constructor which explicitly lifts a fragment to a *Piecewise* on [0,1] +* A constructor which takes the *output_type*, and creates a constant function + +<pre><code> +void Piecewise<T>::push_seg(T); +void Piecewise<T>::push_cut(double); +void Piecewise<T>::push(T, double); +</code></pre> + +The usual method for raw construction is to construct a blank *Piecewise* +function, and use these push methods to load the content. *push_seg* and +*push_cut* simply add to the segment and cut lists, although *push_cut* +also checks that the cut time is larger than the last cut. The current +recommended method for calling these functions is to have one initial +*push_cut*, followed by successive calls to *push*, as this will guarantee +that the cuts and segments properly align. + +h2. Operations + +h3. Arithmetic + +*Piecewise* has many arithmetic operations, and implements +*OffsetableConcept*, *ScalableConcept*, *AddableConcept*, and +*MultiplicableConcept*. The operations which operate on two Piecewise +functions (Addable and Multiplicable) work by interleaving the cuts using +mutual *partition* calls, and iterating the resulting segments. + +h3. Fragment Wrapping + +While *Piecewise* is not a fragment (it does not have the [0,1] domain), +it has many functions reminiscient of *FragmentConcept*, including the +bounds functions, () and valueAt. + +(TODO: reverse function?) + +h3. Concatenation + +<pre><code> +void Piecewise<T>::concat(const Piecewise<T> &other); +void Piecewise<T>::continuousConcat(const Piecewise<T> &other); +</code></pre> + +These functions efficiently append another *Piecewise* to the end of a +*Piecewise*. They offset the _other_ *Piecewise* in time such that it is +flush with the end of this *Piecewise*. *continuousConcat* is basically +the same except that it also offsets in space so the functions also match +in value. + +(TODO: compose/derivative/integral) diff --git a/doc/manual2/s-basis b/doc/manual2/s-basis new file mode 100644 index 0000000..5f2ddfb --- /dev/null +++ b/doc/manual2/s-basis @@ -0,0 +1,91 @@ +h1. S-Power-Basis-Forms + +2Geom provides a very powerful algebra for modifying paths. Although +paths are kept in an extended SVG native form where possible, many +operations require a more mathematical form. Our prefferred form is +a sequence of s-power basis polynomials, henceforth referred to as +s-basis. We may convert to this form, perform the required operations +and convert back, approximating to a requested tolerance as required. + +The precise details of the s-basis form are beyond the scope of this +manual - the interested reader should consult \cite{SanchezReyes1997,SanchezReyes2000,SanchezReyes2001,SanchezReyes2003,SanchezReyes2004}. +An elementary, functional description is given in Appendix C. + +(TODO: work out textile citations, math inclusion) + +Geometrically important properties: +* exact representation of bezier segments +* low condition number on bezier conversion. +* strong convergence guarantees +* $C^0$ continuity guarantee + +The following operations are directly implementable and are very efficient: +* fast conversion from all svg elements +* basic arithmetic - @+@, @-@, $\times$, $\div$ +* algebraic derivative and integral +* elementary trigonometric functions: $\sqrt{\cdot}$, $\sin(\cdot)$, $\cos(\cdot)$, $\exp(\cdot)$ +* efficient degree elevation and reduction +* function inversion +* exact solutions for many non trivial operations +* root finding +* composition + +All of these operations are fast. For example, multiplication of two +beziers by converting to s-basis form, multiplying and converting back +takes roughly the same time as performing the bezier multiplication +directly, and furthermore, subdivision and degree reduction are +straightforward in this form. + +h2. Implementation + +h3. *Linear* + +The *Linear* class represents a linear function, mostly for use as a +building block for *SBasis*. *Linear* fully implements *AddableConcept*, +*OffsetableConcept*, and *ScalableConcept* yielding the following operators: + +<pre><code> + AddableConcept: x + y, x - y, x += y, x -= y + OffsetableConcept: x + d, x - d, x += d, x -= d + ScalableConcept: x * d, x / d, x *= d, x /= d, -x +</code></pre> + +(where @x@ and @y@ are *Linear*, d is *Coord*, and all return *Linear*) + +As *Linear* is a basic function type, it also implements the *FragmentConcept*. + +The main *Linear* constructor accepts two *Coord* values, one for the Linear's +value at 0, and one for its value at 1. These may then later be accessed and +modified with the indexing operator, @[]@, with a value of 0 or 1. + +h3. *SBasis* + +The *SBasis* class provides the most basic function form, +$f(t) \rightarrow y$. *SBasis* are made up of multiple *Linear* elements, +which store to/from values for each polynomial coefficient. + +*SBasis*, like *Linear*, above, fully implements *AddableConcept*, +*OffsetableConcept*, and *ScalableConcept*. + +As *SBasis* is a basic function type, it implements the *FragmentConcept*. + +Usually you do not have to directly construct SBasis, as they are obtained +one way or another, and many of the operations are defined, however, *SBasis* +may be constructed as an implicit *Linear* cast, as a copy, or as a blank. +The class is actually an extension of @std::vector<Linear>@. This provides +the primary method of raw *SBasis* construction -- @push_back(Linear)@, which +adds another coefficient to the *SBasis*. + +*SBasis* also provides the indexing accessor/mutator, and due to its vector +nature, iteration. + +(TODO: wouldn't the indexing be provided by vector any way?) + +h3. *SBasis2D* + +SBasis2D provides a multivariate form - functions of the form +$f(u,v) \rightarrow z$. These can be used for arbitrary distortion +functions (take a path $p(t) \rightarrow (u,v)$ and a pair of surfaces +$f(u,v),g(u,v)$ and compose: $q(t) = (f(p(t)), g(p(t)))$. + +(TODO: flesh out this section) diff --git a/doc/media/2geom-logo.png b/doc/media/2geom-logo.png Binary files differnew file mode 100644 index 0000000..af9a33c --- /dev/null +++ b/doc/media/2geom-logo.png diff --git a/doc/media/Rect.svg b/doc/media/Rect.svg new file mode 100644 index 0000000..dab8ebd --- /dev/null +++ b/doc/media/Rect.svg @@ -0,0 +1,283 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="Rect.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:modified="true"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="8" + inkscape:cx="84.25586" + inkscape:cy="337.26288" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="g2227" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + <g + id="g2227" + transform="matrix(1.448783,0,0,1.133904,-50.0431,-19.23223)"> + <rect + style="fill:none;fill-opacity:1;stroke:black;stroke-width:0.24958529;stroke-miterlimit:4;stroke-dasharray:1.49751161, 1.49751161;stroke-dashoffset:0;stroke-opacity:1" + id="rect2208" + width="80.412262" + height="101.14787" + x="71.123871" + y="93.46669" /> + <path + sodipodi:type="arc" + style="fill:black;fill-opacity:1;stroke:none;stroke-width:0.31989604;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2212" + sodipodi:cx="160" + sodipodi:cy="193" + sodipodi:rx="1.25" + sodipodi:ry="1.25" + d="M 161.25 193 A 1.25 1.25 0 1 1 158.75,193 A 1.25 1.25 0 1 1 161.25 193 z" + transform="matrix(0.690234,0,0,0.881909,41.08823,-76.69567)" /> + <text + xml:space="preserve" + style="font-size:7.80207539px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="172.75986" + y="83.146294" + id="text3986" + transform="scale(0.88468,1.130352)"><tspan + sodipodi:role="line" + id="tspan3988" + x="172.75986" + y="83.146294">P<tspan + style="font-size:6.24165869px" + id="tspan3990" + dx="-1.7240311" + dy="1.9998763">max</tspan></tspan></text> + <path + transform="matrix(0.690234,0,0,0.881909,-39.39108,24.30456)" + d="M 161.25 193 A 1.25 1.25 0 1 1 158.75,193 A 1.25 1.25 0 1 1 161.25 193 z" + sodipodi:ry="1.25" + sodipodi:rx="1.25" + sodipodi:cy="193" + sodipodi:cx="160" + id="path3992" + style="fill:black;fill-opacity:1;stroke:none;stroke-width:0.31989604;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <text + transform="scale(0.88468,1.130352)" + id="text3994" + y="176.88782" + x="67.843575" + style="font-size:7.80207253px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + y="176.88782" + x="67.843575" + id="tspan3996" + sodipodi:role="line">P<tspan + dy="1.9998755" + dx="-1.7240307" + id="tspan3998" + style="font-size:6.24165726px">min</tspan></tspan></text> + </g> +</svg> diff --git a/doc/media/bezier-curve-evaluation.png b/doc/media/bezier-curve-evaluation.png Binary files differnew file mode 100644 index 0000000..adb2476 --- /dev/null +++ b/doc/media/bezier-curve-evaluation.png diff --git a/doc/media/convex.png b/doc/media/convex.png Binary files differnew file mode 100644 index 0000000..a5eba70 --- /dev/null +++ b/doc/media/convex.png diff --git a/doc/media/convex.svg b/doc/media/convex.svg new file mode 100644 index 0000000..fea1694 --- /dev/null +++ b/doc/media/convex.svg @@ -0,0 +1,232 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="convex.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:modified="true"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="2.8284271" + inkscape:cx="93.656296" + inkscape:cy="405.77902" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="g2919" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 210.9464,14.577576 189.65976,11.948591 173.48938,20.230605 C 169.70978,22.166415 166.20969,24.698322 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccccscccscccsccccccccccccc" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:0.99999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="M 42.801407,152.5919 L 57.629203,134.09469 L 102.53048,88.663078 L 109.248,85.127547 L 116.31907,86.364976 L 164.40234,135.15534 L 182.61033,153.36334 L 166.1701,178.99597 L 153.61895,185.5367 L 148.31566,188.71869 L 119.58944,200.82789 L 105.27053,204.27504 L 81.58245,189.95612 L 71.594568,181.736 L 42.801407,152.5919 z " + id="path2213" + transform="matrix(3.126016,0,0,3.126016,-151.4725,-254.7792)" + sodipodi:nodetypes="ccccccccccccccc" /> + </g> + <g + id="g2227" + transform="matrix(1.448783,0,0,1.133904,-50.0431,-19.23223)" /> +</svg> diff --git a/doc/media/coords.png b/doc/media/coords.png Binary files differnew file mode 100644 index 0000000..343a993 --- /dev/null +++ b/doc/media/coords.png diff --git a/doc/media/coords.svg b/doc/media/coords.svg new file mode 100644 index 0000000..c780df0 --- /dev/null +++ b/doc/media/coords.svg @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="151.71198" + height="124.79403" + id="svg59" + version="1.1" + inkscape:version="0.48+devel r10332" + sodipodi:docname="coords.svg" + inkscape:export-filename="/home/tweenk/src/2geom-bzr/doc/media/coords.png" + inkscape:export-xdpi="90.170868" + inkscape:export-ydpi="90.170868"> + <defs + id="defs61"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path802" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker51" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path53" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8" + inkscape:cx="43.083365" + inkscape:cy="80.424336" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1105" + inkscape:window-height="815" + inkscape:window-x="1" + inkscape:window-y="31" + inkscape:window-maximized="0" + inkscape:object-nodes="true" + inkscape:object-paths="true" + inkscape:snap-intersection-paths="true" /> + <metadata + id="metadata64"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-166.59375,-740.58868)"> + <path + transform="matrix(1,0,0,-1,80.151798,912.09043)" + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-end:url(#marker51);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 165.71428,146.6479 c 0,-16.18137 -7.27115,-30.66448 -18.72437,-40.36025" + id="path12" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + inkscape:connector-curvature="0" + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 193.00893,743.22826 0,119.2857" + id="path14" + sodipodi:nodetypes="cc" /> + <path + inkscape:connector-curvature="0" + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 166.58037,765.44253 144.99998,0" + id="path16" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="311.07623" + y="756.33673" + id="text3166" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3168" + x="311.07623" + y="756.33673">X</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3170" + y="862.76532" + x="208.93338" + style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + xml:space="preserve"><tspan + y="862.76532" + x="208.93338" + id="tspan3172" + sodipodi:role="line">Y</tspan></text> + <path + style="color:#000000;fill:#ff933d;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 26.41518,24.85385 69.642857,81.936886" + id="path4158" + inkscape:connector-curvature="0" + transform="translate(166.59375,740.58868)" /> + </g> +</svg> diff --git a/doc/media/ellipse-angular-coordinates.png b/doc/media/ellipse-angular-coordinates.png Binary files differnew file mode 100644 index 0000000..c79eb47 --- /dev/null +++ b/doc/media/ellipse-angular-coordinates.png diff --git a/doc/media/ellipse-angular-coordinates.svg b/doc/media/ellipse-angular-coordinates.svg new file mode 100644 index 0000000..e9311ec --- /dev/null +++ b/doc/media/ellipse-angular-coordinates.svg @@ -0,0 +1,249 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="720" + height="320" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46+devel r21383" + version="1.0" + sodipodi:docname="ellipse-angular-coordinates.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/usr/src/2geom-svn/doc/media/ellipse-angular-coordinates.png" + inkscape:export-xdpi="66.050827" + inkscape:export-ydpi="66.050827"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path805" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.2,0,0,0.2,1.2,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path802" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible"> + <path + id="path808" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path796" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.7" + inkscape:cx="408.19305" + inkscape:cy="259.59627" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-bbox="false" + inkscape:snap-bbox-midpoints="false" + inkscape:snap-nodes="true" + inkscape:object-paths="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-global="false" + inkscape:window-width="1024" + inkscape:window-height="737" + inkscape:window-x="0" + inkscape:window-y="1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-732.36214)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:none;stroke:#558ada;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path12" + sodipodi:cx="112.85714" + sodipodi:cy="146.6479" + sodipodi:rx="52.857143" + sodipodi:ry="52.857143" + d="m 165.71428,146.6479 a 52.857143,52.857143 0 1 1 -105.714284,0 52.857143,52.857143 0 1 1 105.714284,0 z" + transform="translate(22.612039,728.7384)" /> + <path + style="color:#000000;fill:none;stroke:#ed0000;stroke-width:3;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 135.46917,875.3863 44.82926,-28.01715" + id="path1992" /> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 135.46917,988.31486 0,-209.99999" + id="path14" /> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 35.469178,875.3863 218.571412,0" + id="path16" /> + <path + transform="matrix(1.3986138,1.6285045,-0.49765802,0.42740527,477.84037,634.78699)" + d="m 165.71428,146.6479 a 52.857143,52.857143 0 1 1 -105.714284,0 52.857143,52.857143 0 1 1 105.714284,0 z" + sodipodi:ry="52.857143" + sodipodi:rx="52.857143" + sodipodi:cy="146.6479" + sodipodi:cx="112.85714" + id="path2192" + style="color:#000000;fill:none;stroke:#558ada;stroke-width:2.52805805;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + id="path2194" + d="m 562.70341,881.25342 76.64178,61.02997" + style="color:#000000;fill:none;stroke:#ed0000;stroke-width:3;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-width:3;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 386.66677,790.99733 0,27.3541 -99.76009,0 0,119.77841 99.76009,0 0,27.3541 51.36989,-87.22345 -51.36989,-87.26316 z" + id="rect2196" /> + <text + xml:space="preserve" + style="font-size:21.50658035px;text-align:start;text-anchor:start" + x="296.32678" + y="856.89478" + id="text2201"><tspan + sodipodi:role="line" + id="tspan2203" + x="296.32678" + y="856.89478">rotation,</tspan><tspan + sodipodi:role="line" + x="296.32678" + y="883.77802" + id="tspan2205">scaling,</tspan><tspan + sodipodi:role="line" + x="296.32678" + y="910.66125" + id="tspan2231">translation</tspan></text> + <text + id="text2211" + y="1011.1191" + x="134.7551" + style="font-size:21.50658035px;text-align:center;text-anchor:middle" + xml:space="preserve"><tspan + id="tspan2215" + y="1011.1191" + x="134.7551" + sodipodi:role="line">mapping angle to point</tspan><tspan + y="1038.0023" + x="134.7551" + sodipodi:role="line" + id="tspan2219">on the unit circle</tspan></text> + <text + xml:space="preserve" + style="font-size:21.50658035px;text-align:center;text-anchor:middle" + x="571.89789" + y="1011.1191" + id="text2221"><tspan + id="tspan2225" + sodipodi:role="line" + x="571.89789" + y="1011.1191">resulting point</tspan><tspan + sodipodi:role="line" + x="571.89789" + y="1038.0023" + id="tspan2229">on the ellipse</tspan></text> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow1Mend)" + d="m 445.21287,881.25343 254.28572,0" + id="path2233" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2235" + sodipodi:cx="580.09137" + sodipodi:cy="143.9436" + sodipodi:rx="19.989418" + sodipodi:ry="19.989418" + d="M 590.48259,161.01988 A 19.989418,19.989418 0 1 1 600.0786,143.6477" + sodipodi:start="1.0241371" + sodipodi:end="6.268382" + sodipodi:open="true" + transform="translate(-17.387962,737.30983)" /> + <path + style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 575.81386,896.51884 -10.70183,1.36745 4.09106,2.2748 -0.34104,4.33235 6.95183,-7.9746 -2e-5,0 z" + id="path3214" + sodipodi:nodetypes="cccccc" /> + <path + id="path3406" + d="m 562.70342,982.92526 0,-211.09183" + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow1Mend)" /> + <path + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#558ada;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none" + d="M 536.39864,171.48272 589.0082,126.29988" + id="path3980" + transform="translate(0,732.36214)" /> + <path + style="color:#000000;fill:none;stroke:#558ada;stroke-width:1.5;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 488.77669,62.813201 636.63015,234.96939" + id="path3982" + transform="translate(0,732.36214)" /> + </g> +</svg> diff --git a/doc/media/elliptical-arc-flags.png b/doc/media/elliptical-arc-flags.png Binary files differnew file mode 100644 index 0000000..7776fc3 --- /dev/null +++ b/doc/media/elliptical-arc-flags.png diff --git a/doc/media/elliptical-arc-flags.svg b/doc/media/elliptical-arc-flags.svg new file mode 100644 index 0000000..d4116f2 --- /dev/null +++ b/doc/media/elliptical-arc-flags.svg @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="268.49316" + height="154.5769" + id="svg4007" + sodipodi:version="0.32" + inkscape:version="0.46+devel r21383" + version="1.0" + sodipodi:docname="elliptical-arc-flags.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/usr/src/2geom-svn/doc/media/elliptical-arc-flags.png" + inkscape:export-xdpi="93.85714" + inkscape:export-ydpi="93.85714"> + <defs + id="defs4009"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path802" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path796" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective4015" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4044" + inkscape:cx="111.98708" + inkscape:cy="73.679958" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:object-paths="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-global="false" + inkscape:window-width="1024" + inkscape:window-height="737" + inkscape:window-x="0" + inkscape:window-y="1" /> + <metadata + id="metadata4012"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-69.799637,-28.300815)"> + <path + sodipodi:type="arc" + style="color:#000000;fill:none;stroke:#558ada;stroke-width:2.05404162;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path4017" + sodipodi:cx="166.17009" + sodipodi:cy="131.10306" + sodipodi:rx="124.75384" + sodipodi:ry="74.751289" + d="m 290.92393,131.10306 c 0,41.284 -55.8542,74.75129 -124.75384,74.75129 -68.899642,0 -124.753838,-33.46729 -124.753838,-74.75129 0,-41.283999 55.854196,-74.751292 124.753838,-74.751292 68.89964,0 124.75384,33.467293 124.75384,74.751292 z" + transform="matrix(0.61918419,0.38818562,-0.38761403,0.61827246,101.94315,-30.37653)" /> + <path + transform="matrix(0.61918419,0.38818562,-0.38761403,0.61827246,170.12845,-49.569428)" + d="m 290.92393,131.10306 c 0,41.284 -55.8542,74.75129 -124.75384,74.75129 -68.899642,0 -124.753838,-33.46729 -124.753838,-74.75129 0,-41.283999 55.854196,-74.751292 124.753838,-74.751292 68.89964,0 124.75384,33.467293 124.75384,74.751292 z" + sodipodi:ry="74.751289" + sodipodi:rx="124.75384" + sodipodi:cy="131.10306" + sodipodi:cx="166.17009" + id="path4021" + style="color:#000000;fill:none;stroke:#558ada;stroke-width:2.05404162;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ed0000;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path4025" + sodipodi:cx="233.37674" + sodipodi:cy="159.67299" + sodipodi:rx="9.5633268" + sodipodi:ry="9.5633268" + d="m 242.94007,159.67299 c 0,5.28168 -4.28165,9.56333 -9.56333,9.56333 -5.28168,0 -9.56333,-4.28165 -9.56333,-9.56333 0,-5.28168 4.28165,-9.56333 9.56333,-9.56333 5.28168,0 9.56333,4.28165 9.56333,9.56333 z" + transform="matrix(0.55248859,0,0,0.55248859,104.43875,71.455484)" /> + <path + transform="matrix(0.55248859,0,0,0.55248859,14.139401,-36.772691)" + d="m 242.94007,159.67299 c 0,5.28168 -4.28165,9.56333 -9.56333,9.56333 -5.28168,0 -9.56333,-4.28165 -9.56333,-9.56333 0,-5.28168 4.28165,-9.56333 9.56333,-9.56333 5.28168,0 9.56333,4.28165 9.56333,9.56333 z" + sodipodi:ry="9.5633268" + sodipodi:rx="9.5633268" + sodipodi:cy="159.67299" + sodipodi:cx="233.37674" + id="path4537" + style="color:#000000;fill:#ed0000;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + style="color:#000000;fill:#ed0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 6;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 147.5237,60.982766 226.57224,148.5907" + id="path4539" /> + <text + xml:space="preserve" + style="text-align:center;text-anchor:middle" + x="319.7186" + y="88.171432" + id="text4915"><tspan + sodipodi:role="line" + id="tspan4917" + x="319.7186" + y="88.171432">sweep</tspan><tspan + sodipodi:role="line" + x="319.7186" + y="103.17143" + id="tspan4919">large</tspan></text> + <text + id="text4921" + y="88.171432" + x="242.18054" + style="text-align:center;text-anchor:middle" + xml:space="preserve"><tspan + y="88.171432" + x="242.18054" + id="tspan4923" + sodipodi:role="line">sweep</tspan><tspan + id="tspan4925" + y="103.17143" + x="242.18054" + sodipodi:role="line">!large</tspan></text> + <text + xml:space="preserve" + style="text-align:center;text-anchor:middle" + x="123.37082" + y="103.70818" + id="text4927"><tspan + sodipodi:role="line" + id="tspan4929" + x="123.37082" + y="103.70818">!sweep</tspan><tspan + sodipodi:role="line" + x="123.37082" + y="118.70818" + id="tspan4931">!large</tspan></text> + <text + id="text4933" + y="163.69551" + x="89.621902" + style="text-align:center;text-anchor:middle" + xml:space="preserve"><tspan + y="163.69551" + x="89.621902" + id="tspan4935" + sodipodi:role="line">!sweep</tspan><tspan + id="tspan4937" + y="178.69551" + x="89.621902" + sodipodi:role="line">large</tspan></text> + </g> +</svg> diff --git a/doc/media/gear.png b/doc/media/gear.png Binary files differnew file mode 100644 index 0000000..3415df2 --- /dev/null +++ b/doc/media/gear.png diff --git a/doc/media/involute.pdf b/doc/media/involute.pdf Binary files differnew file mode 100644 index 0000000..f199a2f --- /dev/null +++ b/doc/media/involute.pdf diff --git a/doc/media/matrix.png b/doc/media/matrix.png Binary files differnew file mode 100644 index 0000000..343a8e7 --- /dev/null +++ b/doc/media/matrix.png diff --git a/doc/media/matrix.svg b/doc/media/matrix.svg new file mode 100644 index 0000000..f331bb4 --- /dev/null +++ b/doc/media/matrix.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="matrix.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:modified="true"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="4" + inkscape:cx="97.22678" + inkscape:cy="409.27536" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="svg2" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + <g + id="g2227" + transform="matrix(1.448783,-7.650991e-2,-0.400046,1.15503,20.06051,-21.47177)"> + <path + id="path2219" + d="M 111.36932,86.249996 L 111.36932,143.46385 L 169.5,143.46385" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:0.78020775px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);marker-mid:none;marker-end:url(#Arrow1Mend);stroke-opacity:1" /> + <g + id="g2221" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2223" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-width:0.78020769;stroke-miterlimit:4;stroke-dasharray:4.68124631, 4.68124631;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path2225" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-width:0.78020769;stroke-miterlimit:4;stroke-dasharray:4.68124631, 4.68124631;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="M 111.36932,143.46385 L 123.75,136" + id="path2208" /> +</svg> diff --git a/doc/media/point.png b/doc/media/point.png Binary files differnew file mode 100644 index 0000000..d0e59b7 --- /dev/null +++ b/doc/media/point.png diff --git a/doc/media/point.svg b/doc/media/point.svg new file mode 100644 index 0000000..5c63137 --- /dev/null +++ b/doc/media/point.svg @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + id="svg2160" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="point.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs3"> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path4102" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path4099" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path4105" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + </defs> + <sodipodi:namedview + inkscape:document-units="mm" + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8" + inkscape:cx="178.41166" + inkscape:cy="63.895144" + inkscape:current-layer="layer1" + inkscape:window-width="1280" + inkscape:window-height="949" + inkscape:window-x="1280" + inkscape:window-y="25" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="107.14286" + id="guide3050" /> + <sodipodi:guide + orientation="horizontal" + position="56.428571" + id="guide3052" /> + </sodipodi:namedview> + <metadata + id="metadata4"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + sodipodi:type="arc" + style="fill:black;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:0.5, 1;stroke-dashoffset:0;stroke-opacity:1" + id="path2178" + sodipodi:cx="60.104076" + sodipodi:cy="962.45862" + sodipodi:rx="1.5152289" + sodipodi:ry="1.5152289" + d="M 61.619305 962.45862 A 1.5152289 1.5152289 0 1 1 58.588848,962.45862 A 1.5152289 1.5152289 0 1 1 61.619305 962.45862 z" + transform="matrix(1.199594,0,0,1.199594,34.99081,-158.1218)" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="110.59128" + y="1000.1426" + id="text2180"><tspan + sodipodi:role="line" + id="tspan2182" + x="110.59128" + y="1000.1426">(60,30)</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)" + d="M 0,976.6479 L 0,1052.7193 L 167.06354,1052.7193" + id="path2160" + sodipodi:nodetypes="ccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.77165413;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:5.31496239,1.77165413;stroke-opacity:1;marker-start:none;stroke-dashoffset:0" + d="M -0.35714298,1052.3626 L 103.5899,998.42619" + id="path3054" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:italic;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + x="3.5714283" + y="982.36218" + id="text4123"><tspan + sodipodi:role="line" + id="tspan4125" + x="3.5714283" + y="982.36218" + style="font-style:italic">x</tspan></text> + <text + id="text4127" + y="1048.4336" + x="159.64285" + style="font-size:10px;font-style:italic;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Serif" + xml:space="preserve"><tspan + style="font-style:italic" + y="1048.4336" + x="159.64285" + id="tspan4129" + sodipodi:role="line">y</tspan></text> + </g> +</svg> diff --git a/doc/media/rect.png b/doc/media/rect.png Binary files differnew file mode 100644 index 0000000..adb82f6 --- /dev/null +++ b/doc/media/rect.png diff --git a/doc/media/rotate.png b/doc/media/rotate.png Binary files differnew file mode 100644 index 0000000..8abea74 --- /dev/null +++ b/doc/media/rotate.png diff --git a/doc/media/rotate.svg b/doc/media/rotate.svg new file mode 100644 index 0000000..31a0f7c --- /dev/null +++ b/doc/media/rotate.svg @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="rocate.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="2.8284271" + inkscape:cx="77.313404" + inkscape:cy="436.13958" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="g2190" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + <g + transform="matrix(0.228764,0.223608,-0.223608,0.228764,109.769,54.85103)" + id="g2190"> + <path + style="fill:none;stroke:black;stroke-width:0.99999995;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5.99999975,5.99999975;stroke-dashoffset:0" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + id="path2192" /> + <path + sodipodi:nodetypes="cccsssssscccc" + style="fill:none;stroke:black;stroke-width:0.99999995;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5.99999975,5.99999975;stroke-dashoffset:0" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + id="path2194" /> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend);stroke-opacity:1" + d="M 111.36932,86.541753 L 111.36932,143.46385 L 169.35208,143.46385" + id="path2196" + transform="matrix(3.126016,0,0,3.126016,-151.4725,-254.7792)" /> + </g> +</svg> diff --git a/doc/media/sbasis.png b/doc/media/sbasis.png Binary files differnew file mode 100644 index 0000000..4e0aad1 --- /dev/null +++ b/doc/media/sbasis.png diff --git a/doc/media/sbasis.svg b/doc/media/sbasis.svg new file mode 100644 index 0000000..c5b4cbe --- /dev/null +++ b/doc/media/sbasis.svg @@ -0,0 +1,1121 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="352.37646" + height="289.65378" + id="svg2" + version="1.1" + inkscape:version="0.48+devel r10201 custom" + sodipodi:docname="sbasis.svg" + inkscape:export-filename="/home/tweenk/src/2geom-bzr/doc/media/sbasis.png" + inkscape:export-xdpi="150.07809" + inkscape:export-ydpi="150.07809"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path796" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path793" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1898"> + <rect + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.61399996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect1900" + width="22.223356" + height="23.991123" + x="269.76013" + y="174.68845" + transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1910"> + <rect + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.61399996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect1912" + width="33.214287" + height="22.857143" + x="-182.01929" + y="290.14496" + transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" /> + </clipPath> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="210.52422" + inkscape:cy="131.46418" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:object-nodes="true" + inkscape:snap-global="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="999" + inkscape:window-height="828" + inkscape:window-x="3" + inkscape:window-y="89" + inkscape:window-maximized="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(28.575407,-95.703979)"> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.61399996;stroke-miterlimit:4;stroke-dasharray:none;marker:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 60,98.790754 0,254.999996 260.71429,0" + id="path10" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <text + xml:space="preserve" + style="font-size:31.43364906px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMMathItalic12;-inkscape-font-specification:LMMathItalic12 Bold Italic" + x="7.2479248" + y="123.86304" + id="text1415-0" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan1417-1" + x="7.2479234" + y="123.86304"><tspan + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + id="tspan1440">(1–</tspan>t<tspan + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + id="tspan2082">)</tspan><tspan + id="tspan2088" + style="font-size:65.00091553%;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;baseline-shift:super;font-family:LMMathItalic12;-inkscape-font-specification:LMMathItalic12 Bold Italic">n</tspan></tspan></text> + <text + sodipodi:linespacing="125%" + id="text1446" + y="385.04343" + x="299.8241" + style="font-size:31.43364906px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMMathItalic12;-inkscape-font-specification:LMMathItalic12 Bold Italic" + xml:space="preserve"><tspan + y="385.04343" + x="299.8241" + id="tspan1448" + sodipodi:role="line">t<tspan + style="font-size:65.00091553%;baseline-shift:super" + id="tspan2084">n</tspan></tspan></text> + <rect + style="color:#000000;fill:none;stroke:#000000;stroke-width:1.61399996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect1454" + width="28.571428" + height="28.571428" + x="60" + y="325.21933" + inkscape:tile-cx="40.040511" + inkscape:tile-cy="284.51535" + inkscape:tile-w="28.571428" + inkscape:tile-h="28.571428" + inkscape:tile-x0="25.754797" + inkscape:tile-y0="270.22964" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#00ff00;stroke:#000000;stroke-width:2.30571437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path1840" + sodipodi:cx="74.285713" + sodipodi:cy="139.50505" + sodipodi:rx="14.285713" + sodipodi:ry="14.285715" + d="m 88.571426,139.50505 c 0,7.88978 -6.395931,14.28572 -14.285713,14.28572 C 66.395932,153.79077 60,147.39483 60,139.50505 c 0,-7.88978 6.395932,-14.28571 14.285713,-14.28571 7.889782,0 14.285713,6.39593 14.285713,14.28571 z" + transform="matrix(0.69999998,0,0,0.69999998,22.285716,41.851518)" /> + <use + x="0" + y="0" + xlink:href="#path1840" + id="use1846" + transform="translate(28.571428,28.571423)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(57.142857,57.142853)" + id="use1848" + xlink:href="#path1840" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1840" + id="use1850" + transform="translate(85.714285,85.714283)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(114.28571,114.28571)" + id="use1852" + xlink:href="#path1840" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1840" + id="use1854" + transform="translate(142.85714,142.85714)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(171.42857,171.42857)" + id="use1856" + xlink:href="#path1840" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1840" + id="use1858" + transform="translate(200,199.99999)" + width="744.09448" + height="1052.3622" /> + <path + transform="matrix(0.69999998,0,0,0.69999998,22.285716,241.85151)" + d="m 88.571426,139.50505 c 0,7.88978 -6.395931,14.28572 -14.285713,14.28572 C 66.395932,153.79077 60,147.39483 60,139.50505 c 0,-7.88978 6.395932,-14.28571 14.285713,-14.28571 7.889782,0 14.285713,6.39593 14.285713,14.28571 z" + sodipodi:ry="14.285715" + sodipodi:rx="14.285713" + sodipodi:cy="139.50505" + sodipodi:cx="74.285713" + id="path1862" + style="color:#000000;fill:#ff0000;stroke:#000000;stroke-width:2.30571437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <use + x="0" + y="0" + xlink:href="#path1862" + id="use1864" + transform="translate(57.142857,-1.213469e-8)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(85.714285,-1.213469e-8)" + id="use1866" + xlink:href="#path1862" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1862" + id="use1868" + transform="translate(114.28571,-1.213469e-8)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(142.85714,-1.213469e-8)" + id="use1870" + xlink:href="#path1862" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1862" + id="use1872" + transform="translate(171.42857,-1.213469e-8)" + width="744.09448" + height="1052.3622" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#0000ff;stroke:#000000;stroke-width:2.30571437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path1874" + sodipodi:cx="74.285713" + sodipodi:cy="139.50505" + sodipodi:rx="14.285713" + sodipodi:ry="14.285715" + d="m 88.571426,139.50505 c 0,7.88978 -6.395931,14.28572 -14.285713,14.28572 C 66.395932,153.79077 60,147.39483 60,139.50505 c 0,-7.88978 6.395932,-14.28571 14.285713,-14.28571 7.889782,0 14.285713,6.39593 14.285713,14.28571 z" + transform="matrix(0.69999998,0,0,0.69999998,50.857144,241.85151)" /> + <use + x="0" + y="0" + xlink:href="#path1874" + id="use1876" + transform="translate(-28.571428,-28.571427)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(3.9812881e-7,-57.142856)" + id="use1878" + xlink:href="#path1874" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1874" + id="use1880" + transform="translate(28.571429,-85.714284)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(28.571429,-28.571427)" + id="use1882" + xlink:href="#path1874" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path1874" + id="use1884" + transform="translate(57.142857,-57.142856)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(28.574438,0.01913589)" + id="use1890" + xlink:href="#path1862" + y="0" + x="0" + clip-path="url(#clipPath1898)" /> + <use + clip-path="url(#clipPath1898)" + x="0" + y="0" + xlink:href="#path1862" + id="use1902" + transform="translate(199.91558,-0.10527461)" + width="744.09448" + height="1052.3622" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(57.142857,-114.28571)" + id="use1906" + xlink:href="#path1874" + y="0" + x="0" + clip-path="url(#clipPath1910)" /> + <use + clip-path="url(#clipPath1910)" + x="0" + y="0" + xlink:href="#path1874" + id="use1914" + transform="translate(85.714282,-85.714285)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + id="use2126" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-28.571428)" + id="use2128" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-57.142857)" + id="use2130" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-85.714285)" + id="use2132" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-114.28571)" + id="use2134" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-142.85714)" + id="use2136" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-171.42857)" + id="use2138" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(0,-200)" + id="use2140" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,0)" + id="use2142" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-28.571428)" + id="use2144" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-57.142857)" + id="use2146" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-85.714285)" + id="use2148" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-114.28571)" + id="use2150" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-142.85714)" + id="use2152" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-171.42857)" + id="use2154" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(28.571428,-200)" + id="use2156" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,0)" + id="use2158" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-28.571428)" + id="use2160" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-57.142857)" + id="use2162" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-85.714285)" + id="use2164" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-114.28571)" + id="use2166" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-142.85714)" + id="use2168" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-171.42857)" + id="use2170" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(57.142857,-200)" + id="use2172" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,0)" + id="use2174" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-28.571428)" + id="use2176" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-57.142857)" + id="use2178" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-85.714285)" + id="use2180" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-114.28571)" + id="use2182" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-142.85714)" + id="use2184" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-171.42857)" + id="use2186" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(85.714285,-200)" + id="use2188" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,0)" + id="use2190" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-28.571428)" + id="use2192" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-57.142857)" + id="use2194" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-85.714285)" + id="use2196" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-114.28571)" + id="use2198" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-142.85714)" + id="use2200" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-171.42857)" + id="use2202" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(114.28571,-200)" + id="use2204" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,0)" + id="use2206" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-28.571428)" + id="use2208" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-57.142857)" + id="use2210" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-85.714285)" + id="use2212" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-114.28571)" + id="use2214" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-142.85714)" + id="use2216" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-171.42857)" + id="use2218" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(142.85714,-200)" + id="use2220" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,0)" + id="use2222" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-28.571428)" + id="use2224" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-57.142857)" + id="use2226" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-85.714285)" + id="use2228" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-114.28571)" + id="use2230" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-142.85714)" + id="use2232" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-171.42857)" + id="use2234" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(171.42857,-200)" + id="use2236" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,0)" + id="use2238" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-28.571428)" + id="use2240" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-57.142857)" + id="use2242" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-85.714285)" + id="use2244" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-114.28571)" + id="use2246" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-142.85714)" + id="use2248" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-171.42857)" + id="use2250" + width="344.55585" + height="333.58237" /> + <use + x="0" + y="0" + inkscape:tiled-clone-of="#rect1454" + xlink:href="#rect1454" + transform="translate(200,-200)" + id="use2252" + width="344.55585" + height="333.58237" /> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="47.198875" + y="345.9967" + id="text113" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan115" + x="47.198875" + y="345.9967">0</tspan></text> + <text + sodipodi:linespacing="125%" + id="text117" + y="317.42383" + x="47.198875" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="317.42383" + x="47.198875" + id="tspan119" + sodipodi:role="line">1</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="47.198875" + y="288.85092" + id="text121" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan123" + x="47.198875" + y="288.85092">2</tspan></text> + <text + sodipodi:linespacing="125%" + id="text125" + y="260.27805" + x="47.198875" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="260.27805" + x="47.198875" + id="tspan127" + sodipodi:role="line">3</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="47.198875" + y="231.70517" + id="text129" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan131" + x="47.198875" + y="231.70517">4</tspan></text> + <text + sodipodi:linespacing="125%" + id="text133" + y="203.13228" + x="47.198875" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="203.13228" + x="47.198875" + id="tspan135" + sodipodi:role="line">5</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="47.198875" + y="174.5594" + id="text137" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan139" + x="47.198875" + y="174.5594">6</tspan></text> + <text + sodipodi:linespacing="125%" + id="text141" + y="145.98651" + x="47.198875" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="145.98651" + x="47.198875" + id="tspan143" + sodipodi:role="line">7</tspan></text> + <text + sodipodi:linespacing="125%" + id="text145" + y="372.78241" + x="74.341736" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="372.78241" + x="74.341736" + id="tspan147" + sodipodi:role="line">0</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="102.86214" + y="372.78241" + id="text149" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan151" + x="102.86214" + y="372.78241">1</tspan></text> + <text + sodipodi:linespacing="125%" + id="text153" + y="372.78241" + x="131.38255" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="372.78241" + x="131.38255" + id="tspan155" + sodipodi:role="line">2</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="159.90297" + y="372.78241" + id="text157" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan159" + x="159.90297" + y="372.78241">3</tspan></text> + <text + sodipodi:linespacing="125%" + id="text161" + y="372.78241" + x="188.42337" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="372.78241" + x="188.42337" + id="tspan163" + sodipodi:role="line">4</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="216.94377" + y="372.78241" + id="text165" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan167" + x="216.94377" + y="372.78241">5</tspan></text> + <text + sodipodi:linespacing="125%" + id="text169" + y="372.78241" + x="245.46419" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + xml:space="preserve"><tspan + y="372.78241" + x="245.46419" + id="tspan171" + sodipodi:role="line">6</tspan></text> + <text + xml:space="preserve" + style="font-size:18.89756584px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:LMRoman12;-inkscape-font-specification:LMRoman12" + x="273.98459" + y="372.78241" + id="text173" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan175" + x="273.98459" + y="372.78241">7</tspan></text> + </g> +</svg> diff --git a/doc/media/scale.png b/doc/media/scale.png Binary files differnew file mode 100644 index 0000000..3d62b7e --- /dev/null +++ b/doc/media/scale.png diff --git a/doc/media/scale.svg b/doc/media/scale.svg new file mode 100644 index 0000000..3d37be4 --- /dev/null +++ b/doc/media/scale.svg @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="scale.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:modified="true"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="4" + inkscape:cx="97.22678" + inkscape:cy="404.19505" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="g2227" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + <g + id="g2227" + transform="matrix(1.448783,0,0,1.133904,-50.0431,-19.23223)"> + <path + id="path2219" + d="M 111.36932,86.249996 L 111.36932,143.46385 L 169.5,143.46385" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:0.78020775px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-mid:none;marker-end:url(#Arrow1Mend)" /> + <g + id="g2221" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2223" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-width:0.78020771;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:4.68124631,4.68124631;stroke-dashoffset:0" /> + <path + id="path2225" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-width:0.78020771;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:4.68124631,4.68124631;stroke-dashoffset:0" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + </g> +</svg> diff --git a/doc/media/translate.png b/doc/media/translate.png Binary files differnew file mode 100644 index 0000000..56de688 --- /dev/null +++ b/doc/media/translate.png diff --git a/doc/media/translate.svg b/doc/media/translate.svg new file mode 100644 index 0000000..33bb817 --- /dev/null +++ b/doc/media/translate.svg @@ -0,0 +1,252 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="777" + height="555" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/michael/2geom/trunk/doc/media" + sodipodi:docname="scale.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/2geom/trunk/doc/media/scale.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:modified="true"> + <metadata + id="metadata48"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + inkscape:window-height="855" + inkscape:window-width="1113" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:zoom="2.8284271" + inkscape:cx="132.09309" + inkscape:cy="435.9628" + inkscape:window-x="157" + inkscape:window-y="140" + inkscape:current-layer="svg2" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + orientation="vertical" + position="111.36932" + id="guide4172" /> + <sodipodi:guide + orientation="horizontal" + position="411.53615" + id="guide4174" /> + <sodipodi:guide + orientation="vertical" + position="170.05918" + id="guide3076" /> + <sodipodi:guide + orientation="horizontal" + position="460.68007" + id="guide3078" /> + </sodipodi:namedview> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path3249" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path3212" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3233" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3227" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path3224" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient4094"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop4096" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop4098" /> + </linearGradient> + <linearGradient + id="linearGradient4062"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4064" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4066" /> + </linearGradient> + <linearGradient + id="linearGradient4040"> + <stop + style="stop-color:#babdb6;stop-opacity:1;" + offset="0" + id="stop4042" /> + <stop + style="stop-color:#babdb6;stop-opacity:0;" + offset="1" + id="stop4044" /> + </linearGradient> + <radialGradient + xlink:href="#linearGradient4062" + id="radialGradient4079" + gradientUnits="userSpaceOnUse" + cx="8" + cy="-16" + fx="8" + fy="-16" + r="108" /> + <linearGradient + xlink:href="#linearGradient4040" + id="linearGradient4081" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(80,376)" + x1="328.5" + y1="-43.664978" + x2="328.5" + y2="116.68156" /> + <linearGradient + xlink:href="#linearGradient4094" + id="linearGradient4116" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.35905,0,0,1.35905,203.6646,-185.2813)" + x1="95.105873" + y1="363.72418" + x2="95.105873" + y2="502.67734" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4040" + id="linearGradient3175" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2.121444)" + x1="426.27966" + y1="483.83633" + x2="426.27966" + y2="522.72052" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4094" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + x1="407.09628" + y1="374.48508" + x2="407.09628" + y2="485.16641" /> + </defs> + <g + id="g2919" + transform="matrix(0.319896,0,0,0.319896,48.45544,81.50285)"> + <path + id="path2921" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + style="fill:none;stroke:black;stroke-opacity:1" /> + <path + id="path2925" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + style="fill:none;stroke:black;stroke-opacity:1" + sodipodi:nodetypes="cccsssssscccc" /> + </g> + <g + transform="matrix(0.228764,0.223608,-0.223608,0.228764,109.769,54.85103)" + id="g2190"> + <path + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3.12601709px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);marker-end:none;stroke-opacity:1" + d="M 220.61954,-37.561022 L 196.6698,193.69109" + id="path2196" + sodipodi:nodetypes="cc" /> + </g> + <g + transform="matrix(0.319896,0,0,0.319896,106.8078,32.71248)" + id="g3080"> + <path + style="fill:none;stroke:black;stroke-opacity:1;stroke-width:1.00000003;stroke-miterlimit:4;stroke-dasharray:6.00000025,6.00000025;stroke-dashoffset:0" + d="M 163.15,27.83 L 28.81,165.3 C -16.58,221.51 59.7,214.97 92.4,231.16 C 104.13,243.15 47.44,252 59.17,264 C 70.9,275.99 130.1,287.1 141.85,299.09 C 153.58,311.08 117.84,323.8 129.57,335.79 C 141.3,347.78 168.43,336.42 173.51,364.1 C 177.13,383.88 222.4,372.6 244.54,356.4 C 256.27,344.4 222.1,345.53 233.83,333.54 C 263,303.71 290.16,322.7 300.14,292.81 C 305.07,278.04 257.2,270.04 268.95,258.05 C 302.7,238.34 419.35,225.51 364,170.16 L 224.75,27.83 C 207.72,11.48 179.3,11.3 163.15,27.83 z M 130.99,238.57 C 134,238.57 231.54,251.61 193.9,261.92 C 179.72,265.8 113.53,238.57 130.99,238.57 z M 317.46,292.81 C 317.46,299.63 367.71,304.1 367.71,291.2 C 360.55,270.48 323.4,271.88 317.46,292.81 z M 91.1,329.05 C 103,339.34 121.38,326.49 126.89,312.13 C 115.36,296.81 72.2,312.68 91.1,329.05 z M 311.16,306.82 C 295.82,320.58 312.88,334.54 328,325.65 C 331.37,322.23 327.91,310.24 311.16,306.82 z " + id="path3082" /> + <path + sodipodi:nodetypes="cccsssssscccc" + style="fill:none;stroke:black;stroke-opacity:1;stroke-width:1.00000003;stroke-miterlimit:4;stroke-dasharray:6.00000025,6.00000025;stroke-dashoffset:0" + d="M 216.63,37.47 L 269.78,91.45 C 274.82,96.6 275.91315,108.88098 271.93,109.45 C 266.29292,110.2553 260.02293,94.034313 251.80374,94.034313 C 242.7616,94.034313 245.43878,123.58602 238.07227,123.58602 C 230.29748,123.58602 227.72697,107.96 218.30004,107.96 C 210.67739,107.96 205.51399,129.13114 194.80001,129.13114 C 185.2927,129.13114 177.02987,83.24 171.29999,83.24 C 166.28062,83.24 163.47697,123.96 152.33,123.96 C 133.73263,123.96 105.14,123.84 105.14,123.84 C 95.7,123.82 97.27,114.63 106.4,104.78 C 125.16,84.53 161.15,49.43 172.85,37.47 C 184.61,25.45 205.1,25.79 216.63,37.47 z " + id="path3084" /> + </g> +</svg> diff --git a/doc/patchwise.svg b/doc/patchwise.svg new file mode 100644 index 0000000..986c565 --- /dev/null +++ b/doc/patchwise.svg @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + sodipodi:docbase="/home/njh/svn/lib2geom/doc" + sodipodi:docname="patchwise.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="3.3" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.6699525" + inkscape:cx="337.14286" + inkscape:cy="685.71428" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:object-bbox="true" + inkscape:object-points="true" + inkscape:object-nodes="true" + inkscape:window-width="910" + inkscape:window-height="626" + inkscape:window-x="0" + inkscape:window-y="25" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect2160" + width="428.57144" + height="428.57144" + x="122.85714" + y="152.36218" /> + <g + id="g3945"> + <path + id="path3048" + d="M 302.91647,152.36218 C 302.91647,580.93359 302.91647,580.93359 302.91647,580.93359" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path3050" + d="M 122.85714,323.04064 C 551.42859,323.04064 551.42859,323.04064 551.42859,323.04064" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#580000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 535.16419,323.04064 C 535.16419,580.93359 535.16419,580.93359 535.16419,580.93359" + id="path3052" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#580000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 301.86101,479.24844 C 551.42859,479.24844 551.42859,479.24844 551.42859,479.24844" + id="path3054" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#dd0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 405.29591,324.0961 L 405.29591,480.3039" + id="path3056" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#dd0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 302.91647,390.58996 C 534.06179,390.58996 534.06179,390.58996 534.06179,390.58996" + id="path3058" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 122.85714,152.36218 C 120.21593,152.34091 117.57473,152.31964 114.93352,152.29837 C 97.522248,152.15814 80.103265,152.29837 62.691012,152.29837 C 44.201158,152.29837 21.137039,149.25307 2.9852863,153.79101 C -14.749469,158.2247 -35.837039,151.70403 -53.735153,155.28365 C -68.399793,158.21658 -77.097646,171.70273 -94.036518,171.70273 C -113.54478,171.70273 -132.81343,165.14146 -152.2496,161.25423 C -161.04516,159.49511 -169.96413,151.60134 -179.11718,149.31308 C -190.17129,146.54955 -204.84334,149.31308 -216.43326,149.31308 C -217.42835,149.31308 -218.42345,149.31308 -219.41854,149.31308" + id="path3973" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 123.88938,580.93359 C 97.091356,580.93359 59.650495,568.7458 26.867577,568.7458 C 10.139914,568.7458 -7.2780498,576.08558 -20.897004,585.16488 C -33.02407,593.24959 -44.192616,596.13321 -58.213083,592.6281 C -75.749282,588.24405 -82.500961,571.73109 -102.99238,571.73109 C -117.70994,571.73109 -138.65753,576.8762 -152.2496,583.67224 C -165.73255,590.41371 -183.38692,593.14188 -197.02889,598.59867 C -209.41442,603.55288 -216.56256,598.1967 -225.38911,591.13545 C -230.5282,587.02419 -236.32857,583.42676 -241.80819,580.68695" + id="path3975" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="-170.16132" + y="359.77576" + id="text3977" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3979" + x="-170.16132" + y="359.77576">Extend to infinity</tspan></text> + <rect + style="fill:#b5ffb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3985" + width="170.16132" + height="158.22017" + x="126.87466" + y="158.26894" /> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + x="140.72752" + y="210.51144" + id="text3987" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3989" + x="140.72752" + y="210.51144">Defined by four borders</tspan></text> + </g> +</svg> diff --git a/doc/s-pb-thoughts.txt b/doc/s-pb-thoughts.txt new file mode 100644 index 0000000..5b11215 --- /dev/null +++ b/doc/s-pb-thoughts.txt @@ -0,0 +1,78 @@ + these s-power bases are exactly what I was trying to invent + did you read that paper? +(13:11:50) mental@gristle.org: I didn't really understand it. + oh, well it's precisely what we need for lib2geom + it has a nice haskell connection, btw + rather than representing things as finite polynomials, we can store them as lazy lists and simply take enough terms at the end of the calculations + did you at least look at the examples? + namely, conversion of nurbs to beziers and offset curves? + the basic idea is that although polynomials (which are really linear combinations of 1, x, x^2, x^3...) are easy to work with + they are crap for two main reasons: a) though they are always correct for 0, any rounding or truncation will make the values at 1 fluctuate + b) converting between bezier and polynomial is mathematically inprecise + b) is subtle and I didn't understand it for quite a while + but a) I had already run into + anyway, basically s-pbs provide a robust arithmetic for doing paths + and there are simple, online algorithms for most operations + oh yes, and truncating a s-pb gives an approximation that is basically as good as possible with that number of terms + so you might work out the offset curve as a degree 6 pb (corresponding to a degree 11 bezier curve) then truncate to a 2 term (cubic) +(13:21:05) mental@gristle.org: so, basically an s-pb is an alternate way of approximating functions which has nicer properties than polynomials, at least for our purpose + or you might subdivide first + an s-pb is an alternate way of approximating functions which has nicer properties than polynomials and nicer properties than beziers, at least for our purpose; at the cost of a little more work + for example, multiplying a polynomial is straightforward (poly.cpp has an implementation, e.g.), multiplying a bezier is horid + but polynomials don't give a nice control handle interpretation + whereas beziers and s-pbs do + that article basically shows that anything you can do with polynomials, you can do with s-pbs + (with a little extra work) + so I'll probably remove poly.h + every curve can be written as an infinite s-pb + including things like spirals + so we could do spiral offset directly + basically, if you can write an operation mathematically, you can do it symbolically on an s-pb + including differentiation and integration + lets say we have a function S(t) which is a lazy list s-pb of a single path elem + then we can compute arc length as int(sqrt(diff(S)^2)) + and we can evaluate that at an arbitrary point on the curve to a require precision simply by lazy list operations + similarly, offset means S + d*(transpose(S')/sqrt(diff(S)^2)) + and we can convert that back to a curve using a routine that takes a lazy list and either degree reduces (truncates) or subdivides until the require tol is achieved +(13:27:22) mental@gristle.org: man, lazy evaluation without garbage collection, though :/ + yeah, been pondering that + probably easier to string together online algorithms and use a vector cache +(13:28:09) mental@gristle.org: vector cache? + but I thought you might like to think about that as an algorithm + std::vector<term> +(13:28:34) mental@gristle.org: ah, so basically we accumulate stuff in a vector during the computation and discard the vector when complete? + we can do a lot simply by providing fixed length versions + yeah +(13:28:44) mental@gristle.org: (using it as a memory pool, essentially) + no, not really + I was just thinking that for a lazy list we start with something like lazy ->lazy + then [1] lazy -> lazy + (I think my notation is wrong here) + then [1, 5, 3, 87] lazy -> lazy + etc + many algorithms are linear time online + i.e. they do a constant amount of work, looking at a single term or a few terms + then output another term + you could think of them as a production line + every time the caller asks for another term, each element in the chain requests as many terms as it needs + any point where we need more than one term, we keep a vector remembering all the bits (as we will need them again) + addition, for example, simply takes the two inputs term by term and adds them + scalar multiply similar takes a term, multiplies and chugs the answer + sqrt ditto (I think) + but multiply requires all the terms whose indices add to the required term + There are a few algorithms I haven't worked out yet - inverse function (which we could find using the lagrange inversion theorem, perhaps), converting to a beziergon to a specified tolerance, handling singularities correctly (if you get a pole in the complex plane inside a certain distance from your path you need to subdivide to get past it) + but what I like is the facts that you can increase precision at the caller's point rather than having to make a guess as to the required precision first + and with s-pb we might be able to create a true natural parameterisation accurate to tol + http://en.wikipedia.org/wiki/Lagrange_inversion_theorem + that would be really cool if it worked with s-pb + you could take any s-pb and get an inverse function + (think implicit plotter) + for inversion we would require that the function in question is monotonic with non-zero derivative + I wonder if that condition could be tested easily symbolically + we should probably also think about paths of s-pb functions + to handle subdivision techniques + oh yeah, and I should work out how to find the intersection of two s-pbs + I have that nice paper that solves an arbitrary pair of polynomials via eigen decomposition, I may be able to rewrite that in terms of s-pb + you can find the intersections of an arbitrary set of polynomials via the resultant (I think I sent you a link) + perhaps the result is expressible in s-pb + (well of course it is, what I mean is that perhaps you can find it without going via polynomials first)
\ No newline at end of file diff --git a/doc/shapeops.svg b/doc/shapeops.svg new file mode 100644 index 0000000..19353dc --- /dev/null +++ b/doc/shapeops.svg @@ -0,0 +1,653 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45+devel" + sodipodi:docname="shapeops.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Lend" + style="overflow:visible;"> + <path + id="path4202" + style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(1.1) rotate(180) translate(1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path4190" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.32482718" + inkscape:cx="680.14564" + inkscape:cy="236.50338" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="787" + inkscape:window-height="1020" + inkscape:window-x="0" + inkscape:window-y="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M -56.434431,402.42818 L 30.462129,402.42818 L 30.462129,556.4676 L -56.434431,556.4676 L -56.434431,402.42818 z" + id="rect2799" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -159.93198,363.56119 L 182.92514,363.56119 L 182.92514,542.13261 L -159.93198,542.13261 L -159.93198,363.56119 z" + id="rect3182" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" + d="M -145.70904,497.60059 L 130.50958,496.27285 L 130.94124,426.5636 L 4.0769888,427.26388 L 2.9251588,387.60059 L 165.20484,387.60059 L 165.20484,521.85347 L -145.70904,521.85347 L -145.70904,497.60059 z" + id="rect3184" + sodipodi:nodetypes="ccccccccc" /> + <text + id="text3206" + y="346.22397" + x="-175.31946" + style="font-size:32.92305374px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="346.22397" + x="-175.31946" + id="tspan3208" + sodipodi:role="line">Union</tspan></text> + <path + id="path3301" + d="M -109.376,420.18825 L -76.596301,420.18825 L -76.596301,480.13612 L -109.376,480.13612 L -109.376,420.18825 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" + d="M -87.297935,372.34376 L -87.297935,405.12347 L -147.2458,405.12347 L -147.2458,372.34376 L -87.297935,372.34376 z" + id="path3303" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 109.80135,957.83853 L 109.80135,972.18228 L 196.7076,972.18228 L 196.7076,957.83853 L 109.80135,957.83853 z" + id="path3344" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" + d="M 56.866249,835.89549 L 89.645949,835.89549 L 89.645949,895.84336 L 56.866249,895.84336 L 56.866249,835.89549 z" + id="path3350" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" + d="M 18.988849,788.05728 L 18.988849,820.83853 L 36.301349,820.83853 L 36.301349,794.99478 L 78.957599,794.99478 L 78.957599,788.05728 L 18.988849,788.05728 z" + id="path3352" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 170.77092,818.12053 L 171.48967,842.96428 L 197.86467,842.80803 L 197.86467,818.12053 L 170.77092,818.12053 z M 197.86467,912.46428 L 110.95842,912.87053 L 110.95842,937.55803 L 197.86467,937.55803 L 197.86467,912.46428 z" + id="path3363" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M -230.83893,1007.8247 L 21.000929,1110.7973" + id="path3370" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 169.37394,1003.2069 L 73.161389,1109.4514" + id="path3372" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" + d="M -109.376,1197.6263 L -76.596301,1197.6263 L -76.596301,1257.5742 L -109.376,1257.5742 L -109.376,1197.6263 z" + id="path3384" /> + <path + id="path3390" + d="M -56.440901,1319.5693 L -56.440901,1333.9131 L 30.465349,1333.9131 L 30.465349,1319.5693 L -56.440901,1319.5693 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path3394" + d="M -147.2534,1149.7881 L -147.2534,1182.5693 L -129.9409,1182.5693 L -129.9409,1156.7256 L -87.284651,1156.7256 L -87.284651,1149.7881 L -147.2534,1149.7881 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path3398" + d="M 4.9108788,1179.8513 L 5.6296288,1204.6951 L 32.004629,1204.5388 L 32.004629,1179.8513 L 4.9108788,1179.8513 z M 32.004629,1274.1951 L -54.901621,1274.6013 L -54.901621,1299.2888 L 32.004629,1299.2888 L 32.004629,1274.1951 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="opacity:0.60215053;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 709.38099,43.724366 L 709.38099,248.00562 L 986.67852,248.00562 L 1029.5566,248.00562 L 1030.0349,153.81897 L 1001.5703,153.97203 L 1001.9499,231.86749 L 987.22644,231.92592 L 987.22644,43.724366 L 709.38099,43.724366 z M 782.88099,66.880616 L 869.78724,66.880616 L 869.78724,220.91187 L 782.88099,220.91187 L 782.88099,66.880616 z M 729.94349,84.630619 L 762.72474,84.630619 L 762.72474,144.56812 L 729.94349,144.56812 L 729.94349,84.630619 z" + id="path3400" + sodipodi:nodetypes="cccccccccccccccccccc" /> + <path + style="opacity:0.60215053;fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 679.38099,28.005616 L 679.38099,206.56812 L 978.98214,206.56812 L 1022.256,206.56812 L 1022.256,158.04046 L 1022.256,28.005616 L 679.38099,28.005616 z M 692.06849,36.786866 L 752.03724,36.786866 L 752.03724,69.568116 L 692.06849,69.568116 L 692.06849,36.786866 z M 842.25599,52.036866 L 1004.5372,52.036866 L 1004.5372,186.28687 L 980.52142,186.28687 L 693.59974,186.28687 L 693.59974,162.03687 L 969.81849,160.72437 L 970.25599,91.005619 L 843.41224,91.693119 L 842.25599,52.036866 z" + id="path3404" + sodipodi:nodetypes="cccccccccccccccccccccc" /> + <path + id="path5158" + d="M -35.253591,646.56646 L -218.00451,758.75729" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path5160" + d="M -8.3903312,649.49025 L 157.576,783.23681" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="-206.51208" + y="683.30524" + id="text5164"><tspan + sodipodi:role="line" + id="tspan5166" + x="-206.51208" + y="683.30524" + dy="0 6.5306125 0 -4.3537416 0 0 4.3537416" + dx="0 -7.5755764e-08 0 0 0 0 -2.1768708">Ao + Bo</tspan></text> + <text + id="text5168" + y="681.76599" + x="46.533127" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="681.76599" + x="46.533127" + id="tspan5170" + sodipodi:role="line" + dy="0 8.7074833 -6.530612 0 0 0 4.3537416" + dx="0 -2.1768708 0 0 0 0 -2.1768708">Ah - Bo</tspan></text> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="79.49559" + y="713.51733" + id="text5172"><tspan + dx="0 -2.1768708 0 0 0 0 -2.1768708" + dy="0 7.6190481 -6.530612 0 0 0 4.3537416" + sodipodi:role="line" + id="tspan5174" + x="79.49559" + y="713.51733">Bh - Ao</tspan></text> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="12.668962" + y="652.90643" + id="text5176"><tspan + dx="0 -2.1768708 0 0 0 0" + dy="0 8.7074833 -6.530612 0 0 0" + sodipodi:role="line" + id="tspan5178" + x="12.668962" + y="652.90643">Ah x Bh</tspan></text> + <text + xml:space="preserve" + style="font-size:32.92305374px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="798.44019" + y="0.67824805" + id="text5590"><tspan + sodipodi:role="line" + id="tspan5592" + x="798.44019" + y="0.67824805">Input</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" + d="M 313.34503,803.37606 L 313.34503,937.62606 L 330.65753,937.62606 L 330.65753,803.37606 L 313.34503,803.37606 z M 35.501279,913.31356 L 19.720029,913.37606 L 19.720029,937.62606 L 35.501279,937.62606 L 35.501279,913.31356 z" + id="path5604" /> + <path + id="path5611" + d="M 145.72598,1166.9135 L 145.72598,1301.1635 L 163.03848,1301.1635 L 163.03848,1166.9135 L 145.72598,1166.9135 z M -132.11777,1276.851 L -147.89902,1276.9135 L -147.89902,1301.1635 L -132.11777,1301.1635 L -132.11777,1276.851 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path6029" + d="M 624.92611,402.42818 L 711.82267,402.42818 L 711.82267,556.4676 L 624.92611,556.4676 L 624.92611,402.42818 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path6031" + d="M 521.42857,363.56119 L 864.28569,363.56119 L 864.28569,542.13261 L 521.42857,542.13261 L 521.42857,363.56119 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path6033" + d="M 535.6515,497.60059 L 811.87012,496.27285 L 812.30178,426.5636 L 685.43753,427.26388 L 684.2857,387.60059 L 846.56538,387.60059 L 846.56538,521.85347 L 535.6515,521.85347 L 535.6515,497.60059 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:32.92305374px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="506.04111" + y="346.22397" + id="text6035"><tspan + sodipodi:role="line" + id="tspan6037" + x="506.04111" + y="346.22397">Intersection</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" + d="M 571.98454,420.18825 L 604.76424,420.18825 L 604.76424,480.13612 L 571.98454,480.13612 L 571.98454,420.18825 z" + id="path6039" /> + <path + id="path6041" + d="M 594.06261,372.34376 L 594.06261,405.12347 L 534.11474,405.12347 L 534.11474,372.34376 L 594.06261,372.34376 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 806.22279,765.03279 L 806.22279,797.81404 L 866.16029,797.81404 L 866.16029,765.03279 L 806.22279,765.03279 z" + id="path6973" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 956.37904,780.31404 L 956.81664,795.12654 L 897.03534,795.12654 L 897.03534,889.87654 L 807.75404,890.31404 L 807.75404,914.56404 L 897.03534,914.56404 L 897.03534,949.15779 L 983.94164,949.15779 L 983.94164,914.56404 L 1118.6603,914.56404 L 1118.6603,780.31404 L 956.37904,780.31404 z" + id="path6971" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 844.09779,812.90779 L 844.09779,872.84529 L 876.87899,872.84529 L 876.87899,812.90779 L 844.09779,812.90779 z" + id="path6069" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 1084.4116,819.29788 L 1083.9741,888.98538 L 983.94284,889.48538 L 983.94284,819.82913 L 1084.4116,819.29788 z" + id="path6052" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path6473" + d="M -2245.656,497.60059 L -1969.4374,496.27285 L -1969.0057,426.5636 L -2095.87,427.26388 L -2097.0218,387.60059 L -1934.7421,387.60059 L -1934.7421,521.85347 L -2245.656,521.85347 L -2245.656,497.60059 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path6469" + d="M -2156.3814,402.42818 L -2069.4848,402.42818 L -2069.4848,556.4676 L -2156.3814,556.4676 L -2156.3814,402.42818 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path6471" + d="M -2259.8789,363.56119 L -1917.0218,363.56119 L -1917.0218,542.13261 L -2259.8789,542.13261 L -2259.8789,363.56119 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:32.92305374px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="-2275.2664" + y="346.22397" + id="text6475"><tspan + sodipodi:role="line" + id="tspan6477" + x="-2275.2664" + y="346.22397">Subtraction</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M -2209.3229,420.18825 L -2176.5432,420.18825 L -2176.5432,480.13612 L -2209.3229,480.13612 L -2209.3229,420.18825 z" + id="path6479" /> + <path + id="path6481" + d="M -2187.2449,372.34376 L -2187.2449,405.12347 L -2247.1927,405.12347 L -2247.1927,372.34376 L -2187.2449,372.34376 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path6467" + d="M -2229.8789,379.27547 L -1952.0558,379.27547 L -1952.0558,583.56118 L -2229.8789,583.56118 L -2229.8789,379.27547 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-opacity:1" + d="M -2093.8401,646.56645 L -2973.6036,807.88598" + id="path6878" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-opacity:1" + d="M -2066.9767,649.49025 L -1901.0104,783.23681" + id="path6880" /> + <text + id="text6882" + y="720.24799" + x="-2726.8826" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + dx="0 -7.5755764e-08 0 0 0 0 -2.1768708" + dy="0 6.5306125 0 -4.3537416 0 0 4.3537416" + y="720.24799" + x="-2726.8826" + id="tspan6884" + sodipodi:role="line">Ao + Bo</tspan></text> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="-1904.3037" + y="740.25861" + id="text6886"><tspan + dx="0 -2.1768708 0 0 0 0 -2.1768708" + dy="0 8.7074833 -6.530612 0 0 0 4.3537416" + sodipodi:role="line" + id="tspan6888" + x="-1904.3037" + y="740.25861">Ah - Bo</tspan></text> + <text + id="text6890" + y="765.85284" + x="-2471.9321" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="765.85284" + x="-2471.9321" + id="tspan6892" + sodipodi:role="line" + dy="0 7.6190481 -6.530612 0 0 0 4.3537416" + dx="0 -2.1768708 0 0 0 0 -2.1768708">Bh - Ao</tspan></text> + <text + id="text6894" + y="776.04883" + x="-2255.2595" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="776.04883" + x="-2255.2595" + id="tspan6896" + sodipodi:role="line" + dy="0 8.7074833 -6.530612 0 0 0" + dx="0 -2.1768708 0 0 0 0">Ah x Bh</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -3160.7763,814.17474 L -3160.7763,992.73724 L -3130.7763,992.73724 L -3130.7763,829.89349 L -2852.9326,829.89349 L -2852.9326,992.73724 L -2817.9013,992.73724 L -2817.9013,814.17474 L -3160.7763,814.17474 z" + id="path6901" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" + d="M -2323.8213,841.56372 L -2323.3838,856.40747 L -2296.2901,856.40747 L -2296.2901,881.06372 L -2195.8213,880.53247 L -2196.2276,950.25122 L -2296.2901,950.71997 L -2296.2901,975.81372 L -2161.5401,975.81372 L -2161.5401,841.56372 L -2323.8213,841.56372 z M -2383.1963,951.12622 L -2472.4463,951.56372 L -2472.4463,975.81372 L -2383.1963,975.81372 L -2383.1963,951.12622 z" + id="path6908" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M -2133.7904,820.70536 L -2133.7904,999.26786 L -2030.2904,999.26786 L -2030.2904,1013.6116 L -1943.3842,1013.6116 L -1943.3842,999.26786 L -1790.9154,999.26786 L -1790.9154,820.70536 L -2133.7904,820.70536 z" + id="path6910" /> + <path + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -2331.1534,1093.5194 L -2331.1534,1119.3631 L -2288.4971,1119.3631 L -2288.4971,1093.5194 L -2331.1534,1093.5194 z M -2198.2784,1101.8319 L -2197.8409,1116.6756 L -2170.7471,1116.6756 L -2170.7471,1141.3319 L -2070.2784,1140.8006 L -2070.7159,1210.5194 L -2170.7471,1210.9881 L -2170.7471,1236.0819 L -2053.3096,1236.0819 L -2053.3096,1101.8319 L -2198.2784,1101.8319 z M -2257.6534,1211.3944 L -2331.1534,1211.7694 L -2331.1534,1236.0819 L -2257.6534,1236.0819 L -2257.6534,1211.3944 z M -2331.1534,1256.3631 L -2331.1534,1297.8007 L -2053.3096,1297.8007 L -2053.3096,1256.3631 L -2170.7471,1256.3631 L -2170.7471,1270.7069 L -2257.6534,1270.7069 L -2257.6534,1256.3631 L -2331.1534,1256.3631 z" + id="path6925" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000035, 4.00000035;stroke-dashoffset:0;stroke-opacity:1" + d="M -2774.488,821.625 L -2774.488,847.46875 L -2731.8317,847.46875 L -2731.8317,821.625 L -2774.488,821.625 z M -2644.988,830.90625 L -2643.8317,870.5625 L -2516.988,869.875 L -2517.3942,939.59375 L -2777.863,940.84375 L -2777.863,965.15625 L -2500.0192,965.15625 L -2500.0192,830.90625 L -2644.988,830.90625 z" + id="path6931" /> + <path + id="path6936" + d="M -2093.84,646.56647 L -2542.9316,832.52418" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-opacity:1" /> + <path + id="path6938" + d="M -2067.9768,649.49026 L -2323.4675,795.52171" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 694.05575,628.0951 L 511.30483,740.28593" + id="path6955" /> + <text + id="text6957" + y="664.83386" + x="522.79724" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + dx="0 -7.5755764e-08 0 0 0 0 -2.1768708" + dy="0 6.5306125 0 0 0 0 4.3537416" + y="664.83386" + x="522.79724" + id="tspan6959" + sodipodi:role="line">Ao x Bo</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 730.15469,624.86177 L 896.12104,758.60833" + id="path6961" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="804.48547" + y="664.83386" + id="text6963"><tspan + sodipodi:role="line" + id="tspan6965" + x="804.48547" + y="664.83386" + dy="0 6.1571202 -6.1571202 0 0 0 6.1571202" + dx="0 -1.5392801 -1.5392801 0 0 0 -1.5392801">Ah + Bh</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 512.32394,932.29834 L 512.32394,1009.2623 L 801.70859,782.98817" + id="path6975" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 502.87904,1011.75 L 502.87904,1036.4062 L 457.84779,1036.4062 L 457.84779,1174.5938 L 735.66029,1174.5938 L 735.66029,1011.75 L 502.87904,1011.75 z" + id="path6977" /> + <text + xml:space="preserve" + style="font-size:28px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="493.85257" + y="990.79102" + id="text6979"><tspan + sodipodi:role="line" + id="tspan6981" + x="493.85257" + y="990.79102">-</tspan></text> + <path + id="path6986" + d="M 512.32397,1188.1621 L 512.32397,1249.39 L 852.50489,919.98413" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="ccc" /> + <text + id="text6988" + y="1230.9187" + x="493.85257" + style="font-size:28px;font-style:normal;font-weight:bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="1230.9187" + x="493.85257" + id="tspan6990" + sodipodi:role="line">-</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 502.87904,1253.417 L 502.87904,1278.0732 L 457.84779,1278.0732 L 457.84779,1372.042 L 532.22279,1371.667 L 532.22279,1276.917 L 592.00404,1276.917 L 591.56654,1262.1045 L 735.66029,1262.1045 L 735.66029,1253.417 L 502.87904,1253.417 z M 457.84779,1396.3545 L 457.84779,1416.2608 L 532.22279,1416.2608 L 532.22279,1396.3545 L 457.84779,1396.3545 z M 619.12904,1396.3545 L 619.12904,1416.2608 L 735.66029,1416.2608 L 735.66029,1396.3545 L 619.12904,1396.3545 z" + id="path6999" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 844.80843,852.25577 L 867.89759,1104.6977 L 1032.6006,890.73778" + id="path7004" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 867.89769,1103.1584 L 738.59811,1323.2755 L 878.67264,1324.8148" + id="path7006" + sodipodi:nodetypes="ccc" /> + <path + id="path7794" + d="M 940.03464,1253.417 L 940.03464,1278.0732 L 895.00334,1278.0732 L 895.00334,1372.042 L 969.37834,1371.667 L 969.37834,1276.917 L 1029.1596,1276.917 L 1028.7221,1262.1045 L 1172.8158,1262.1045 L 1172.8158,1253.417 L 940.03464,1253.417 z M 895.00334,1396.3545 L 895.00334,1416.2608 L 969.37834,1416.2608 L 969.37834,1396.3545 L 895.00334,1396.3545 z M 1056.2846,1396.3545 L 1056.2846,1416.2608 L 1172.8158,1416.2608 L 1172.8158,1396.3545 L 1056.2846,1396.3545 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path7796" + d="M 917.98324,1293.1632 L 917.98324,1353.1007 L 950.76444,1353.1007 L 950.76444,1293.1632 L 917.98324,1293.1632 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path7798" + d="M 1156.7578,1299.5533 L 1156.3203,1369.2408 L 1056.289,1369.7408 L 1056.289,1300.0846 L 1156.7578,1299.5533 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000019, 4.00000019;stroke-dashoffset:0;stroke-opacity:1" + d="M 1442.2087,402.42818 L 1529.1052,402.42818 L 1529.1052,556.4676 L 1442.2087,556.4676 L 1442.2087,402.42818 z" + id="path7806" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 1352.9341,497.60059 L 1629.1527,496.27285 L 1629.5844,426.5636 L 1502.7201,427.26388 L 1501.5683,387.60059 L 1663.848,387.60059 L 1663.848,521.85347 L 1352.9341,521.85347 L 1352.9341,497.60059 z" + id="path7810" + sodipodi:nodetypes="ccccccccc" /> + <text + id="text7812" + y="346.22397" + x="1323.3237" + style="font-size:32.92305374px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + y="346.22397" + x="1323.3237" + id="tspan7814" + sodipodi:role="line">Subtraction</tspan></text> + <path + id="path7816" + d="M 1389.2671,420.18825 L 1422.0468,420.18825 L 1422.0468,480.13612 L 1389.2671,480.13612 L 1389.2671,420.18825 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4.00000028, 4.00000028;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 1411.3452,372.34376 L 1411.3452,405.12347 L 1351.3973,405.12347 L 1351.3973,372.34376 L 1411.3452,372.34376 z" + id="path7818" /> + <path + id="path7850" + d="M 1534.4275,603.46662 L 1536.9936,715.65745" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.99999976;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="1413.6588" + y="631.49792" + id="text7852"><tspan + sodipodi:role="line" + id="tspan7854" + x="1413.6588" + y="631.49792" + dy="0 6.5306125 -6.1571202 0 0 0 4.3537416" + dx="0 -7.5755764e-08 0 0 0 0 -2.1768708">Ao - Bo</tspan></text> + <path + id="path7856" + d="M 1530.2556,953.47868 L 1529.7129,1119.6459" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="1414.9861" + y="657.44348" + id="text7887"><tspan + sodipodi:role="line" + id="tspan7889" + x="1414.9861" + y="657.44348" + dy="0 6.5306125 0 -6.1571202 0 0 8.7074833" + dx="0 -7.5755764e-08 0 0 0 0 -2.1768708">Ao x Bh</tspan></text> + <text + id="text7932" + y="1036.9882" + x="1469.9934" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + xml:space="preserve"><tspan + dx="0 0" + dy="0 0 0 8.7074833" + y="1036.9882" + x="1469.9934" + id="tspan7934" + sodipodi:role="line">- Ah</tspan></text> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -129.54136,380.68793 L -129.54136,584.96918 L 147.75617,584.96918 L 190.63429,584.96918 L 191.11257,490.78253 L 162.64795,490.93559 L 163.02759,568.83105 L 148.30409,568.88948 L 148.30409,380.68793 L -129.54136,380.68793 z" + id="path8337" /> + <path + id="path8339" + d="M 552.35971,380.68793 L 552.35971,584.96918 L 829.65724,584.96918 L 872.53536,584.96918 L 873.01364,490.78253 L 844.54902,490.93559 L 844.92866,568.83105 L 830.20516,568.88948 L 830.20516,380.68793 L 552.35971,380.68793 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 1369.7174,380.68793 L 1369.7174,584.96918 L 1647.015,584.96918 L 1689.8931,584.96918 L 1690.3714,490.78253 L 1661.9067,490.93559 L 1662.2864,568.83105 L 1647.5629,568.88948 L 1647.5629,380.68793 L 1369.7174,380.68793 z" + id="path8341" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dasharray:3.99999928, 3.99999928;stroke-dashoffset:0;stroke-opacity:1" + d="M 1338.7111,363.56119 L 1681.5683,363.56119 L 1681.5683,428.95375 L 1681.5683,542.13261 L 1338.7111,542.13261 L 1338.7111,363.56119 z" + id="path7808" + sodipodi:nodetypes="cccccc" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -364.66175,776.08956 L -364.66175,954.65206 L -334.2555,954.65206 L -334.2555,997.49581 L -56.974249,997.49581 L -14.099249,997.49581 L -13.599249,903.30831 L -21.786749,903.33956 L -21.786749,776.08956 L -364.66175,776.08956 z" + id="path8350" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;stroke-dasharray:4,4" + d="M -56.411749,954.65206 L -41.817999,954.65206 L -41.692999,981.37081 L -56.411749,981.40206 L -56.411749,954.65206 z" + id="path8343" /> + <path + id="path8354" + d="M -159.9375,1140.8989 L -159.9375,1319.4614 L -129.53125,1319.4614 L -129.53125,1362.3052 L 147.75,1362.3052 L 190.625,1362.3052 L 191.125,1268.1177 L 182.9375,1268.1489 L 182.9375,1140.8989 L -159.9375,1140.8989 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + id="path8356" + d="M 148.3125,1319.4614 L 162.90625,1319.4614 L 163.03125,1346.1802 L 148.3125,1346.2114 L 148.3125,1319.4614 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 456.93964,767.0468 L 456.93964,928.4843 L 734.78339,928.4843 L 734.78339,767.0468 L 456.93964,767.0468 z" + id="path8365" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 768.84589,877.20305 L 749.12714,877.2968 L 749.37714,928.4843 L 768.84589,928.4843 L 768.84589,877.20305 z" + id="path8358" /> + <path + id="path8367" + d="M 768.84589,1123.4878 L 749.12714,1123.5816 L 749.37714,1174.7691 L 768.84589,1174.7691 L 768.84589,1123.4878 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 768.84375 1365.4375 L 753.84375 1365.5 L 753.84375 1396.3438 L 749.28125 1396.3438 L 749.375 1416.7188 L 768.84375 1416.7188 L 768.84375 1365.4375 z " + id="path8369" /> + <path + id="path8376" + d="M 1207.5386,1365.4375 L 1192.5386,1365.5 L 1192.5386,1396.3438 L 1187.9761,1396.3438 L 1188.0698,1416.7188 L 1207.5386,1416.7188 L 1207.5386,1365.4375 z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.99999928;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 1368.7188 727.3125 L 1368.7188 753.15625 L 1411.375 753.15625 L 1411.375 727.3125 L 1368.7188 727.3125 z M 1502.1562 735.28125 L 1503.3125 774.9375 L 1630.1562 774.25 L 1629.7188 843.96875 L 1369.2812 845.21875 L 1369.2812 869.53125 L 1647.125 869.53125 L 1647.125 735.28125 L 1502.1562 735.28125 z M 1690.375 834.03125 L 1681.5625 834.09375 L 1681.5625 885.375 L 1662.1562 885.375 L 1662.2812 912.09375 L 1647.5625 912.125 L 1647.5625 885.375 L 1369.7188 885.375 L 1369.7188 928.21875 L 1647 928.21875 L 1689.9062 928.21875 L 1690.375 834.03125 z M 1663.4062 838.125 L 1660.4375 838.15625 L 1660.5938 870.46875 L 1663.4062 870.46875 L 1663.4062 838.125 z " + id="path7892" /> + <path + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 1368.2454,1469.8261 L 1368.2454,1495.6699 L 1410.9016,1495.6699 L 1410.9016,1469.8261 L 1368.2454,1469.8261 z M 1501.1204,1478.1386 L 1501.5579,1492.9824 L 1528.6516,1492.9824 L 1528.6516,1517.6386 L 1629.1204,1517.1074 L 1628.6829,1586.8261 L 1528.6516,1587.2949 L 1528.6516,1612.3886 L 1639.4016,1612.3886 L 1646.0891,1612.3886 L 1646.0891,1478.1386 L 1501.1204,1478.1386 z M 1688.9016,1579.9199 L 1681.1204,1579.9511 L 1681.1204,1584.1386 L 1681.1204,1632.6699 L 1660.6829,1632.6699 L 1660.8079,1657.9511 L 1646.0891,1658.0136 L 1646.0891,1632.6699 L 1637.8391,1632.6699 L 1528.6516,1632.6699 L 1528.6516,1647.0136 L 1441.7454,1647.0136 L 1441.7454,1632.6699 L 1368.2454,1632.6699 L 1368.2454,1674.1074 L 1645.5579,1674.1074 L 1688.4329,1674.1074 L 1688.9016,1579.9199 z M 1663.4016,1580.0449 L 1660.4329,1580.0761 L 1660.5891,1612.3886 L 1663.4016,1612.3886 L 1663.4016,1580.0449 z M 1441.7454,1587.7011 L 1368.2454,1588.0761 L 1368.2454,1612.3886 L 1441.7454,1612.3886 L 1441.7454,1587.7011 z" + id="path8411" /> + <path + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M -161.22241,1457.4046 L -161.22241,1635.9671 L -131.22241,1635.9671 L -131.22241,1677.4046 L 146.09009,1677.4046 L 188.96509,1677.4046 L 189.43379,1583.2171 L 181.65259,1583.2484 L 181.65259,1457.4046 L -161.22241,1457.4046 z M -148.53491,1466.1859 L -88.566206,1466.1859 L -88.566206,1473.1234 L -131.22241,1473.1234 L -131.22241,1498.9671 L -148.53491,1498.9671 L -148.53491,1466.1859 z M 146.62129,1481.4359 L 163.93379,1481.4359 L 163.93379,1583.3421 L 160.96509,1583.3734 L 161.12129,1615.6859 L 146.62129,1615.6859 L 146.62129,1481.4359 z M 2.0900943,1496.2796 L 29.183794,1496.2796 L 29.183794,1520.9359 L 2.8087943,1521.0921 L 2.0900943,1496.2796 z M 29.183794,1590.5921 L 29.183794,1615.6859 L -57.722406,1615.6859 L -57.722406,1590.9984 L 29.183794,1590.5921 z M -131.22241,1591.3734 L -131.22241,1615.6859 L -147.00371,1615.6859 L -147.00371,1591.4359 L -131.22241,1591.3734 z M -57.722406,1635.9671 L 29.183794,1635.9671 L 29.183794,1650.3109 L -57.722406,1650.3109 L -57.722406,1635.9671 z M 146.62129,1635.9671 L 161.21509,1635.9671 L 161.34009,1661.2484 L 146.62129,1661.3109 L 146.62129,1635.9671 z" + id="path8416" /> + <path + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 936.10246,1469.7356 L 936.10246,1495.5793 L 893.44616,1495.5793 L 893.44616,1587.9856 L 966.94616,1587.6106 L 966.94616,1492.8918 L 1026.7586,1492.8918 L 1026.3211,1478.0481 L 1171.29,1478.0481 L 1171.29,1469.7356 L 936.10246,1469.7356 z M 914.00866,1510.6418 L 946.78996,1510.6418 L 946.78996,1570.5793 L 914.00866,1570.5793 L 914.00866,1510.6418 z M 1154.3212,1517.0168 L 1053.8524,1517.5481 L 1053.8524,1587.2043 L 1153.8837,1586.7356 L 1154.3212,1517.0168 z M 1206.3212,1579.8606 L 1188.6025,1579.9543 L 1188.6025,1612.2981 L 1185.79,1612.2981 L 1185.8837,1632.5793 L 1206.3212,1632.5793 L 1206.3212,1584.0481 L 1206.3212,1579.8606 z M 893.44616,1612.2981 L 893.44616,1632.5793 L 966.94616,1632.5793 L 966.94616,1612.2981 L 893.44616,1612.2981 z M 1053.8524,1612.2981 L 1053.8524,1632.5793 L 1163.04,1632.5793 L 1171.29,1632.5793 L 1171.29,1612.2981 L 1164.6025,1612.2981 L 1053.8524,1612.2981 z" + id="path8421" /> + <path + id="path8406" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:4;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 1368.7188,1164.468 L 1368.7188,1190.3118 L 1411.375,1190.3118 L 1411.375,1164.468 L 1368.7188,1164.468 z M 1502.1562,1172.4368 L 1502.4688,1182.843 L 1529.0938,1182.843 L 1529.0938,1211.968 L 1630.1562,1211.4055 L 1629.7188,1281.1243 L 1529.0938,1281.593 L 1529.0938,1306.6868 L 1647.125,1306.6868 L 1647.125,1172.4368 L 1502.1562,1172.4368 z M 1690.375,1271.1868 L 1681.5625,1271.2493 L 1681.5625,1322.5305 L 1662.1562,1322.5305 L 1662.2812,1349.2493 L 1647.5625,1349.2805 L 1647.5625,1322.5305 L 1529.0938,1322.5305 L 1529.0938,1336.8743 L 1442.2188,1336.8743 L 1442.2188,1322.5305 L 1369.7188,1322.5305 L 1369.7188,1365.3743 L 1647,1365.3743 L 1689.9062,1365.3743 L 1690.375,1271.1868 z M 1442.2188,1282.0305 L 1369.2812,1282.3743 L 1369.2812,1306.6868 L 1442.2188,1306.6868 L 1442.2188,1282.0305 zM 1663.4016,1275.2675 L 1660.4329,1275.2987 L 1660.5891,1307.6112 L 1663.4016,1307.6112 L 1663.4016,1275.2675 z" /> + <text + xml:space="preserve" + style="font-size:24px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans" + x="181.63506" + y="73.380066" + id="text2348"><tspan + sodipodi:role="line" + id="tspan2350" + x="181.63506" + y="73.380066">Shape Boolops</tspan><tspan + sodipodi:role="line" + x="181.63506" + y="103.38007" + id="tspan2352">Michael Sloan</tspan></text> + </g> +</svg> diff --git a/doc/sweep.svg b/doc/sweep.svg new file mode 100644 index 0000000..72920c9 --- /dev/null +++ b/doc/sweep.svg @@ -0,0 +1,430 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1052.3622" + height="744.09448" + id="svg2" + version="1.1" + inkscape:version="0.46+devel r21616 custom" + sodipodi:docname="sweep.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible"> + <path + id="path936" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective859" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.70082296" + inkscape:cx="851.52284" + inkscape:cy="299.19226" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1680" + inkscape:window-height="977" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid12" + empspacing="4" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + units="mm" + spacingx="1mm" + spacingy="1mm" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-308.2677)"> + <path + id="path1413" + d="m 226.77166,712.2047 c 99.2126,-28.34646 368.50394,14.17323 481.88976,0" + style="fill:none;stroke:#000000;stroke-width:1px" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px" + d="m 240.94489,953.14958 127.55905,0" + id="path847" /> + <path + id="path849" + d="m 637.79528,953.14958 127.55905,0" + style="fill:none;stroke:#000000;stroke-width:1px" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px" + d="m 226.77166,726.37793 c 85.03937,0 396.85039,0 396.85039,212.59842" + id="path843" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px" + d="m 432.28348,818.50391 42.51968,-28.34646 0,56.69291 -42.51968,-28.34645" + id="path845" /> + <rect + y="471.25983" + x="141.73233" + height="28.346457" + width="42.519684" + id="rect793" + style="fill:#b3b3b3;stroke:none" /> + <rect + y="471.25983" + x="255.11816" + height="28.346457" + width="42.519684" + id="rect797" + style="fill:#b3b3b3;stroke:none" /> + <rect + y="471.25983" + x="368.504" + height="28.346457" + width="42.519684" + id="rect801" + style="fill:#b3b3b3;stroke:none" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect14" + width="42.519684" + height="28.346457" + x="481.8898" + y="471.25983" /> + <path + id="path795" + d="m 127.55911,414.56689 0,155.90553" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" /> + <path + id="path799" + d="m 240.94494,414.5669 c 0,0 0,30.55294 0,56.69292 0,7.08661 3.54331,10.62992 7.08661,10.62992 8.89859,0 21.25985,0 21.25985,10.62992 0,21.97915 -21.25985,15.37432 -21.25985,7.08661 0,-7.08661 -7.08661,-6.84684 -7.08661,0 0,27.18227 0,70.86615 0,70.86615" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + sodipodi:nodetypes="cssssss" /> + <path + sodipodi:nodetypes="cssssssssss" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + d="m 354.33077,414.56689 c 0,0 0,30.55294 0,56.69292 0,7.08661 3.54331,10.62992 7.08661,10.62992 5.30296,0 10.62992,1e-5 14.17323,1e-5 7.08661,0 4.51157,-14.57853 10.62992,-17.71654 5.14942,-2.64105 21.25984,-3.5433 28.34646,3.54331 7.08661,7.08662 7.08661,28.34646 0,35.43307 -7.08662,7.08661 -38.71107,5.28254 -46.063,3.54331 -3.44813,-0.81572 -7.08661,-3.07644 -7.08661,-7.08662 0,-7.08662 -7.08661,-6.84685 -7.08661,0 0,27.18227 0,70.86615 0,70.86615" + id="path805" /> + <path + id="path791" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + d="m 467.71659,570.47242 0,-81.49607 7.08662,0 -10e-6,10.62993 c 0,3.92598 3.16063,7.08661 7.08661,7.08661 l 42.5197,0 c 3.92598,0 7.08661,-3.16063 7.08661,-7.08661 l 0,-28.34646 c 0,-3.92598 -3.16063,-7.08661 -7.08661,-7.08661 l -42.5197,0 c -3.92598,0 -7.08661,3.16063 -7.08661,7.08661 l 10e-6,10.62992 -7.08662,0 0,-67.32284" + sodipodi:nodetypes="cccccccccccccc" /> + <rect + y="471.25983" + x="595.2757" + height="28.346457" + width="42.519684" + id="rect815" + style="fill:#b3b3b3;stroke:none" /> + <path + id="path817" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + d="m 609.44888,513.7795 -14.17326,0 c -7.85197,0 -14.17323,-6.32126 -14.17323,-14.17323 l 3e-5,-10.62992 7.08663,10e-6 -10e-6,10.62992 c 0,3.92598 3.16063,7.08661 7.08661,7.08661 l 42.5197,0 c 3.92598,0 7.08661,-3.16063 7.08661,-7.08661 l 0,-28.34646 c 0,-3.92598 -3.16063,-7.08661 -7.08661,-7.08661 l -42.5197,0 c -3.92598,0 -7.08661,3.16063 -7.08661,7.08661 l 10e-6,10.62992 -7.08663,0 -3e-5,-10.62992 c 0,-7.85197 6.32126,-14.17323 14.17323,-14.17323 l 14.17326,0 m 0,0 0,-42.51969 m 0,155.90552 0,-56.69292" + sodipodi:nodetypes="cccccccccccccccccccccc" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect823" + width="42.519684" + height="28.346457" + x="708.66144" + y="471.25983" /> + <path + sodipodi:nodetypes="cccccccccccccccccccccccccc" + d="m 772.441,414.5669 0,67.32284 -7.08661,0 -3e-5,-10.62992 c 0,-7.85197 -6.32126,-14.17323 -14.17323,-14.17323 l -42.51971,0 c -7.85197,0 -14.17323,6.32126 -14.17323,14.17323 l 3e-5,10.62992 7.08663,10e-6 -10e-6,-10.62993 c 0,-3.92598 3.16063,-7.08661 7.08661,-7.08661 l 42.5197,0 c 3.92598,0 7.08661,3.16063 7.08661,7.08661 l 0,28.34646 c 0,3.92598 -3.16063,7.08661 -7.08661,7.08661 l -42.5197,0 c -3.92598,0 -7.08661,-3.16063 -7.08661,-7.08661 l 10e-6,-10.62992 -7.08663,0 -3e-5,10.62991 c 0,7.85197 6.32126,14.17323 14.17323,14.17323 l 42.51971,0 c 7.85197,0 14.17323,-6.32126 14.17323,-14.17323 l 3e-5,-10.62992 7.08661,0 0,81.49607" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + id="path825" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect831" + width="42.519684" + height="28.346457" + x="822.04724" + y="471.25983" /> + <path + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + d="m 878.74021,414.5669 0,155.90553" + id="path833" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect835" + width="297.63779" + height="28.346457" + x="354.33069" + y="938.97632" /> + <rect + y="783.07086" + x="467.71661" + height="14.173101" + width="14.173126" + id="rect841" + style="fill:#b3b3b3;stroke:none" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect837" + width="14.173126" + height="14.173101" + x="467.71652" + y="839.76385" /> + <rect + style="fill:#b3b3b3;stroke:none" + id="rect839" + width="14.173228" + height="14.173239" + x="425.19684" + y="811.4173" /> + <path + sodipodi:nodetypes="cccccccccccccc" + d="m 325.98426,1038.189 -1e-5,-92.12603 21.25985,0 0,24.80315 c 0,3.92598 3.16063,7.08661 7.08661,7.08661 l 297.6378,0 c 3.92598,0 10.62992,-3.16063 10.62992,-7.08661 l 0,-35.43308 c 0,-3.92598 -6.70394,-7.08661 -10.62992,-7.08661 l -297.63779,0 c -3.92598,0 -7.08661,3.16063 -7.08661,7.08661 l -10e-6,3.54331 -21.25985,0 1e-5,-255.11811" + style="fill:none;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0" + id="path877" /> + <path + transform="translate(116.92914,503.1496)" + d="m 212.59842,226.77164 a 3.5433071,3.5433071 0 1 1 -7.08661,0 3.5433071,3.5433071 0 1 1 7.08661,0 z" + sodipodi:ry="3.5433071" + sodipodi:rx="3.5433071" + sodipodi:cy="226.77164" + sodipodi:cx="209.05511" + id="use883" + style="fill:#00ff00;stroke:none" + sodipodi:type="arc" /> + <path + transform="translate(116.92914,726.37794)" + d="m 212.59842,226.77164 a 3.5433071,3.5433071 0 1 1 -7.08661,0 3.5433071,3.5433071 0 1 1 7.08661,0 z" + sodipodi:ry="3.5433071" + sodipodi:rx="3.5433071" + sodipodi:cy="226.77164" + sodipodi:cx="209.05511" + id="use891" + style="fill:#00ff00;stroke:none" + sodipodi:type="arc" /> + <path + transform="translate(453.54332,726.37794)" + d="m 212.59842,226.77164 a 3.5433071,3.5433071 0 1 1 -7.08661,0 3.5433071,3.5433071 0 1 1 7.08661,0 z" + sodipodi:ry="3.5433071" + sodipodi:rx="3.5433071" + sodipodi:cy="226.77164" + sodipodi:cx="209.05511" + id="use881" + style="fill:#00ff00;stroke:none" + sodipodi:type="arc" /> + <path + transform="translate(138.18898,726.37794)" + d="m 212.59842,226.77164 a 3.5433071,3.5433071 0 1 1 -7.08661,0 3.5433071,3.5433071 0 1 1 7.08661,0 z" + sodipodi:ry="3.5433071" + sodipodi:rx="3.5433071" + sodipodi:cy="226.77164" + sodipodi:cx="209.05511" + id="path887" + style="fill:#ff0000;stroke:none" + sodipodi:type="arc" /> + <use + x="0" + y="0" + xlink:href="#path887" + id="use893" + transform="translate(276.37795,-24.803144)" + width="744.09448" + height="1052.3622" /> + <path + style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" + d="m 127.55911,428.74013 28.34645,0" + id="path916" /> + <use + height="1052.3622" + width="744.09448" + transform="translate(340.15748,1.7672246e-6)" + id="use1369" + xlink:href="#path916" + y="0" + x="0" /> + <use + x="0" + y="0" + xlink:href="#path916" + id="use1367" + transform="translate(481.88976,1.7672246e-6)" + width="744.09448" + height="1052.3622" /> + <path + id="path1371" + d="m 262.20478,506.69289 c 10.03817,7.0722 19.2398,4.10591 28.34646,0" + style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" + d="m 388.22918,456.94784 c -12.15917,-1.71331 -18.9939,5.12449 -25.22416,12.93305" + id="path1373" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" + d="m 688.46073,501.78863 c 0.007,13.75525 8.4367,18.00622 20.95338,19.09129" + id="path1375" /> + <use + x="0" + y="0" + xlink:href="#path1375" + id="use1377" + transform="matrix(1,0,0,-1,-0.70939357,971.46722)" + width="744.09448" + height="1052.3622" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="623.62207" + y="783.07086" + id="text1379"><tspan + sodipodi:role="line" + id="tspan1381" + x="623.62207" + y="783.07086" + style="font-size:12px">this tile has its both ends</tspan><tspan + sodipodi:role="line" + x="623.62207" + y="798.07086" + id="tspan1383" + style="font-size:12px">in the "known" area, but still</tspan><tspan + sodipodi:role="line" + x="623.62207" + y="813.07086" + id="tspan1385" + style="font-size:12px">travels through the unknown.</tspan></text> + <path + id="path1387" + d="m 418.11024,818.50391 -85.03937,0" + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;marker-end:url(#Arrow1Send)" + sodipodi:nodetypes="cc" /> + <text + id="text1395" + y="839.76373" + x="340.15747" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:12px" + y="839.76373" + x="340.15747" + sodipodi:role="line" + id="tspan1407">this piece should </tspan><tspan + style="font-size:12px" + y="854.76373" + x="340.15747" + sodipodi:role="line" + id="tspan1419">be inserted here</tspan></text> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#Arrow1Send)" + d="m 694.4882,825.59053 c 0,28.34645 -48.419,52.18112 -70.86615,56.69291" + id="path1411" /> + <path + sodipodi:nodetypes="cc" + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;marker-end:url(#Arrow1Send)" + d="M 446.46402,797.25871 C 435.54028,749.38028 382.88666,716.7021 332.35416,712.2047" + id="path1415" /> + <use + x="0" + y="0" + xlink:href="#use883" + id="use1417" + transform="translate(4.0944874e-7,-28.346454)" + width="744.09448" + height="1052.3622" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="396.85037" + y="726.37793" + id="text1425"><tspan + id="tspan1429" + sodipodi:role="line" + x="396.85037" + y="726.37793" + style="font-size:12px">not there!</tspan></text> + <path + style="fill:none;stroke:#ff0000;stroke-width:4" + d="m 411.02363,768.89761 42.51968,0 m -14.17322,-14.17323 -14.17323,28.34646" + id="path1433" + sodipodi:nodetypes="cccc" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="212.59842" + y="357.87399" + id="text1435"><tspan + sodipodi:role="line" + x="212.59842" + y="357.87399" + id="tspan1439" + style="font-size:20px">Deformations of the sweep line when crossing a vertex box.</tspan></text> + <use + height="1052.3622" + width="744.09448" + transform="translate(751.18105,5.1777802e-6)" + id="use1457" + xlink:href="#path916" + y="0" + x="0" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="170.07874" + y="641.33856" + id="text1459"><tspan + sodipodi:role="line" + id="tspan1461" + x="170.07874" + y="641.33856" + style="font-size:20px">Why should tiles be kept in the context until the end of their last box.</tspan></text> + </g> +</svg> diff --git a/doc/tutorial.txt b/doc/tutorial.txt new file mode 100644 index 0000000..9d0c81e --- /dev/null +++ b/doc/tutorial.txt @@ -0,0 +1,291 @@ +(09:03:49) ACSpike: I tried to glean drawing a circle from conic-4 (I think) I'm either missing the drawing of the circle in the rest of the code, or it is just so short and simple that I don't get it +(09:08:03) ACSpike: heh, oh "Define here various primatives, such as line, line segment, circle, bezier path etc." +(09:18:29) njh: don't look at that +(09:18:37) njh: that's done in a hacky way +(09:19:09) njh: ok, lets plan what your program will do +(09:19:23) njh: I'm thinking an 'on canvas' editor for gears +(09:20:13) njh: the biggest problem is that you have lumpy parameters (for example number of teeth is a whole number) +(09:20:54) ACSpike: lets start smaller +(09:21:00) njh: ok +(09:21:09) njh: howabout just drawing a circle +(09:21:11) ACSpike: I need an entry point into the world of 2geom +(09:21:31) ACSpike: can I get an svg path for a circle? +(09:21:35) njh: well, what I was going to suggest was just making circles with handles +(09:21:44) ACSpike: ie, no gtk gui stuff +(09:21:47) njh: hehe, I still haven't done circles :) +(09:21:52) njh: but you can use cairo +(09:21:58) ACSpike: well +(09:22:02) njh: cairo_arc +(09:22:03) ACSpike: what can I get? +(09:22:27) njh: lets make a program that just draws a single circle +(09:23:00) ACSpike: ok. back in a bit +(09:31:15) njh: ok +(09:31:22) njh: I've committed a starting point for you +(09:31:23) ACSpike: ok, I get it. 2geom doesn't do svg +(09:31:29) ACSpike: it does beziers +(09:31:37) ACSpike: and draws them on a cairo surface +(09:32:27) njh: at this point, yeah +(09:32:38) njh: actually, it doesn't even draw them :) +(09:32:54) njh: that's done by path-cairo, which is demidetached :) +(09:33:22) njh: so gear.cpp is a starting point for you +(09:33:51) njh: one issue is that I haven't done elliptical arcs in Paths yet +(09:34:04) njh: so we're going to not even use paths at this point +(09:34:34) njh: just attempt to make a circle using sbasis rather than calling cairo_arc +(09:35:03) verbalshadow [verbalshadow@gristle.org/Laptop] entered the room. +(09:35:17) ACSpike: oy +(09:35:19) njh: so a circle is parameterised by <cos(t), sin(t)> with t going form 0 to 2*pi +(09:35:27) ACSpike: right +(09:35:41) njh: does gear compile and run on your computer? +(09:36:35) ACSpike: did you commit it? +(09:39:27) njh: I spose I should add before commiting +(09:39:37) njh: done +(09:39:57) njh: ok, your second step will be to add two handles +(09:48:04) njh: feel free to ask if you are stuck +(09:48:50) ACSpike: oh, boy +(09:49:04) ACSpike: so we have a handle for radius +(09:50:01) Botty: the most elegant way to do this convex stuff would be to have a circular iterator +(09:50:16) Botty: i suppose modulus works +(09:51:32) njh: it does +(09:51:55) njh: ACSpike: the longest journey starts with a single step +(09:52:11) ACSpike: or a single grep +(09:52:24) njh: I prefer emacs isearch +(09:52:35) njh: so, does it compile? +(09:52:39) ACSpike: ya +(09:52:41) ACSpike: and runs +(09:52:48) njh: and have yuo worked out how to add a handle +(09:52:59) ACSpike: pushback +(09:53:05) njh: yep +(09:53:11) njh: just increase the loop +(09:53:27) njh: generates random handles +(09:53:51) njh: anyway, have you got two extra handles? +(09:54:00) ACSpike: no +(09:54:01) njh: please tell me when you have something working +(09:54:16) ACSpike: I'm trying to grok the single handle +(09:54:33) njh: just assume that handles can be moved anyway +(09:54:40) njh: how they work is a bit fiddly +(09:54:49) ACSpike: and raise kids :-) +(09:54:51) njh: but all they are is a Geom::Point +(09:57:54) njh: no +(09:58:05) njh: how do I do that? +(10:01:44) ACSpike: yes +(10:05:04) ACSpike: norm ~ magnatude ~ distance? +(10:06:07) njh: norms are like distance, yes +(10:06:31) njh: but not just 'as the crow flies' distance +(10:06:51) njh: another norm would be how long it takes you to get between places +(10:07:17) njh: 2geom provides a few norms: L2 and Linfinity +(10:07:28) njh: L2 = eucliean, as the crow flies distance +(10:07:34) ACSpike: L1, L2 and infinity +(10:07:47) ACSpike: l1 equals as the taxi drives +(10:07:50) njh: Linfinity = maximum distance in x or y +(10:07:56) njh: yeah l1 is taxi +(10:08:07) Botty: (X+Y) +(10:08:11) ACSpike: linfinity is x or y? +(10:08:14) njh: no, |X| + |Y| +(10:08:23) Botty: good point... +(10:08:25) njh: Linfinity = max(|X|, |Y|) +(10:08:30) ACSpike: right +(10:08:34) ACSpike: interesting +(10:08:40) ACSpike: thanks +(12:02:59) ACSpike: what should I do with these two random handles? +(12:03:19) ACSpike: pressure angle and number of teeth is what's needed +(12:06:18) njh: lets start with a line +(12:06:49) ACSpike: like constrain the movement of the handles? +(12:06:52) njh: ok, SBasis functions map [0,1] to a value +(12:06:57) njh: no, just darwing a line segment +(12:07:20) ACSpike: each handle makes one endpoint? +(12:07:21) njh: so we want to construct a function that maps [0,1] onto a line from handle 1 to handle 2 +(12:08:14) njh: do you have two new handles? +(12:09:35) ACSpike: yes +(12:09:59) njh: ok, so we're going to make a pair of sbasis functions, one for x, one for y +(12:10:10) njh: to do this we need a multidim_sbasis<2> +(12:10:18) njh: (one day I'll work out better names :) +(12:10:28) ACSpike: which means, a second degree sbasis? +(12:10:47) njh: multidim_sbasis<2> B; +(12:10:56) ACSpike: this is global? +(12:10:57) njh: it means a function which maps [0,1] onto a point +(12:11:03) njh: no, put it in expose +(12:11:07) njh: everything goes in expose +(12:20:09) njh: anyway, so you have a function that maps [0,1] onto a point +(12:20:08) ACSpike: I'm about to look for the definition of multidim_sbasis +(12:20:15) njh: don't +(12:20:23) njh: it's complicated and not necessary +(12:20:27) ACSpike: ok +(12:20:36) ACSpike: leaps with faith +(12:21:21) njh: so we need to define what the functions are for X and Y +(12:21:36) njh: just like a point, these are B[X] and B[Y] +(12:21:47) ACSpike: ah +(12:21:55) ACSpike: X and Y are defined somewhere? +(12:22:00) njh: yeah, in point I think +(12:22:06) njh: but I'm lazy and use 0 and 1 +(12:22:12) ACSpike: ah, good +(12:23:33) njh: Now the simplest function maps [0,1] onto a constant value +(12:23:53) njh: we could do this with B[0] = handles[1][0]; +(12:23:59) ACSpike: so all values between 0 and 1 are the same +(12:24:03) njh: and similarly B[1] = handles[1][1]; +(12:24:07) njh: yep +(12:24:11) njh: that would define a point +(12:24:32) njh: (I'm not sure that would compile, due to missing code) +(12:24:48) njh: I usually do everything in parallel like this: +(12:24:55) njh: for(int im = 0; dim < 2; dim++) +(12:25:04) njh: B[dim] = handles[1][dim]; +(12:25:25) njh: remember that handles[0] is the point on the gear we did already +(12:25:51) njh: we're going to draw a line somewhere +(12:25:57) njh: (you have to draw a line somewhere!) +(12:26:27) njh: to do this we want to map [0,1] to points between handles[1] and handles[2] +(12:27:06) njh: for technical(and not very good) reasons this means using BezOrds +(12:27:11) ACSpike: pause for reflection +(12:27:11) njh: like this: +(12:27:30) njh: B[dim] = BezOrd(handles[1][dim], handles[2][dim]); +(12:27:41) ACSpike: what are BezOrds? +(12:27:50) njh: so try adding that code into expose +(12:28:07) njh: BezOrd(a,b) maps 0,1 onto [a,b] +(12:29:48) njh: the reason for BezOrds is they are the fundamental unit for all the maths +(12:30:08) ACSpike: what does BezOrd mean though? +(12:30:10) njh: just like points are the fundamental units for graphics +(12:30:14) njh: Bezier Ordinal +(12:30:16) ACSpike: I need to attach the idea to the name +(12:30:27) njh: you can think of them as linear bezier segments +(12:30:46) njh: add another poit and you have a quadratic, another, cubic +(12:31:08) njh: a two point bezier is a line segment +(12:31:13) Botty: so its like a parametric thing? +(12:31:19) njh: Botty: correct +(12:31:30) njh: parametric here means maps from [0,1] to a point +(12:31:37) njh: <x(t), y(t)> +(12:31:38) ACSpike: sbasis is all parametric vector squishyness +(12:31:50) njh: yes, most computer graphics is parametric +(12:31:59) ACSpike: and squishy +(12:32:06) njh: sometimes +(12:32:11) njh: sometimes it is all angular +(12:39:28) ACSpike: do I need to draw the bezord out? +(12:39:39) njh: draw it out? +(12:39:41) njh: to the canvas? +(12:40:08) njh: no, here is some boilerplate to draw a md_sb to the canvas +(12:40:25) njh: void draw_cb(cairo_t *cr, multidim_sbasis<2> const &B) { + Geom::PathBuilder pb; + subpath_from_sbasis(pb, B, 0.1); + cairo_path(cr, pb.peek()); +} +(12:40:37) njh: add that to gear +(12:41:02) njh: perhaps change the name to draw_md_sb or something +(12:41:11) njh: then to draw B, just use: +(12:41:19) njh: draw_md_sb(cr, B); +(12:41:26) njh: (cr is the cairo canvas) +(12:41:38) njh: so paste what you have so far +(12:41:50) njh: (I mean just your lines, not the whole file!) +(12:46:12) ACSpike: random points are in the same spot on every execution? +(12:46:31) njh: correct +(12:46:36) ACSpike: neat +(12:46:48) njh: that's just rand() +(12:47:11) ACSpike: wow, the line. it moves. +(12:47:16) njh: if you want different positions you start the random number generator in a different spot, using say the current time +(12:47:28) njh: can you commit your changes? +(12:49:09) ACSpike: yes +(12:49:11) ACSpike: done +(12:50:24) njh: ok, so we have a single line :) +(12:50:35) ACSpike: and a single circle +(12:50:46) njh: now the nice thing about lines in this form is we can perform arithmetic on them +(12:50:46) ACSpike: but I don't know why we have a line +(12:50:54) ACSpike: ok +(12:52:14) njh: ok, so now you have some experience with lines, we're going to try to make an arc +(12:52:30) njh: remember that a circle is just <cos, sin> +(12:52:35) ACSpike: why would I perform arithmetic on a line? +(12:52:51) njh: because all geometry is arithmetic +(12:53:31) njh: so we're going to use two built in functions, sin and cos to make an arc from 0 to 1 radian +(12:53:52) njh: SBasis sin(double a0, double a1, int k); +SBasis cos(double a0, double a1, int k) +(12:54:15) njh: these two functions take a range of angles (a0, a1) and a parameter k +(12:54:23) njh: k is the accuracy +(12:54:30) njh: for now lets just use k = 2 +(12:55:23) njh: so lets make B[0] = BezOrd(centre[0]) + 100*cos(0,1,2); +(12:55:29) njh: and similarly Y +(12:55:44) ***njh has never tried this before, it might not work :) +(12:56:10) ACSpike: I realize you are taking really small really slow steps +(12:56:21) ACSpike: but I'm loosing a lot of it +(12:56:35) njh: that should make an arc centred at the centre with a radius 100 +(12:56:55) njh: perhaps we could convert this conversation into a tutorial when we're finished +(12:57:01) ACSpike: do I replace the line? +(12:57:06) njh: yeah +(12:57:07) ACSpike: make a new arc? +(12:57:09) ACSpike: ok +(12:57:19) njh: just comment out the line if you like +(12:57:25) njh: or you can overwrite it +(12:58:02) ACSpike: compiling +(13:00:05) ACSpike: http://rafb.net/paste/results/ZXudDC19.html +(13:01:26) ACSpike: misplaced parens? +(13:02:00) njh: no, missing defn +(13:02:03) njh: try +(13:02:16) njh: SBasis(BezOrd(centre[0])) + 100*cos(0,1,2); +(13:02:40) njh: might be due to std::cos actually +(13:02:48) njh: sin and cos are slightly crap +(13:03:00) njh: ah, I've got an idea +(13:05:37) njh: yep, looks like it will work +(13:07:02) ACSpike: indeed it does +(13:07:08) ACSpike: now I can draw arcs +(13:07:29) ACSpike: ok +(13:07:48) ACSpike: at this point I'm gonna copy the backlogs and go to bed +(13:08:07) njh: ok! +(13:08:09) njh: worked it out +(13:08:21) ACSpike: worked what? +(13:08:26) njh: I know all this sounds pedestrian +(13:08:46) ACSpike: you mean this tutorial? +(13:09:03) njh: but perhaps what you aren't realising is that when you write cos(0,1,2) you aren't just computing cos at a single point +(13:09:10) ACSpike: right +(13:09:12) njh: you are computing cos everywhere at the same time +(13:09:16) ACSpike: it the whole sweep +(13:09:19) njh: yep +(13:09:23) ACSpike: I see that +(13:09:31) ACSpike: but I don't "get" it at all :-) +(13:09:38) njh: if you run conic-3 you'll see that it converts to beziers automagically +(13:09:52) njh: well, do you understand how std::cos(t) works? +(13:10:11) ACSpike: I don't even understand the question +(13:10:31) njh: well, you wrote cos(x) in your gear program +(13:10:36) njh: do you understand how it works? +(13:10:38) ACSpike: my math is really rusty +(13:10:46) njh: right, yet you managed to draw gears +(13:11:02) njh: my point is that understanding how something works isn't entirely necessary to use it +(13:11:05) ACSpike: I don't know the definition of the function, but I know the triangle soh cah toa thing +(13:11:11) njh: yep +(13:11:32) njh: I use floating point all the time. I know exactly how it works,because I once implemented my own version +(13:11:41) njh: but 99.9999% of programmers don't +(13:11:52) ACSpike: I read the spec once +(13:11:53) njh: the same should be true of this new stuff +(13:12:13) ACSpike: but I want to grok it because I want to help +(13:12:19) njh: you should be able to make an involute without any more than a rough idea of how it works +(13:12:29) Botty: I just remember that sin is Y (intuitively opposite), cos is X (intuitively adjacent), and tan is Y / X +(13:12:32) njh: I think you will grok it, once you've got the hang of playing withit +(13:12:49) njh: we'll get some nice circular arcs going +(13:13:01) njh: maybe you can try and come up with a nice interface for circulat arcs +(13:13:04) ACSpike: I think right now I could draw all the arcs from the gear +(13:13:14) njh: yep, I think so too +(13:13:26) njh: and you would get bezier curves at the end, rather than line segments +(13:13:36) njh: and I think it would be a lot faster as well +(13:13:40) ACSpike: right +(13:13:44) njh: (actually, in this case, I doubt it metters :) +(13:14:04) ACSpike: curveto or arcto? +(13:14:19) njh: curveto, I'm afraid +(13:14:31) njh: I would like to pick the best choice, but I haven't worked out how yet +(13:14:56) ACSpike: so if I want to draw the involute I need to map that function in there somehow +(13:15:04) njh: but you can't represent involutes with arcs anyway +(13:15:07) njh: yeah +(13:15:13) ACSpike: ah hah +(13:15:15) njh: that is basically all there is to it +(13:15:24) ACSpike: so this is crazy function plotting +(13:15:38) njh: you should theoretically be able to just change the type of your equation to SBasis and use the old code +(13:15:57) njh: the only reason you can't do that is because I haven't written all the operator*(,) type functions :) +(13:16:19) njh: even more cool is you can compute the derivatives in the same way. that is something you simply can't do with point plotting +(13:16:50) njh: for example, if you want the tangent to a bezier path, B, just write derivative(B) +(13:17:10) njh: something I played with last night was trying to find the points of maximum and minimum curvature on paths +(13:17:14) njh: ('corners') +(13:17:29) njh: so I computed the curvature, took the derivative and found where that = 0 +(13:17:44) njh: SBasis curvature(multidim_sbasis<2> & B) { + multidim_sbasis<2> dB = derivative(B); + multidim_sbasis<2> ddB = derivative(dB); + SBasis n = multiply(dB[0], ddB[1]) - multiply(dB[1], ddB[0]); + SBasis den = multiply(dB[0], dB[0]) + multiply(dB[1], dB[1]); + den = multiply(den, den); + return divide(multiply(n, sqrt(den, 4)), den, 6); +} + +(13:17:54) njh: that is pretty much the definition off wikipedia +(13:18:16) njh: std::vector<double> r = roots(derivative(curvature(B))); +(13:18:42) njh: gives r, a list of t values with maximum or minimum curvature |