From 45394f6d0f2bc72ec0f1a11c280a073f2acab7c2 Mon Sep 17 00:00:00 2001 From: Pomax Date: Sun, 28 Feb 2021 12:28:41 -0800 Subject: [PATCH] full regeneration --- docs/chapters/abc/content.en-GB.md | 18 +- docs/chapters/arclength/content.en-GB.md | 8 +- docs/chapters/bsplined/content.en-GB.md | 22 +- docs/chapters/bsplines/content.en-GB.md | 18 +- docs/chapters/canonical/content.en-GB.md | 2 +- docs/chapters/catmullconv/content.en-GB.md | 26 +- .../circleintersection/content.en-GB.md | 4 +- docs/chapters/circles_cubic/content.en-GB.md | 6 +- docs/chapters/control/content.en-GB.md | 6 +- docs/chapters/control/content.ja-JP.md | 6 +- docs/chapters/control/content.ru-RU.md | 6 +- docs/chapters/control/content.zh-CN.md | 6 +- docs/chapters/curvefitting/content.en-GB.md | 18 +- docs/chapters/derivatives/content.en-GB.md | 32 +- docs/chapters/derivatives/content.ru-RU.md | 32 +- docs/chapters/explanation/content.en-GB.md | 26 +- docs/chapters/explanation/content.ja-JP.md | 26 +- docs/chapters/explanation/content.ru-RU.md | 26 +- docs/chapters/explanation/content.zh-CN.md | 26 +- docs/chapters/extended/content.en-GB.md | 4 +- docs/chapters/extended/content.ja-JP.md | 4 +- docs/chapters/extended/content.ru-RU.md | 8 +- docs/chapters/extended/content.zh-CN.md | 4 +- docs/chapters/extremities/content.en-GB.md | 6 +- docs/chapters/inflections/content.en-GB.md | 14 +- docs/chapters/matrixsplit/content.en-GB.md | 6 +- docs/chapters/matrixsplit/content.ja-JP.md | 6 +- docs/chapters/molding/content.en-GB.md | 4 +- docs/chapters/pointvectors/content.en-GB.md | 18 +- docs/chapters/polybezier/content.en-GB.md | 2 +- docs/chapters/reordering/content.en-GB.md | 14 +- docs/chapters/weightcontrol/content.en-GB.md | 4 +- docs/chapters/weightcontrol/content.ru-RU.md | 4 +- docs/chapters/whatis/content.en-GB.md | 12 +- docs/chapters/whatis/content.ja-JP.md | 10 +- docs/chapters/whatis/content.ru-RU.md | 14 +- docs/chapters/whatis/content.zh-CN.md | 12 +- docs/chapters/yforx/content.en-GB.md | 6 +- .../abc/131454dcbac04e567f322979f4af80c6.svg | 1 + .../abc/50543216f39c1b10af7cf4823844dd31.svg | 1 - .../abc/51a9d0588be822a5c80ea38f7d348641.svg | 1 + .../abc/5924e162b50272c40c842fad14b8fa48.svg | 1 + .../abc/634d373310711268cc188f45e5699d8d.svg | 1 + .../abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg | 1 - .../abc/8c6662f605722fb2ff6cd7f65243a126.svg | 1 + .../abc/8cd992c1ceaae2e67695285beef23a24.svg | 1 + .../abc/8e7cfee39c98f2ddf9b635a914066cf6.svg | 1 + .../abc/a0b99054cc82ca1fb147f077e175ef10.svg | 1 + .../abc/b9854fbcb1096f736607d292dbe48371.svg | 1 - .../abc/bb8674f5f36b054b7734e34b91ed924f.svg | 1 - .../abc/c018aab3952ea9193848564aab12b241.svg | 1 - .../abc/c10cf18edeffed67dc94d250310db475.svg | 1 - .../abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg | 1 - .../abc/f78ce50f725f208f25090abc7fd741b7.svg | 1 - .../2f80643c66d8f1448b13537a7b24eb45.svg | 1 - .../56533f47e73ad9fea08fa9bb3f597d49.png | Bin 11031 -> 11018 bytes .../5ce02cbdbc47585c588f2656d5161a32.png | Bin 11527 -> 11538 bytes .../85620f0332fcf16f56c580794fd094c5.svg | 1 + .../b76753476ad6ecfe4b8f39bcf9432980.svg | 1 + .../f251e86158649c0e57f7a772ebff83b4.svg | 1 - .../fe2663b205d14c157a5a02bfbbd55987.png | Bin 12388 -> 12372 bytes .../2421f47aa4fe1c0d830d53b2e6563c04.svg | 1 + .../2514e1aa0565840e33fde0b146e3efe2.svg | 1 + .../49af474c33ce0ee0733626ea3d988570.svg | 1 + .../a88566be442b67fb71f727de6bdb66df.svg | 1 - .../c7af721e5e201fc3742bce67ff6cd560.svg | 1 - .../cbdf5a61de10eeb6f23be077cf047ab5.svg | 1 - .../e62558cdfd8abaf22511e8e68c7afb4a.svg | 1 + .../ee203de6e554936588eb93adead0a3e5.svg | 1 - .../e61fd49e554a0ffc7d64893c75cd376d.svg | 1 - .../fff37fa4275e43302f71cf052417a19f.svg | 1 + .../00357d2a2168fe313cd0b38d95a1a681.svg | 1 - .../012a8ab7a4de935c1c8d61dcd14fc62c.svg | 1 + .../032409c03915a6ba75864e1dceae416d.svg | 1 + .../1f9fc156aeed9eb092573cd7446593d9.svg | 1 - ...g => 389a1ea8c9e92df9a2b38718e34bae7b.svg} | 0 .../639ca0b74a805c3aebac79b181eac908.svg | 1 + .../8a2a00812363fe1a6cfa7f81b48d31d1.svg | 1 - .../8d3a5ca7188f53b914229133b3dbe5fe.svg | 1 - .../902c290a790b4d44d10236f4a1456cdc.svg | 1 + .../9593c057c84ebf9beb70fd57a11c7e12.svg | 1 - .../98ddf6415bd9827a6d899b21d0a5f736.svg | 1 + .../9ae99b090883023a485be7be098858e9.svg | 1 + .../a323848e706c473833cda0b02bc220ef.svg | 1 + .../c0e30b49fbfce6f6b3c81eaa6ca5154f.svg | 1 - .../d09e7466c267614c89ead28d6a900ba1.svg | 1 - .../defc6fa4b51fa3c1945d15449f0f392d.svg | 1 - .../e653724c11600cbf682f1c809c8c6508.svg | 1 + .../2f42c862a0a9d0764727d42b16cf68a0.svg | 1 + .../373248ec6a579bacf6c6a317e6db597a.svg | 1 + .../3e0594855ca99fb87dcc65a693e1ad22.svg | 1 - .../674c42035da16a426ef7fe23277eea11.svg | 1 - .../065efe85cac2f359ea4d5d4bae94da97.svg | 1 + .../329dc34299d2fdb3c5f17828e3a23da0.svg | 1 - .../38b58b3c759b9bf340a3cf3de8bc599e.svg | 1 - .../496c0ee8945080a32bc02f78bc83ad43.svg | 1 + .../750e2c874fb58237608ebade1589fccc.svg | 1 - .../c509dc6fecd7992cb45a0b4d8f1bd001.svg | 1 + .../1b8c5e574dc67bfb0afc3fb0a8727378.png | Bin 16601 -> 16616 bytes .../4b206c16ccf8a06a0834fe9e5254560c.png | Bin 17792 -> 0 bytes .../501494295f07ba5049286489206d98f0.svg | 1 - ...g => 80cdfeab6ed6038f0e550ef5c1dcb7dd.svg} | 0 .../8332e5d34b7344bbee2a2e1f4521ce46.png | Bin 13971 -> 13998 bytes .../a337e3f97387b52d387fc01605314497.svg | 1 + .../b58fb122c5c8159938182c185f287142.svg | 1 - .../be82cd31c4892a8f0582b1b5285231d9.png | Bin 31587 -> 0 bytes .../c26d2655e8741ef7e2eeb4f6554fc7a5.png | Bin 30207 -> 30204 bytes .../c2f2fe0ef5d0089d9dd8e5e3999405cb.svg | 1 + .../f700cd59e6021b0e06b819105ec931da.png | Bin 14908 -> 0 bytes .../06605e008956609e8844ef95697c9096.svg | 1 - ...g => 097aa1948b6cdbf9dc7579643a7af246.svg} | 0 .../134baa1043d0849f31a1943d6d5bc607.svg | 1 + .../17d5fbeffcdcceca98cdba537295d258.svg | 1 + .../31d659cbc72bf304abf4c9a75b6b81de.svg | 1 - .../409d10c3005b0c93489d72a5dba692d7.svg | 1 - .../4e6e20c823c8cc72e0cc00e4ab5b7556.svg | 1 + .../505ab1ada6a187e9ba392d19739ac2c5.svg | 1 - ...g => 8928f757abd1376abdc4069e1aa774f2.svg} | 2 +- .../8a66af7570bac674966f6316820ea31b.svg | 1 + .../9651a687e1522b00bcba063881230902.svg | 1 - .../a6faaf6083c818431988fef49421cc47.svg | 1 - ...g => d39ca235454ced9681b523be056864d2.svg} | 0 .../dd303afb51d580fb2bf1b914c010f83d.svg | 1 + .../ff701138fd7a6e35700a2e1ee3e9c020.svg | 1 + .../0a865d627f82a72444b9edce61be6f09.png | Bin 14459 -> 0 bytes .../75661040b6b7b247def5edd5f0996cdb.png | Bin 10563 -> 0 bytes ...g => 02cecadc92b8ff681edc8edb0ace53ce.svg} | 0 .../153d99ce571bd664945394a1203a9eba.svg | 1 + .../171357d936dee742b43b9ffb7600c742.svg | 1 + .../2368534c6e964e6d4a54904cc99b8986.svg | 1 + .../2fc50617b6886534d1ab4638ed8a24ac.svg | 1 - .../3cd7b36839a248eb35f0b678d7bf5508.svg | 1 + ...g => 4eeb75f5de2d13a39f894625d3222443.svg} | 2 +- .../501494295f07ba5049286489206d98f0.svg | 1 - ...g => 5d7af72e00fb0390af5281d918d77055.svg} | 0 .../8324bf1885267fe157bf316e261d1b30.svg | 1 - .../869b60a8e6b992e6f62bc6a50b36deeb.svg | 1 + ...g => 8f78fdb9ef54b1bc4dbc00f07263cc97.svg} | 0 ...g => a7b79877822a8f60e45552dcafc0815d.svg} | 0 .../b58fb122c5c8159938182c185f287142.svg | 1 - .../d575699ab7d13c62f47d3071c0b00da3.svg | 1 - .../05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg | 1 - .../2493468e73b73f43eba8f66f0c189d1a.svg | 1 - ...g => 29695045f04fd06c75bfda7845121213.svg} | 0 .../2c47081c2a9c20d2110f13daa482a3ab.svg | 1 - .../39330ef5591cf0f3205564ad47255d4f.svg | 1 + .../39d33ea94e7527ed221a809ca6054174.svg | 1 + .../4bf2d790d2f50bf7767c948e0b9f9822.svg | 1 + .../4def87a6683264d420f84562776f4b6c.svg | 1 + .../668d140df9db486e5ff2d7c127eaa9d4.svg | 1 + .../6aa5d4e20e83be1c95eaad792517dde9.svg | 1 - .../6d58ec36bfb3fcff24248dc46889428a.svg | 1 - .../7a44f3eaa167a5022e2281c62e90fff8.svg | 1 + .../7f74178029422a35267fd033b392fe4c.svg | 1 + .../8986c536df8153b30197c3a5407d233a.svg | 1 - .../9229934d71b0b02921bc92594ef11a98.svg | 1 - .../9734aff037ac23a73504ff7cc846eab7.svg | 1 + .../9c921b7b8a8db831f787c1329e29f7cb.svg | 1 + .../a5bb1312adc5e9e23bee6b47555a6e8f.svg | 1 + .../adc7729f7872d71f3fbb1a79741ce10f.svg | 1 - .../af40980136c291814e8970dc2a3d8e63.svg | 1 + .../dc48cdf8f492b44c7602eb64ce2b9986.svg | 1 - .../f79dd2f2d992e22b8d057fdc641290b0.svg | 1 - .../fa3ed9a4ab61d80ec175d29533b5728e.svg | 1 - ...g => 08cd4a8bf4557862c095066728e6ed5e.svg} | 0 .../4e0fa763b173e3a683587acf83733353.svg | 1 + ...g => 5a7a12213ca36f2f833e638ea0174d4a.svg} | 0 .../dfd6ded3f0addcf43e0a1581627a2220.svg | 1 + .../e2e71b397009b51af8a3ee848bc727b4.svg | 1 - .../f56f59f3c0b057c8ec79a477e4e38bec.svg | 1 - .../2c398b492aadc90eb4e4853fc20b23e9.svg | 1 - .../3125ab785fb039994582552790a2674b.svg | 1 + .../bf0ad4611c47f8548396e40595c02b55.svg | 1 + .../c4858be225d004441b2aefedacda89a3.svg | 1 - ...g => 35299f4eb8e0bed76b68c7beb2038031.svg} | 0 ...g => 8278b9bec92ae49927283396692b51d5.svg} | 0 ...g => 852f0346f025c671b8a1ce6b628028aa.svg} | 0 .../206f539367fa1aaefc230709e4f2068e.svg | 1 + .../266b71339b55ad3a312a9f41e6bcf988.svg | 1 + .../4549b95450db3c73479e8902e4939427.svg | 1 + .../55b45214ba90c96978cdc9cdfee24fef.svg | 1 - .../598739d23cf8dbcdebe033e4c7f1d28a.svg | 1 - .../7a1e792cd3fa6f3482459e154abf2e7d.svg | 1 - ...g => 8349aa18563bb43427ae2383f1e212ae.svg} | 2 +- .../aa17f7e82cf50498f90deb6a21a2489a.svg | 1 + .../baedd4067516584d425b93331b7ce04f.svg | 1 - ...g => da4ebf090f84d9b5d48b0f1e79bb3e7b.svg} | 2 +- .../2e65bc9c934380c2de6a24bcd5c1c7b7.svg | 1 + .../48887d68a861a0acdf8313e23fb19880.svg | 1 + .../6f12fcc00f4106bbc920d7451398d3b2.svg | 1 - .../70262c533569a7da06cc1b950e932d6f.svg | 1 - .../33afd1a141ec444989c393b3e51ec9ca.svg | 1 + .../5863bd013ad6594f63f8dfa51ff4adc0.png | Bin 12462 -> 0 bytes .../58b19accb8a68c665ff5cbed610eea4e.svg | 1 - .../8b15a314beca97071b0ccb22c969355d.svg | 1 - .../b60cdba673c2c9fc84c800f07fd18145.svg | 1 - .../c3d5f3506b763b718e567f90dbb78324.svg | 1 + .../da069c7d6cbdb516c5454371dae84e7f.svg | 1 + .../f1b4e81d22f4c44d4618b0f55a1a88c5.png | Bin 9800 -> 0 bytes .../2249056953a47ab1944bb5a41dcbed8c.svg | 1 + .../ec93d3c42f0ae52a05d0aff9739675e5.svg | 1 - ...g => 0cf0d5f856ec204dc32e0e42691cc70a.svg} | 0 .../74e038deabd9e240606fa3f07ba98269.svg | 1 + ...g => 9fc4ecc087d389dd0111bcba165cd5d0.svg} | 0 .../c4874e1205aabe624e5504abe154eae9.png | Bin 11933 -> 11321 bytes .../e9fc9c715bb55a702db68b2bb6da0a68.svg | 1 - .../2ec04091c55fe31bf85ac28c5b6d95cb.svg | 1 - .../55f079880a77c126c70106e62ff941d9.svg | 1 + ...g => ceac4259d2aed0767c7765d2237ca1a3.svg} | 0 ...g => 3437a38af1218ca206e921e48678c07e.svg} | 0 .../35964d0485747082c0a8bedc0a16822b.svg | 1 + .../c3f06301f5ce610df1217bc633257297.svg | 1 - .../c7f8cdd755d744412476b87230d0400d.svg | 1 + .../e0600b3be5b95f105a1cf2a2c0378b98.svg | 1 - ...g => 021718d3b46893b271f90083ccdceaf8.svg} | 0 ...g => 058a76e3e7d67c03f733e075829a6252.svg} | 0 ...g => 378d0fd8cefa688d530ac38930d66844.svg} | 0 .../131454dcbac04e567f322979f4af80c6.ascii | 5 + .../51a9d0588be822a5c80ea38f7d348641.ascii | 5 + .../5924e162b50272c40c842fad14b8fa48.ascii | 7 + .../634d373310711268cc188f45e5699d8d.ascii | 10 + .../8c6662f605722fb2ff6cd7f65243a126.ascii | 4 + .../8cd992c1ceaae2e67695285beef23a24.ascii | 7 + .../8e7cfee39c98f2ddf9b635a914066cf6.ascii | 7 + .../a0b99054cc82ca1fb147f077e175ef10.ascii | 7 + .../85620f0332fcf16f56c580794fd094c5.ascii | 6 + .../b76753476ad6ecfe4b8f39bcf9432980.ascii | 9 + .../2421f47aa4fe1c0d830d53b2e6563c04.ascii | 7 + .../2514e1aa0565840e33fde0b146e3efe2.ascii | 5 + .../49af474c33ce0ee0733626ea3d988570.ascii | 5 + .../e62558cdfd8abaf22511e8e68c7afb4a.ascii | 5 + .../fff37fa4275e43302f71cf052417a19f.ascii | 24 + .../012a8ab7a4de935c1c8d61dcd14fc62c.ascii | 10 + .../032409c03915a6ba75864e1dceae416d.ascii | 10 + .../389a1ea8c9e92df9a2b38718e34bae7b.ascii | 10 + .../639ca0b74a805c3aebac79b181eac908.ascii | 14 + .../902c290a790b4d44d10236f4a1456cdc.ascii | 10 + .../98ddf6415bd9827a6d899b21d0a5f736.ascii | 10 + .../9ae99b090883023a485be7be098858e9.ascii | 10 + .../a323848e706c473833cda0b02bc220ef.ascii | 14 + .../e653724c11600cbf682f1c809c8c6508.ascii | 12 + .../2f42c862a0a9d0764727d42b16cf68a0.ascii | 11 + .../373248ec6a579bacf6c6a317e6db597a.ascii | 3 + .../065efe85cac2f359ea4d5d4bae94da97.ascii | 5 + .../496c0ee8945080a32bc02f78bc83ad43.ascii | 5 + .../c509dc6fecd7992cb45a0b4d8f1bd001.ascii | 5 + .../3ec466bf6e1aff44b35b8e37cc86cc3e.ascii | 5 + .../6890c4028109e7d30a0b4b89f6fbe292.ascii | 7 + .../80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii | 5 + .../87d587388add62445ec0f3e7d7295094.ascii | 7 + .../a337e3f97387b52d387fc01605314497.ascii | 7 + .../c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii | 7 + .../097aa1948b6cdbf9dc7579643a7af246.ascii | 5 + .../134baa1043d0849f31a1943d6d5bc607.ascii | 5 + .../17d5fbeffcdcceca98cdba537295d258.ascii | 5 + .../4e6e20c823c8cc72e0cc00e4ab5b7556.ascii | 6 + .../8928f757abd1376abdc4069e1aa774f2.ascii | 9 + .../8a66af7570bac674966f6316820ea31b.ascii | 7 + .../d39ca235454ced9681b523be056864d2.ascii | 5 + .../dd303afb51d580fb2bf1b914c010f83d.ascii | 7 + .../ff701138fd7a6e35700a2e1ee3e9c020.ascii | 7 + .../02cecadc92b8ff681edc8edb0ace53ce.ascii | 14 + .../153d99ce571bd664945394a1203a9eba.ascii | 7 + .../171357d936dee742b43b9ffb7600c742.ascii | 5 + .../2368534c6e964e6d4a54904cc99b8986.ascii | 7 + .../2e90e21710bf1bcbbfecbb464d27244a.ascii | 7 + .../3cd7b36839a248eb35f0b678d7bf5508.ascii | 7 + .../4eeb75f5de2d13a39f894625d3222443.ascii | 5 + .../5d7af72e00fb0390af5281d918d77055.ascii | 6 + .../869b60a8e6b992e6f62bc6a50b36deeb.ascii | 7 + .../8f78fdb9ef54b1bc4dbc00f07263cc97.ascii | 5 + .../a7b79877822a8f60e45552dcafc0815d.ascii | 5 + .../bbe9d45ab271549dea5ef54982fcaaa5.ascii | 7 + .../29695045f04fd06c75bfda7845121213.ascii | 5 + .../39330ef5591cf0f3205564ad47255d4f.ascii | 7 + .../39d33ea94e7527ed221a809ca6054174.ascii | 5 + .../4bf2d790d2f50bf7767c948e0b9f9822.ascii | 7 + .../4def87a6683264d420f84562776f4b6c.ascii | 8 + .../668d140df9db486e5ff2d7c127eaa9d4.ascii | 5 + .../79832780f9209be5569447c4d988e54b.ascii | 5 + .../7a44f3eaa167a5022e2281c62e90fff8.ascii | 8 + .../7f74178029422a35267fd033b392fe4c.ascii | 7 + .../9734aff037ac23a73504ff7cc846eab7.ascii | 6 + .../9c921b7b8a8db831f787c1329e29f7cb.ascii | 6 + .../a5bb1312adc5e9e23bee6b47555a6e8f.ascii | 8 + .../af40980136c291814e8970dc2a3d8e63.ascii | 6 + .../08cd4a8bf4557862c095066728e6ed5e.ascii | 4 + .../4e0fa763b173e3a683587acf83733353.ascii | 4 + .../5a7a12213ca36f2f833e638ea0174d4a.ascii | 4 + .../dfd6ded3f0addcf43e0a1581627a2220.ascii | 4 + .../3125ab785fb039994582552790a2674b.ascii | 7 + .../bf0ad4611c47f8548396e40595c02b55.ascii | 6 + .../35299f4eb8e0bed76b68c7beb2038031.ascii | 10 + .../8278b9bec92ae49927283396692b51d5.ascii | 9 + .../852f0346f025c671b8a1ce6b628028aa.ascii | 4 + .../206f539367fa1aaefc230709e4f2068e.ascii | 8 + .../266b71339b55ad3a312a9f41e6bcf988.ascii | 8 + .../4549b95450db3c73479e8902e4939427.ascii | 8 + .../8349aa18563bb43427ae2383f1e212ae.ascii | 8 + .../aa17f7e82cf50498f90deb6a21a2489a.ascii | 8 + .../da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii | 8 + .../2e65bc9c934380c2de6a24bcd5c1c7b7.ascii | 6 + .../48887d68a861a0acdf8313e23fb19880.ascii | 4 + .../33afd1a141ec444989c393b3e51ec9ca.ascii | 16 + .../4d89f0042fc367f1614537c7f05389fb.ascii | 16 + .../afdd2dbe7690ed09ea91df63471b480b.ascii | 9 + .../c3d5f3506b763b718e567f90dbb78324.ascii | 9 + .../da069c7d6cbdb516c5454371dae84e7f.ascii | 7 + .../2249056953a47ab1944bb5a41dcbed8c.ascii | 6 + .../0cf0d5f856ec204dc32e0e42691cc70a.ascii | 6 + .../74e038deabd9e240606fa3f07ba98269.ascii | 9 + .../9fc4ecc087d389dd0111bcba165cd5d0.ascii | 5 + .../55f079880a77c126c70106e62ff941d9.ascii | 9 + .../ceac4259d2aed0767c7765d2237ca1a3.ascii | 5 + .../3437a38af1218ca206e921e48678c07e.ascii | 11 + .../35964d0485747082c0a8bedc0a16822b.ascii | 11 + .../c7f8cdd755d744412476b87230d0400d.ascii | 11 + .../021718d3b46893b271f90083ccdceaf8.ascii | 4 + .../058a76e3e7d67c03f733e075829a6252.ascii | 4 + .../378d0fd8cefa688d530ac38930d66844.ascii | 4 + docs/index.html | 817 ++++++++--------- docs/ja-JP/index.html | 813 ++++++++--------- docs/news/2020-09-18.html | 4 +- docs/news/2020-11-22.html | 4 +- docs/news/index.html | 2 +- docs/news/rss.xml | 6 +- docs/ru-RU/index.html | 849 +++++++++--------- docs/uk-UA/index.html | 817 ++++++++--------- docs/zh-CN/index.html | 817 ++++++++--------- 329 files changed, 3135 insertions(+), 2361 deletions(-) create mode 100644 docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg delete mode 100644 docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg create mode 100644 docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg create mode 100644 docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg create mode 100644 docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg delete mode 100644 docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg create mode 100644 docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg create mode 100644 docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg create mode 100644 docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg create mode 100644 docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg delete mode 100644 docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg delete mode 100644 docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg delete mode 100644 docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg delete mode 100644 docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg delete mode 100644 docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg delete mode 100644 docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg delete mode 100644 docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg create mode 100644 docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg create mode 100644 docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg delete mode 100644 docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg create mode 100644 docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg create mode 100644 docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg create mode 100644 docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg delete mode 100644 docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg delete mode 100644 docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg delete mode 100644 docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg create mode 100644 docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg delete mode 100644 docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg delete mode 100644 docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg create mode 100644 docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg delete mode 100644 docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg create mode 100644 docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg create mode 100644 docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg delete mode 100644 docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg rename docs/images/chapters/catmullconv/{c1f8861583b4176a9b607aa6a05f9356.svg => 389a1ea8c9e92df9a2b38718e34bae7b.svg} (100%) create mode 100644 docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg delete mode 100644 docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg delete mode 100644 docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg create mode 100644 docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg delete mode 100644 docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg create mode 100644 docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg create mode 100644 docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg create mode 100644 docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg delete mode 100644 docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg delete mode 100644 docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg delete mode 100644 docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg create mode 100644 docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg create mode 100644 docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg create mode 100644 docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg delete mode 100644 docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg delete mode 100644 docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg create mode 100644 docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg delete mode 100644 docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg delete mode 100644 docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg create mode 100644 docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg delete mode 100644 docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg create mode 100644 docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg delete mode 100644 docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png delete mode 100644 docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg rename docs/images/chapters/control/{9df7dc66b51db8e3046e1f359874c38e.svg => 80cdfeab6ed6038f0e550ef5c1dcb7dd.svg} (100%) create mode 100644 docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg delete mode 100644 docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg delete mode 100644 docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png create mode 100644 docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg delete mode 100644 docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png delete mode 100644 docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg rename docs/images/chapters/curvefitting/{940455f4016ab1be6d46c6f176fd2f76.svg => 097aa1948b6cdbf9dc7579643a7af246.svg} (100%) create mode 100644 docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg create mode 100644 docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg delete mode 100644 docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg delete mode 100644 docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg create mode 100644 docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg delete mode 100644 docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg rename docs/images/chapters/curvefitting/{7c6b50cee5dc685515943a199d7a65fc.svg => 8928f757abd1376abdc4069e1aa774f2.svg} (63%) create mode 100644 docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg delete mode 100644 docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg delete mode 100644 docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg rename docs/images/chapters/curvefitting/{464dbfb5adb6233108053dfac6fa4fe5.svg => d39ca235454ced9681b523be056864d2.svg} (100%) create mode 100644 docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg create mode 100644 docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg delete mode 100644 docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png delete mode 100644 docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png rename docs/images/chapters/derivatives/{897cfd8648720dc21463a9358cc65ab4.svg => 02cecadc92b8ff681edc8edb0ace53ce.svg} (100%) create mode 100644 docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg create mode 100644 docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg create mode 100644 docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg delete mode 100644 docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg create mode 100644 docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg rename docs/images/chapters/derivatives/{50616f9c922967c0c9c179af9b091947.svg => 4eeb75f5de2d13a39f894625d3222443.svg} (59%) delete mode 100644 docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg rename docs/images/chapters/derivatives/{a7c61e0e8b42010df6dab641c92ef13d.svg => 5d7af72e00fb0390af5281d918d77055.svg} (100%) delete mode 100644 docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg create mode 100644 docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg rename docs/images/chapters/derivatives/{67ca2710769505572e097ffb40de099f.svg => 8f78fdb9ef54b1bc4dbc00f07263cc97.svg} (100%) rename docs/images/chapters/derivatives/{f67d2d379ba6dfaa7f7686a7d1eae367.svg => a7b79877822a8f60e45552dcafc0815d.svg} (100%) delete mode 100644 docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg delete mode 100644 docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg delete mode 100644 docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg delete mode 100644 docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg rename docs/images/chapters/explanation/{b5977078d36d847fb299cbe3e7e2c3ba.svg => 29695045f04fd06c75bfda7845121213.svg} (100%) delete mode 100644 docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg create mode 100644 docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg create mode 100644 docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg create mode 100644 docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg create mode 100644 docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg create mode 100644 docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg delete mode 100644 docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg delete mode 100644 docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg create mode 100644 docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg create mode 100644 docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg delete mode 100644 docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg delete mode 100644 docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg create mode 100644 docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg create mode 100644 docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg create mode 100644 docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg delete mode 100644 docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg create mode 100644 docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg delete mode 100644 docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg delete mode 100644 docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg delete mode 100644 docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg rename docs/images/chapters/extended/{fd520a6e2c7f39e90496e5cf494cce2e.svg => 08cd4a8bf4557862c095066728e6ed5e.svg} (100%) create mode 100644 docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg rename docs/images/chapters/extended/{b0eb0b24e7fa29c545ab1479d2df0554.svg => 5a7a12213ca36f2f833e638ea0174d4a.svg} (100%) create mode 100644 docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg delete mode 100644 docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg delete mode 100644 docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg delete mode 100644 docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg create mode 100644 docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg create mode 100644 docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg delete mode 100644 docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg rename docs/images/chapters/inflections/{f9f2258e59b038659087a5e87ba2e0af.svg => 35299f4eb8e0bed76b68c7beb2038031.svg} (100%) rename docs/images/chapters/inflections/{be9e409d619ecd735b0fbc219bec6d07.svg => 8278b9bec92ae49927283396692b51d5.svg} (100%) rename docs/images/chapters/inflections/{a283e01df17f3d763ec89621f2af6c5c.svg => 852f0346f025c671b8a1ce6b628028aa.svg} (100%) create mode 100644 docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg create mode 100644 docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg create mode 100644 docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg delete mode 100644 docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg delete mode 100644 docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg delete mode 100644 docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg rename docs/images/chapters/matrixsplit/{63d1337d275abf7b296d500b9b5821fd.svg => 8349aa18563bb43427ae2383f1e212ae.svg} (62%) create mode 100644 docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg delete mode 100644 docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg rename docs/images/chapters/matrixsplit/{d9d04b9b6c66788d18832a383d6f7ea0.svg => da4ebf090f84d9b5d48b0f1e79bb3e7b.svg} (52%) create mode 100644 docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg create mode 100644 docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg delete mode 100644 docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg delete mode 100644 docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg create mode 100644 docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg delete mode 100644 docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png delete mode 100644 docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg delete mode 100644 docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg delete mode 100644 docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg create mode 100644 docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg create mode 100644 docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg delete mode 100644 docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png create mode 100644 docs/images/chapters/polybezier/2249056953a47ab1944bb5a41dcbed8c.svg delete mode 100644 docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg rename docs/images/chapters/reordering/{56130afc4cb313e0e74cf670d34590f6.svg => 0cf0d5f856ec204dc32e0e42691cc70a.svg} (100%) create mode 100644 docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg rename docs/images/chapters/reordering/{8090b63b005bf3edb916b97bda317a0e.svg => 9fc4ecc087d389dd0111bcba165cd5d0.svg} (100%) delete mode 100644 docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg delete mode 100644 docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg create mode 100644 docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg rename docs/images/chapters/weightcontrol/{85d526fb17f9e859dcd7d40d22192e37.svg => ceac4259d2aed0767c7765d2237ca1a3.svg} (100%) rename docs/images/chapters/whatis/{06bbc5c11ad3fd88ff93eb2c06177b66.svg => 3437a38af1218ca206e921e48678c07e.svg} (100%) create mode 100644 docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg delete mode 100644 docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg create mode 100644 docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg delete mode 100644 docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg rename docs/images/chapters/yforx/{4d23ee228c5b1cbc40e380496c2184d1.svg => 021718d3b46893b271f90083ccdceaf8.svg} (100%) rename docs/images/chapters/yforx/{699459d89ca6622c90c1e42e4aa03f32.svg => 058a76e3e7d67c03f733e075829a6252.svg} (100%) rename docs/images/chapters/yforx/{316e7fae61e10014000d770209779ab6.svg => 378d0fd8cefa688d530ac38930d66844.svg} (100%) create mode 100644 docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii create mode 100644 docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii create mode 100644 docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii create mode 100644 docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii create mode 100644 docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii create mode 100644 docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii create mode 100644 docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii create mode 100644 docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii create mode 100644 docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii create mode 100644 docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii create mode 100644 docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii create mode 100644 docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii create mode 100644 docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii create mode 100644 docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii create mode 100644 docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii create mode 100644 docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii create mode 100644 docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii create mode 100644 docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii create mode 100644 docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii create mode 100644 docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii create mode 100644 docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii create mode 100644 docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii create mode 100644 docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii create mode 100644 docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii create mode 100644 docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii create mode 100644 docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii create mode 100644 docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii create mode 100644 docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii create mode 100644 docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii create mode 100644 docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii create mode 100644 docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii create mode 100644 docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii create mode 100644 docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii create mode 100644 docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii create mode 100644 docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii create mode 100644 docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii create mode 100644 docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii create mode 100644 docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii create mode 100644 docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii create mode 100644 docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii create mode 100644 docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii create mode 100644 docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii create mode 100644 docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii create mode 100644 docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii create mode 100644 docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii create mode 100644 docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii create mode 100644 docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii create mode 100644 docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii create mode 100644 docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii create mode 100644 docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii create mode 100644 docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii create mode 100644 docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii create mode 100644 docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii create mode 100644 docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii create mode 100644 docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii create mode 100644 docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii create mode 100644 docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii create mode 100644 docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii create mode 100644 docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii create mode 100644 docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii create mode 100644 docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii create mode 100644 docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii create mode 100644 docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii create mode 100644 docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii create mode 100644 docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii create mode 100644 docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii create mode 100644 docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii create mode 100644 docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii create mode 100644 docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii create mode 100644 docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii create mode 100644 docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii create mode 100644 docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii create mode 100644 docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii create mode 100644 docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii create mode 100644 docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii create mode 100644 docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii create mode 100644 docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii create mode 100644 docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii create mode 100644 docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii create mode 100644 docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii create mode 100644 docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii create mode 100644 docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii create mode 100644 docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii create mode 100644 docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii create mode 100644 docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii create mode 100644 docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii create mode 100644 docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii create mode 100644 docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii create mode 100644 docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii create mode 100644 docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii create mode 100644 docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii create mode 100644 docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii create mode 100644 docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii create mode 100644 docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii create mode 100644 docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii create mode 100644 docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii create mode 100644 docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii create mode 100644 docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii create mode 100644 docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii create mode 100644 docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii create mode 100644 docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii create mode 100644 docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii create mode 100644 docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii diff --git a/docs/chapters/abc/content.en-GB.md b/docs/chapters/abc/content.en-GB.md index 3a7e7912..5dcb5397 100644 --- a/docs/chapters/abc/content.en-GB.md +++ b/docs/chapters/abc/content.en-GB.md @@ -32,19 +32,19 @@ These three values A, B, and C allow us to derive an important identity formula So, how can we compute `C`? We start with our observation that `C` always lies somewhere between the start and end points, so logically `C` will have a function that interpolates between those two coordinates: \[ - C = u(t) \cdot P_{start} + (1-u(t)) \cdot P_{end} + C = u(t) \cdot P_{\textit{start}} + (1-u(t)) \cdot P_{\textit{end}} \] If we can figure out what the function `u(t)` looks like, we'll be done. Although we do need to remember that this `u(t)` will have a different form depending on whether we're working with quadratic or cubic curves. [Running through the maths](https://mathoverflow.net/questions/122257/finding-the-formula-for-bezier-curve-ratios-hull-point-point-baseline) (with thanks to Boris Zbarsky) shows us the following two formulae: \[ - u(t)_{quadratic} = \frac{(1-t)^2}{t^2 + (1-t)^2} + u(t)_{\textit{quadratic}} = \frac{(1-t)^2}{t^2 + (1-t)^2} \] And \[ - u(t)_{cubic} = \frac{(1-t)^3}{t^3 + (1-t)^3} + u(t)_{\textit{cubic}} = \frac{(1-t)^3}{t^3 + (1-t)^3} \] So, if we know the start and end coordinates and the *t* value, we know C without having to calculate the `A` or even `B` coordinates. In fact, we can do the same for the ratio function. As another function of `t`, we technically don't need to know what `A` or `B` or `C` are. It, too, can be expressed as a pure function of `t`. @@ -52,25 +52,25 @@ So, if we know the start and end coordinates and the *t* value, we know C withou We start by observing that, given `A`, `B`, and `C`, the following always holds: \[ - ratio(t) = \frac{distance(B,C)}{distance(A,B)} = Constant + \textit{ratio}(t) = \frac{\textit{distance}(B,C)}{\textit{distance}(A,B)} = \textit{Constant} \] Working out the maths for this, we see the following two formulae for quadratic and cubic curves: \[ - ratio(t)_{quadratic} = \left | \frac{t^2 + (1-t)^2 - 1}{t^2 + (1-t)^2} \right | + ratio(t)_{\textit{quadratic}} = \left | \frac{t^2 + (1-t)^2 - 1}{t^2 + (1-t)^2} \right | \] And \[ - ratio(t)_{cubic} = \left | \frac{t^3 + (1-t)^3 - 1}{t^3 + (1-t)^3} \right | + ratio(t)_{\textit{cubic}} = \left | \frac{t^3 + (1-t)^3 - 1}{t^3 + (1-t)^3} \right | \] Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a `t` value, we can _construct_ curves. We can compute `C` using the start and end points and our `u(t)` function, and once we have `C`, we can use our on-curve point (`B`) and the `ratio(t)` function to find `A`: \[ - A = B - \frac{C - B}{ratio(t)} = B + \frac{B - C}{ratio(t)} + A = B - \frac{C - B}{\textit{ratio}(t)} = B + \frac{B - C}{\textit{ratio}(t)} \] With `A` found, finding `e1` and `e2` for quadratic curves is a matter of running the linear interpolation with `t` between start and `A` to yield `e1`, and between `A` and end to yield `e2`. For cubic curves, there is no single pair of points that can act as `e1` and `e2`: as long as the distance ratio between `e1` to `B` and `B` to `e2` is the Bézier ratio `(1-t):t`, we can reverse engineer `v1` and `v2`: @@ -86,8 +86,8 @@ And then reverse engineer the curve's control points: \[ \left \{ \begin{aligned} - C_1' &= start + \frac{v_1 - start}{t} \\ - C_2' &= end + \frac{v_2 - end}{1 - t} + C_1' &= \textit{start} + \frac{v_1 - \textit{start}}{t} \\ + C_2' &= \textit{end} + \frac{v_2 - \textit{end}}{1 - t} \end{aligned} \right . \] diff --git a/docs/chapters/arclength/content.en-GB.md b/docs/chapters/arclength/content.en-GB.md index 37a67ee9..7578abff 100644 --- a/docs/chapters/arclength/content.en-GB.md +++ b/docs/chapters/arclength/content.en-GB.md @@ -9,7 +9,7 @@ How long is a Bézier curve? As it turns out, that's not actually an easy questi or, more commonly written using Leibnitz notation as: \[ - length = \int_{0}^{z}\sqrt{ \left (dx/dt \right )^2+\left (dy/dt \right )^2} dt + \textit{length} = \int_{0}^{z}\sqrt{ \left (dx/dt \right )^2+\left (dy/dt \right )^2} dt \] This formula says that the length of a parametric curve is in fact equal to the **area** underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, it's far from simple... cutting straight to after the chase is over: for quadratic curves, this formula generates an [unwieldy computation](https://www.wolframalpha.com/input/?i=antiderivative+for+sqrt((2*(1-t)*t*B+%2B+t%5E2*C)%27%5E2+%2B+(2*(1-t)*t*E)%27%5E2)&incParTime=true), and we're simply not going to implement things that way. For cubic Bézier curves, things get even more fun, because there is no "closed form" solution, meaning that due to the way calculus works, there is no generic formula that allows you to calculate the arc length. Let me just repeat this, because it's fairly crucial: ***for cubic and higher Bézier curves, there is no way to solve this function if you want to use it "for all possible coordinates"***. @@ -24,12 +24,12 @@ So we turn to numerical approaches again. The method we'll look at here is the [ \int_{-1}^{1}f(t) dt \simeq \left [ - \underset{strip~1}{ \underbrace{ C_1 \cdot f\left(t_1\right) }} + \underset{\textit{strip 1}}{ \underbrace{ C_1 \cdot f\left(t_1\right) }} ~+~... - ~+~\underset{strip~n}{ \underbrace{ C_n \cdot f\left(t_n\right) }} + ~+~\underset{\textit{strip n}}{ \underbrace{ C_n \cdot f\left(t_n\right) }} \right ] = - \underset{strips~1~through~n}{ + \underset{\textit{strips 1 through n}}{ \underbrace{ \sum_{i=1}^{n}{ C_i \cdot f\left(t_i\right) diff --git a/docs/chapters/bsplined/content.en-GB.md b/docs/chapters/bsplined/content.en-GB.md index db104be2..a06bba67 100644 --- a/docs/chapters/bsplined/content.en-GB.md +++ b/docs/chapters/bsplined/content.en-GB.md @@ -16,7 +16,7 @@ Thankfully, much like as was the case for Bézier curves, the derivative of a B- where \[ - P_i \prime = \frac{d}{knot_{i+d+1} - knot_{i+1}} (P_{i+1} - P_i) + P_i \prime = \frac{d}{\textit{knot}_{i+d+1} - \textit{knot}_{i+1}} (P_{i+1} - P_i) \] @@ -28,7 +28,7 @@ As a concrete example, let's look at cubic (=degree 3) B-Spline with five coordi \begin{array}{l} d = 3, \\ P = {(50,240), (185,30), (320,135), (455,25), (560,255)}, \\ - knots = {0,1,2,3,4,5,6,7,8} + \textit{knots} = {0,1,2,3,4,5,6,7,8} \end{array} \] @@ -38,20 +38,20 @@ Applying the above knowledge, we end up with a new B-Spline of degree d-1quite done, because Catmull-Rom curves have that "te With the mapping matrix properly done, let's rewrite the "point + tangent" Catmull-Rom matrix form to a matrix form in terms of four coordinates, and see what we end up with: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -199,7 +199,7 @@ With the mapping matrix properly done, let's rewrite the "point + tangent" Catmu Replace point/tangent vector with the expression for all-coordinates: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -227,7 +227,7 @@ Replace point/tangent vector with the expression for all-coordinates: and merge the matrices: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -248,7 +248,7 @@ and merge the matrices: This looks a lot like the Bézier matrix form, which as we saw in the chapter on Bézier curves, should look like this: \[ - Bézier(t) + \textit{Bézier}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -422,7 +422,7 @@ We now have the final piece of our function puzzle. Let's run through each step. 1. Start with the Catmull-Rom function: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -569,14 +569,14 @@ If we have a Catmull-Rom curve defined by four coordinates P1 through P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \Rightarrow \begin{bmatrix} P_2 \\ P_2 + \frac{P_3-P_1}{6 \cdot τ} \\ P_3 - \frac{P_4-P_2}{6 \cdot τ} \\ P_3 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \] Similarly, if we have a Bézier curve defined by four coordinates P1 through P4, we can draw that using a standard tension Catmull-Rom curve with the following coordinate values: @@ -587,14 +587,14 @@ Similarly, if we have a Bézier curve defined by four coordinates P1 P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \Rightarrow \begin{bmatrix} P_1 \\ P_4 \\ P_4 + 3(P_1 - P_2) \\ P_1 + 3(P_4 - P_3) - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \] Or, if your API allows you to specify Catmull-Rom curves using plain coordinates: @@ -605,12 +605,12 @@ Or, if your API allows you to specify Catmull-Rom curves using plain coordinates P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \Rightarrow \begin{bmatrix} P_4 + 6(P_1 - P_2) \\ P_1 \\ P_4 \\ P_1 + 6(P_4 - P_3) - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \] diff --git a/docs/chapters/circleintersection/content.en-GB.md b/docs/chapters/circleintersection/content.en-GB.md index e3ac3efc..fbf39d56 100644 --- a/docs/chapters/circleintersection/content.en-GB.md +++ b/docs/chapters/circleintersection/content.en-GB.md @@ -5,14 +5,14 @@ It might seem odd to cover this subject so much later than the line/line, line/c First, we observe that "finding intersections" in this case means that, given a circle defined by a center point `c = (x,y)` and a radius `r`, we want to find all points on the Bezier curve for which the distance to the circle's center point is equal to the circle radius, which by definition means those points lie on the circle, and so count as intersections. In maths, that means we're trying to solve: \[ - dist(B(t), c) = r + \textit{dist}(B(t), c) = r \] Which seems simple enough. Unfortunately, when we expand that `dist` function, things get a lot more problematic: \[ \begin{aligned} - r &= dist(B(t), c) \\ + r &= \textit{dist}(B(t), c) \\ &= \sqrt{ \left ( B_x{t} - c_x \right )^2 + \left ( B_y{t} - c_y \right )^2} \\ &= \sqrt{ \left ( x_1 (1-t)^3 + 3 x_2 (1-t)^2 t + 2 x_3 (1-t) t^2 + x_4 t^3 - c_x diff --git a/docs/chapters/circles_cubic/content.en-GB.md b/docs/chapters/circles_cubic/content.en-GB.md index e3f18b0f..1ad02e4f 100644 --- a/docs/chapters/circles_cubic/content.en-GB.md +++ b/docs/chapters/circles_cubic/content.en-GB.md @@ -68,7 +68,7 @@ If we look at the triangle that is formed between our starting point, or initial The distance from our guessed point to the start point is exactly the same as the projection distance we looked at earlier. Using t=0.5 as our point "B" in the "A,B,C" projection, then we know the length of the line segment {C,A}, since it's d1 = {A,B} + d2 = {B,C}: \[ - ||{A,C}|| = d_2 + d_1 = d_2 + d_2 \cdot ratio_3 \left(\frac{1}{2}\right) = d_2 + \frac{1}{3}d_2 = \frac{4}{3}d_2 + ||{A,C}|| = d_2 + d_1 = d_2 + d_2 \cdot \textit{ratio}_3 \left(\frac{1}{2}\right) = d_2 + \frac{1}{3}d_2 = \frac{4}{3}d_2 \] So that just leaves us to find the distance from t=0.5 to the baseline for an arbitrary angle φ, which is the distance from the centre of the circle to our t=0.5 point, minus the distance from the centre to the line that runs from start point to end point. The first is the same as the point P we found for the quadratic curve: @@ -146,7 +146,7 @@ So, to recap, given an angle φ, the new control coordinates are: C_1 = \left [ \begin{matrix} 1 \\ f - \end{matrix} \right ],~with~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) + \end{matrix} \right ]~,~\textit{with}~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) \] and @@ -155,7 +155,7 @@ and C_2 = \left [ \begin{matrix} cos(φ) + f \cdot sin(φ) \\ sin(φ) - f \cdot cos(φ) - \end{matrix} \right ],~with~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) + \end{matrix} \right ]~,~\textit{with}~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) \] And, because the "quarter curve" special case comes up so incredibly often, let's look at what these new control points mean for the curve coordinates of a quarter curve, by simply filling in φ = π/2: diff --git a/docs/chapters/control/content.en-GB.md b/docs/chapters/control/content.en-GB.md index 88f23919..606940f6 100644 --- a/docs/chapters/control/content.en-GB.md +++ b/docs/chapters/control/content.en-GB.md @@ -22,11 +22,11 @@ If we want to change the curve, we need to change the weights of each point, eff \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{weight}{\underbrace{w_i}} + \underset{\textit{weight}}{\underbrace{w_i}} \] That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between is a controlling coordinate. Say we want a cubic curve that starts at (110,150), is controlled by (25,190) and (210,250) and ends at (210,30), we use this Bézier curve: diff --git a/docs/chapters/control/content.ja-JP.md b/docs/chapters/control/content.ja-JP.md index 232059f7..d5ca0988 100644 --- a/docs/chapters/control/content.ja-JP.md +++ b/docs/chapters/control/content.ja-JP.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{二項係数部分の項}{\underbrace{\binom{n}{i}}} + \underset{\textit{二項係数部分の項}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{多項式部分の項}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{多項式部分の項}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{重み}{\underbrace{w_i}} + \underset{\textit{重み}}{\underbrace{w_i}} \] 複雑そうに見えますが、運がいいことに「重み」というのは実はただの座標値です。というのはn次の曲線の場合、w0が始点の座標、wnが終点の座標となり、その間はどれも制御点の座標になります。例えば、始点が(120,160)、制御点が(35,200)と(220,260)、終点が(220,40)となる3次ベジエ曲線は、次のようになります。 diff --git a/docs/chapters/control/content.ru-RU.md b/docs/chapters/control/content.ru-RU.md index 7f7bbd81..0f8b1722 100644 --- a/docs/chapters/control/content.ru-RU.md +++ b/docs/chapters/control/content.ru-RU.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{вес}{\underbrace{w_i}} + \underset{\textit{вес}}{\underbrace{w_i}} \] Хоть и выглядит заморочено, но, так уж получается, в реальности "веса" просто значения координат на графике, к которым мы бы хотели, чтобы наша функция стремилась. Так, для кривой n-го порядка, w0 есть начальной координатой, wn конечной координатой, а все между ними — контрольными координатами. Например, чтобы кубическая кривая начиналась в (110,150), стремилась к точкам (25,190) и (210,250) заканчиваясь на (210,30), мы запишем это следующим образом: diff --git a/docs/chapters/control/content.zh-CN.md b/docs/chapters/control/content.zh-CN.md index 3702d357..2df39425 100644 --- a/docs/chapters/control/content.zh-CN.md +++ b/docs/chapters/control/content.zh-CN.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{weight}{\underbrace{w_i}} + \underset{\textit{weight}}{\underbrace{w_i}} \] 看起来很复杂,但实际上“权重”只是我们想让曲线所拥有的坐标值:对于一条nth阶曲线,w0是起始坐标,wn是终点坐标,中间的所有点都是控制点坐标。假设说一条曲线的起点为(110,150),终点为(210,30),并受点(25,190)和点(210,250)的控制,贝塞尔曲线方程就为: diff --git a/docs/chapters/curvefitting/content.en-GB.md b/docs/chapters/curvefitting/content.en-GB.md index b7178380..1c947d1d 100644 --- a/docs/chapters/curvefitting/content.en-GB.md +++ b/docs/chapters/curvefitting/content.en-GB.md @@ -20,7 +20,7 @@ Rewriting Bézier functions to matrix form is fairly easy, if you first expand t \[ \begin{aligned} - B_{quadratic} & = a (1-t)^2 + 2 b (1-t) t + c t^2 \\ + B_{\textit{quadratic}} & = a (1-t)^2 + 2 b (1-t) t + c t^2 \\ & = a - 2at + at^2 + 2bt - 2bt^2 + ct^2 \end{aligned} \] @@ -29,7 +29,7 @@ And then we (trivially) rearrange the terms across multiple lines: \[ \begin{aligned} - B_{quadratic} &=& a & & \\ + B_{\textit{quadratic}} &=& a & & \\ & & - 2at & + 2bt & \\ & & + at^2 & - 2bt^2 & + ct^2 \end{aligned} @@ -41,7 +41,7 @@ With that arrangement, we can easily decompose this as a matrix multiplication: \[ \begin{aligned} - B_{quadratic} &= T \cdot M \cdot C + B_{\textit{quadratic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 \end{bmatrix} \cdot @@ -67,7 +67,7 @@ We can do the same for the cubic curve, of course. We know the base function for \[ \begin{aligned} - B_{cubic} & = & a(1-t)^3 + 3b(1-t)^2 t + 3c(1-t)t^2 + dt^3 + B_{\textit{cubic}} & = & a(1-t)^3 + 3b(1-t)^2 t + 3c(1-t)t^2 + dt^3 \end{aligned} \] @@ -75,7 +75,7 @@ So we write out the expansion and rearrange: \[ \begin{aligned} - B_{cubic} & = & a & & & \\ + B_{\textit{cubic}} & = & a & & & \\ & & - 3at & + 3bt & & \\ & & + 3at^2 & - 6bt^2 & +3ct^2 & \\ & & - at^3 & + 3bt^3 & -3ct^3 & + dt^3 @@ -86,7 +86,7 @@ Which we can then decompose: \[ \begin{aligned} - B_{cubic} &= T \cdot M \cdot C = + B_{\textit{cubic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 & t^3 \end{bmatrix} \cdot \begin{bmatrix} @@ -104,7 +104,7 @@ And, of course, we can do this for quartic curves too (skipping the expansion st \[ \begin{aligned} - B_{quartic} &= T \cdot M \cdot C = + B_{\textit{quartic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 & t^3 & t^4 \end{bmatrix} \cdot \begin{bmatrix} @@ -170,13 +170,13 @@ And now we can move on to the actual "curve fitting" part: what we want is a fun As mentioned before, this function is really just "the distance between the actual coordinate, and the coordinate that the curve evaluates to for the associated `t` value", which we'll square to get rid of any pesky negative signs: \[ - E(C)_i = \left ( p_i - Bézier(s_i) \right )^2 + E(C)_i = \left ( p_i - \textit{Bézier}(s_i) \right )^2 \] Since this function only deals with individual coordinates, we'll need to sum over all coordinates in order to get the full error function. So, we literally just do that; the total error function is simply the sum of all these individual errors: \[ - E(C) = \sum^n_{i=1} \left ( p_i - Bézier(s_i) \right )^2 + E(C) = \sum^n_{i=1} \left ( p_i - \textit{Bézier}(s_i) \right )^2 \] And here's the trick that justifies using matrices: while we can work with individual values using calculus, with matrices we can compute as many values as we make our matrices big, all at the "same time", We can replace the individual terms pi with the full **P** coordinate matrix, and we can replace Bézier(si) with the matrix representation **T x M x C** we talked about before, which gives us: diff --git a/docs/chapters/derivatives/content.en-GB.md b/docs/chapters/derivatives/content.en-GB.md index d51bb3ef..98416f07 100644 --- a/docs/chapters/derivatives/content.en-GB.md +++ b/docs/chapters/derivatives/content.en-GB.md @@ -5,13 +5,13 @@ There's a number of useful things that you can do with Bézier curves based on t First, let's look at the derivative rule for Bézier curves, which is: \[ - Bézier'(n,t) = n \cdot \sum_{i=0}^{n-1} (b_{i+1}-b_i) \cdot Bézier(n-1,t)_i + \textit{Bézier}'(n,t) = n \cdot \sum_{i=0}^{n-1} (b_{i+1}-b_i) \cdot \textit{Bézier}(n-1,t)_i \] which we can also write (observing that b in this formula is the same as our w weights, and that n times a summation is the same as a summation where each term is multiplied by n) as: \[ - Bézier'(n,t) = \sum_{i=0}^{n-1} Bézier(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) + \textit{Bézier}'(n,t) = \sum_{i=0}^{n-1} \textit{Bézier}(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) \] Or, in plain text: the derivative of an nth degree Bézier curve is an (n-1)th degree Bézier curve, with one fewer term, and new weights w'0...w'n-1 derived from the original weights as n(wi+1 - wi). So for a 3rd degree curve, with four weights, the derivative has three new weights: w'0 = 3(w1-w0), w'1 = 3(w2-w1) and w'2 = 3(w3-w2). @@ -75,8 +75,8 @@ And that's the first part done: the two components inside the parentheses are ac Now to apply this to our weighted Bézier curves. We'll write out the plain curve formula that we saw earlier, and then work our way through to its derivative: \[\begin{array}{lcl} - Bézier_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ - Bézier_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ + \textit{Bézier}_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ + \textit{Bézier}_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ & & n \cdot (B_{n-1,0}(t) - B_{n-1,1}(t)) \cdot w_1 + \\ & & n \cdot (B_{n-1,1}(t) - B_{n-1,2}(t)) \cdot w_2 + \\ & & n \cdot (B_{n-1,2}(t) - B_{n-1,3}(t)) \cdot w_3 + \\ @@ -106,7 +106,7 @@ Two of these terms fall way: the first term falls away because there is no -1b в этой формуле, то-же что наш w "вес", а n умноженная на функцию сумы — то-же что функция сумы, с каждой составляющей умноженной на n) как: \[ - Bézier'(n,t) = \sum_{i=0}^{n-1} Bézier(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) + \textit{Bézier}'(n,t) = \sum_{i=0}^{n-1} \textit{Bézier}(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) \] Другими словами, производная кривой Безье nго порядка равна кривой Безье на порядок ниже (n-1), соответственно имея на один термин составляющих меньше, где новые веса w'0...w'n-1 произведены из оригинальных по принципу n(wi+1 - wi). Так, для кривой 3го порядка, с 4мя весами, производная имеет 3 веса: w'0 = 3(w1-w0), w'1 = 3(w2-w1) и w'2 = 3(w3-w2). @@ -75,8 +75,8 @@ Теперь применим это к записям наших формул с "весами". Начнем с формулы кривой Безье приведенной выше и пройдемся по ее производным. \[\begin{array}{lcl} - Bézier_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ - Bézier_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ + \textit{Bézier}_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ + \textit{Bézier}_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ & & n \cdot (B_{n-1,0}(t) - B_{n-1,1}(t)) \cdot w_1 + \\ & & n \cdot (B_{n-1,1}(t) - B_{n-1,2}(t)) \cdot w_2 + \\ & & n \cdot (B_{n-1,2}(t) - B_{n-1,3}(t)) \cdot w_3 + \\ @@ -106,7 +106,7 @@ И это по сути формула функции сумы на 1 порядок ниже: \[ - Bézier_{n,k}(t) \frac{d}{dt} = n \cdot B_{(n-1),BLUE[0]}(t) \cdot (w_1 - w_0) + \textit{Bézier}_{n,k}(t) \frac{d}{dt} = n \cdot B_{(n-1),BLUE[0]}(t) \cdot (w_1 - w_0) + n \cdot B_{(n-1),RED[1]}(t) \cdot (w_2 - w_1) + n \cdot B_{(n-1),MAGENTA[2]}(t) \cdot (w_3 - w_2) ~+ ~... @@ -116,8 +116,8 @@ \[ - Bézier_{n,k}(t) \frac{d}{dt} = \sum_{k=0}^{n-1} n \cdot B_{n-1,k}(t) \cdot (w_{k+1} - w_k) - = \sum_{k=0}^{n-1} B_{n-1,k}(t) \cdot \underset{вес~производной} + \textit{Bézier}_{n,k}(t) \frac{d}{dt} = \sum_{k=0}^{n-1} n \cdot B_{n-1,k}(t) \cdot (w_{k+1} - w_k) + = \sum_{k=0}^{n-1} B_{n-1,k}(t) \cdot \underset{\textit{вес производной}} {\underbrace{n \cdot (w_{k+1} - w_k)}} \] @@ -126,22 +126,22 @@ Давайте перепишем это по форме схожей с нашей исходной формулой, чтобы легче было разглядеть разницу. Сначала оригинальная формула, за ней производная: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{вес}{\underbrace{w_i}} + \underset{\textit{вес}}{\underbrace{w_i}} \] \[ - Bézier'(n,t) = \sum_{i=0}^{k} - \underset{биноминальный~термин}{\underbrace{\binom{k}{i}}} + \textit{Bézier}'(n,t) = \sum_{i=0}^{k} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{k}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} \cdot\ - \underset{вес~производной}{\underbrace{n \cdot (w_{i+1} - w_i)}} - {~, ~with ~k=n-1} + \underset{\textit{вес производной}}{\underbrace{n \cdot (w_{i+1} - w_i)}} + ~,~ \textit{with } k=n-1 \] И в чем же разница? В терминах формулы кривой Безье, по сути, никакой! Мы уменьшили порядок (вместо порядка n, он теперь n-1), но это все та же функция Безье. Единственное отличие в подсчете изменений в "весах" при нахождении производной. К примеру, исходя из 4-х контрольных точек A, B, C и D, первая производная получит 3 точки, вторая — 2, третья — 1: diff --git a/docs/chapters/explanation/content.en-GB.md b/docs/chapters/explanation/content.en-GB.md index acfe27fb..26229e05 100644 --- a/docs/chapters/explanation/content.en-GB.md +++ b/docs/chapters/explanation/content.en-GB.md @@ -59,9 +59,9 @@ Bézier curves are polynomials of t, rather than x, with the value \[ \begin{aligned} - linear &= (1-t) + t \\ - square &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - cubic &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{linear} &= (1-t) + t \\ + \textit{square} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{cubic} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -69,10 +69,10 @@ I know what you're thinking: that doesn't look too simple! But if we remove t \[ \begin{aligned} - linear &= \hspace{2.5em} 1 + 1 \\ - square &= \hspace{1.7em} 1 + 2 + 1\\ - cubic &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - quartic &= 1 + 4 + 6 + 4 + 1 + \textit{linear} &= \hspace{2.5em} 1 + 1 \\ + \textit{square} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{cubic} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{quartic} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -82,19 +82,19 @@ There's an equally simple way to figure out how the polynomial terms work: if we \[ \begin{aligned} - linear &= BLUE[a] + RED[b] \\ - square &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - cubic &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{linear} &= BLUE[a] + RED[b] \\ + \textit{square} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{cubic} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] It's basically just a sum of "every combination of a and b", progressively replacing a's with b's after every + sign. So that's actually pretty simple too. So now you know binomial polynomials, and just for completeness I'm going to show you the generic function for this: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] And that's the full description for Bézier curves. Σ in this function indicates that this is a series of additions (using the variable listed below the Σ, starting at ...=<value> and ending at the value listed on top of the Σ). diff --git a/docs/chapters/explanation/content.ja-JP.md b/docs/chapters/explanation/content.ja-JP.md index a0c299ea..fb0037e0 100644 --- a/docs/chapters/explanation/content.ja-JP.md +++ b/docs/chapters/explanation/content.ja-JP.md @@ -57,9 +57,9 @@ \[ \begin{aligned} - 1次 &= (1-t) + t \\ - 2次 &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - 3次 &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{1次} &= (1-t) + t \\ + \textit{2次} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{3次} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -67,10 +67,10 @@ \[ \begin{aligned} - 1次 &= \hspace{2.5em} 1 + 1 \\ - 2次 &= \hspace{1.7em} 1 + 2 + 1\\ - 3次 &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - 4次 &= 1 + 4 + 6 + 4 + 1 + \textit{1次} &= \hspace{2.5em} 1 + 1 \\ + \textit{2次} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{3次} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{4次} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -80,19 +80,19 @@ \[ \begin{aligned} - 1次 &= BLUE[a] + RED[b] \\ - 2次 &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - 3次 &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{1次} &= BLUE[a] + RED[b] \\ + \textit{2次} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{3次} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] これは要するに、「abのすべての組み合わせ」の単なる和です。プラスが出てくるたびに、abへと1つずつ置き換えていけばよいのです。こちらも本当に単純です。さて、これで「二項係数多項式」がわかりました。完璧を期するため、この関数の一般の形を示しておきます。 \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{二項係数部分の項}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{二項係数部分の項}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{多項式部分の項}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{多項式部分の項}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] そして、これがベジエ曲線の完全な表現です。この関数中のΣは、加算の繰り返し(Σの下にある変数を使って、...=<値>から始めてΣの下にある値まで)を表します。 diff --git a/docs/chapters/explanation/content.ru-RU.md b/docs/chapters/explanation/content.ru-RU.md index b371f979..ad9884e8 100644 --- a/docs/chapters/explanation/content.ru-RU.md +++ b/docs/chapters/explanation/content.ru-RU.md @@ -59,9 +59,9 @@ \[ \begin{aligned} - линейный &= (1-t) + t \\ - квадратный &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - кубический &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{линийный} &= (1-t) + t \\ + \textit{квадратый} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{кубический} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -69,10 +69,10 @@ \[ \begin{aligned} - линийный &= \hspace{2.5em} 1 + 1 \\ - квадратый &= \hspace{1.7em} 1 + 2 + 1\\ - кубический &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - квартический &= 1 + 4 + 6 + 4 + 1 + \textit{линийный} &= \hspace{2.5em} 1 + 1 \\ + \textit{квадратый} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{кубический} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{квартический} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -82,19 +82,19 @@ \[ \begin{aligned} - линийный &= BLUE[a] + RED[b] \\ - квадратый &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - кубический &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{линийный} &= BLUE[a] + RED[b] \\ + \textit{квадратый} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{кубический} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] В целом это просто сума "каждого сочетания a и b", получаемая прогрессивной заменой a на b по ходу уравнения. Потому, это так-же довольно просто. Итак теперь вы знаете что такое биноминальные полиномы. Для полноты картины, ниже привожу их общую функцию: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] И теперь, это полное объяснение. Σ в этой функции означает, что это серия сум (с использованием переменной приведенной под Σ, со стартовым значением в ...=<value> и максимальным значением представленным над Σ) diff --git a/docs/chapters/explanation/content.zh-CN.md b/docs/chapters/explanation/content.zh-CN.md index 093d2c62..dccea53b 100644 --- a/docs/chapters/explanation/content.zh-CN.md +++ b/docs/chapters/explanation/content.zh-CN.md @@ -57,9 +57,9 @@ \[ \begin{aligned} - linear &= (1-t) + t \\ - square &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - cubic &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{linear} &= (1-t) + t \\ + \textit{square} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{cubic} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -67,10 +67,10 @@ \[ \begin{aligned} - linear &= \hspace{2.5em} 1 + 1 \\ - square &= \hspace{1.7em} 1 + 2 + 1\\ - cubic &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - quartic &= 1 + 4 + 6 + 4 + 1 + \textit{linear} &= \hspace{2.5em} 1 + 1 \\ + \textit{square} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{cubic} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{quartic} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -80,19 +80,19 @@ \[ \begin{aligned} - linear &= BLUE[a] + RED[b] \\ - square &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - cubic &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{linear} &= BLUE[a] + RED[b] \\ + \textit{square} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{cubic} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] 基本上它就是“每个ab结合项”的和,在每个加号后面逐步的将a换成b。因此这也很简单。现在你已经知道了二次多项式,为了叙述的完整性,我将给出一般方程: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] 这就是贝塞尔曲线完整的描述。在这个函数中的Σ表示了这是一系列的加法(用Σ下面的变量,从...=<值>开始,直到Σ上面的数字结束)。 diff --git a/docs/chapters/extended/content.en-GB.md b/docs/chapters/extended/content.en-GB.md index eff0f991..d5e26e94 100644 --- a/docs/chapters/extended/content.en-GB.md +++ b/docs/chapters/extended/content.en-GB.md @@ -5,13 +5,13 @@ Now that we know the mathematics behind Bézier curves, there's one curious thin It all has to do with how we run from "the start" of our curve to "the end" of our curve. If we have a value that is a mixture of two other values, then the general formula for this is: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] The obvious start and end values here need to be `a=1, b=0`, so that the mixed value is 100% value 1, and 0% value 2, and `a=0, b=1`, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: if they are, then we could just pick whatever values we like, and end up with a mixed value that is, for example, 100% value 1 **and** 100% value 2. In principle that's fine, but for Bézier curves we always want mixed values *between* the start and end point, so we need to make sure we can never set "a" and "b" to some values that lead to a mix value that sums to more than 100%. And that's easy: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] With this we can guarantee that we never sum above 100%. By restricting `a` to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. diff --git a/docs/chapters/extended/content.ja-JP.md b/docs/chapters/extended/content.ja-JP.md index 4f4c2dd9..0871f077 100644 --- a/docs/chapters/extended/content.ja-JP.md +++ b/docs/chapters/extended/content.ja-JP.md @@ -5,13 +5,13 @@ このことは、曲線の「始点」から曲線の「終点」までどうやって動かすか、ということにすべて関係しています。2つの値を混ぜ合わせて1つの値をつくる場合、一般の式は次のようになります。 \[ - 混ぜ合わさった値 = a \cdot 値_1 + b \cdot 値_2 + \textit{混ぜ合わさった値} = a \cdot \textit{値}_1 + b \cdot \textit{値}_2 \] 明らかに、始点では`a=1, b=0`とする必要があります。こうすれば、値1が100%、値2が0%で混ぜ合わさるからです。また、終点では`a=0, b=1`とする必要があります。こうすれば、値1が0%、値2が100%で混ぜ合わさります。これに加えて、`a`と`b`を独立にしておきたくはありません。独立になっている場合、何でも好きな値にすることできますが、こうすると例えば「値1が100%**かつ**値2が100%」のようなことが可能になってしまいます。これはこれで原則としてはかまいませんが、ベジエ曲線の場合は混ぜ合わさった値が常に始点と終点の*間*になってほしいのです。というわけで、混ぜ合わせの和が100%を決して超えないように、`a`と`b`の値を設定する必要があります。これは次のようにすれば簡単です。 \[ - 混ぜ合わさった値 = a \cdot 値_1 + (1 - a) \cdot 値_2 + \textit{混ぜ合わさった値} = a \cdot \textit{値}_1 + (1 - a) \cdot \textit{値}_2 \] こうすれば、和が100%を超えることはないと保証できます。`a`の値を区間[0,1]に制限してしまえば、混ぜ合わさった値は常に2つの値の間のどこか(両端を含む)になり、また和は常に100%になります。 diff --git a/docs/chapters/extended/content.ru-RU.md b/docs/chapters/extended/content.ru-RU.md index a7af22ac..7b0faf3c 100644 --- a/docs/chapters/extended/content.ru-RU.md +++ b/docs/chapters/extended/content.ru-RU.md @@ -1,17 +1,17 @@ # Интервал Безье [0,1] -В математике кривых Безье, вы могли заметить одну любопытную деталь — кривые Безье всегда считают вдоль одного и того же интервала t, `t=0` to `t=1`. Почему же именно этот интервал? +В математике кривых Безье, вы могли заметить одну любопытную деталь — кривые Безье всегда считают вдоль одного и того же интервала t, `t=0` to `t=1`. Почему же именно этот интервал? Последнее обусловленно тем, как мы определяем "начало" и "конец" нашей кривой. Если у нас есть значение, которое представляет собой сочетание двух других значений, тогда общая формула для этого будет: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] Очевидно, что начальное и конечное значения `a` и `b` должны быть `a=1, b=0`, чтобы в начале получать вывод 100% первого показателя и 0% второго; и `a=0, b=1`, чтобы в конце получать 0% value 1 и 100% value 2. В дополнение, мы не хотим чтобы "a" и "b" были независимыми, в коем случае можно было бы присвоить им любые значения и на выводе получить, например, 100% первого показателя **и** 100% второго. В принципе, с последним все ок, но в случае кривых Безье, мы всегда должны получать значение *между* двух крайностей, потому нельзя присвоить `a` и `b` значения, которые бы вместе составляли суму более 100% на выводе, что можно записать как: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] С этим у нас есть гарантия, что мы не получим суму значений пропорций более 100%. Мы ограничиваем значение `a` интервалом [0,1], потому всегда получаем вывод из пропорционального смешения двух показателей, с сумой смесителей не превышающей 100%. @@ -27,5 +27,5 @@ -В области компьютерной графики, существуют множество кривых, которые действуют по противоположному кривым Безье принципу: вместо фиксированного интервала и свободного выбора контрольных точек формирующих развитие искривлений, они фиксируют форму кривой, предоставляя возможность выбора интервала. Отличным примером последней есть [кривая "Spiro"](https://levien.com/phd/phd.html), которая частично базируется на [спирали Корню](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%BE%D1%82%D0%BE%D0%B8%D0%B4%D0%B0), также известной как [спираль Эйлера](https://ru.qaz.wiki/wiki/Euler_spiral) (* в оригинале другая [ссылка на Корню и Эйлера](https://en.wikipedia.org/wiki/Euler_spiral) ). Эту эстетически приятную кривую можно встретить в нескольких графических пакетах: [FontForge](https://fontforge.org/en-US/) и [Inkscape](https://inkscape.org). Ее даже используют в дизайне шрифтов, например в начертания шрифта Inconsolata. +В области компьютерной графики, существуют множество кривых, которые действуют по противоположному кривым Безье принципу: вместо фиксированного интервала и свободного выбора контрольных точек формирующих развитие искривлений, они фиксируют форму кривой, предоставляя возможность выбора интервала. Отличным примером последней есть [кривая "Spiro"](https://levien.com/phd/phd.html), которая частично базируется на [спирали Корню](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%BE%D1%82%D0%BE%D0%B8%D0%B4%D0%B0), также известной как [спираль Эйлера](https://ru.qaz.wiki/wiki/Euler_spiral) (* в оригинале другая [ссылка на Корню и Эйлера](https://en.wikipedia.org/wiki/Euler_spiral) ). Эту эстетически приятную кривую можно встретить в нескольких графических пакетах: [FontForge](https://fontforge.org/en-US/) и [Inkscape](https://inkscape.org). Ее даже используют в дизайне шрифтов, например в начертания шрифта Inconsolata. diff --git a/docs/chapters/extended/content.zh-CN.md b/docs/chapters/extended/content.zh-CN.md index 36b0bd96..be0861d0 100644 --- a/docs/chapters/extended/content.zh-CN.md +++ b/docs/chapters/extended/content.zh-CN.md @@ -5,13 +5,13 @@ 这一切都与我们如何从曲线的“起点”变化到曲线“终点”有关。如果有一个值是另外两个值的混合,一般方程如下: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] 很显然,起始值需要`a=1, b=0`,混合值就为100%的value 1和0%的value 2。终点值需要`a=0, b=1`,则混合值是0%的value 1和100%的value 2。另外,我们不想让“a”和“b”是互相独立的:如果它们是互相独立的话,我们可以任意选出自己喜欢的值,并得到混合值,比如说100%的value1和100%的value2。原则上这是可以的,但是对于贝塞尔曲线来说,我们通常想要的是起始值和终点值*之间*的混合值,所以要确保我们不会设置一些“a”和"b"而导致混合值超过100%。这很简单: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] 用这个式子我们可以保证相加的值永远不会超过100%。通过将`a`限制在区间[0,1],我们将会一直处于这两个值之间(包括这两个端点),并且相加为100%。 diff --git a/docs/chapters/extremities/content.en-GB.md b/docs/chapters/extremities/content.en-GB.md index 0a617ff2..a7461348 100644 --- a/docs/chapters/extremities/content.en-GB.md +++ b/docs/chapters/extremities/content.en-GB.md @@ -33,7 +33,7 @@ Although with the [caveat](https://en.wikipedia.org/wiki/Caveat_emptor#Caveat_le The derivative of a cubic Bézier curve is a quadratic Bézier curve, and finding the roots for a quadratic polynomial means we can apply the [Quadratic formula](https://en.wikipedia.org/wiki/Quadratic_formula). If you've seen it before, you'll remember it, and if you haven't, it looks like this: \[ - Given~f(t) = at^2 + bt + c,~f(t)=0~when~t = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} + \textit{Given}~f(t) = at^2 + bt + c,~f(t)=0 ~\textit{when}~ t = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \] So, if we can rewrite the Bézier component function as a plain polynomial, we're done: we just plug in the values into the quadratic formula, check if that square root is negative or not (if it is, there are no roots) and then just compute the two values that come out (because of that plus/minus sign we get two). Any value between 0 and 1 is a root that matters for Bézier curves, anything below or above that is irrelevant (because Bézier curves are only defined over the interval [0,1]). So, how do we convert? @@ -42,8 +42,8 @@ First we turn our cubic Bézier function into a quadratic one, by following the \[ \begin{array}{l} - B(t)~uses~\{ p_1,p_2,p_3,p_4 \} \\ - B'(t)~uses~\{ v_1,v_2,v_3 \},~where~v_1 = 3(p_2-p_1),~v_2 = 3(p_3-p_2),~v_3 = 3(p_4-p_3) + B(t)~\textit{uses}~\{ p_1,p_2,p_3,p_4 \} \\ + B'(t)~\textit{uses}~\{ v_1,v_2,v_3 \},~\textit{where}~v_1 = 3(p_2-p_1),~v_2 = 3(p_3-p_2),~v_3 = 3(p_4-p_3) \end{array} \] diff --git a/docs/chapters/inflections/content.en-GB.md b/docs/chapters/inflections/content.en-GB.md index d58c9314..841a3c99 100644 --- a/docs/chapters/inflections/content.en-GB.md +++ b/docs/chapters/inflections/content.en-GB.md @@ -13,7 +13,7 @@ What we need to do is solve a simple equation: What we're saying here is that given the curvature function *C(t)*, we want to know for which values of *t* this function is zero, meaning there is no "curvature", which will be exactly at the point between our circle being on one side of the curve, and our circle being on the other side of the curve. So what does *C(t)* look like? Actually something that seems not too hard: \[ - C(t) = Bézier_x\prime(t) \cdot Bézier_y{\prime\prime}(t) - Bézier_y\prime(t) \cdot Bézier_x{\prime\prime}(t) + C(t) = \textit{Bézier}_x\prime(t) \cdot \textit{Bézier}_y{\prime\prime}(t) - \textit{Bézier}_y\prime(t) \cdot \textit{Bézier}_x{\prime\prime}(t) \] The function *C(t)* is the cross product between the first and second derivative functions for the parametric dimensions of our curve. And, as already shown, derivatives of Bézier curves are just simpler Bézier curves, with very easy to compute new coefficients, so this should be pretty easy. @@ -28,9 +28,9 @@ Of course, before we do our aligned check, let's see what happens if we compute \[ \begin{aligned} - & Bézier(t) = x_1(1-t)^3 + 3x_2(1-t)^2t + 3x_3(1-t)t^2 + x_4t^3 \\ - & Bézier^\prime(t) = a(1-t)^2 + 2b(1-t)t + ct^2~ \left\{ a=3(x_2-x_1),b=3(x_3-x_2),c=3(x_4-x_3) \right\} \\ - & Bézier^{\prime\prime}(t) = u(1-t) + vt~\left\{ u=2(b-a),v=2(c-b) \right\}\ + & \textit{Bézier}(t) = x_1(1-t)^3 + 3x_2(1-t)^2t + 3x_3(1-t)t^2 + x_4t^3 \\ + & \textit{Bézier}^\prime(t) = a(1-t)^2 + 2b(1-t)t + ct^2~ \left\{ a=3(x_2-x_1),b=3(x_3-x_2),c=3(x_4-x_3) \right\} \\ + & \textit{Bézier}^{\prime\prime}(t) = u(1-t) + vt~\left\{ u=2(b-a),v=2(c-b) \right\}\ \end{aligned} \] @@ -38,9 +38,9 @@ And of course the same functions for *y*: \[ \begin{aligned} - & Bézier(t) = y_1(1-t)^3 + 3y_2(1-t)^2t + 3y_3(1-t)t^2 + y_4t^3 \\ - & Bézier^\prime(t) = d(1-t)^2 + 2e(1-t)t + ft^2\\ - & Bézier^{\prime\prime}(t) = w(1-t) + zt + & \textit{Bézier}(t) = y_1(1-t)^3 + 3y_2(1-t)^2t + 3y_3(1-t)t^2 + y_4t^3 \\ + & \textit{Bézier}^\prime(t) = d(1-t)^2 + 2e(1-t)t + ft^2\\ + & \textit{Bézier}^{\prime\prime}(t) = w(1-t) + zt \end{aligned} \] diff --git a/docs/chapters/matrixsplit/content.en-GB.md b/docs/chapters/matrixsplit/content.en-GB.md index 8a26d45c..0d803185 100644 --- a/docs/chapters/matrixsplit/content.en-GB.md +++ b/docs/chapters/matrixsplit/content.en-GB.md @@ -155,7 +155,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high 1 & t & t^2 \end{bmatrix} \cdot - \underset{we~turn~this...}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} + \underset{\textit{we turn this...}}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -168,7 +168,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high 1 & t & t^2 \end{bmatrix} \cdot - \underset{...into~this...}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} + \underset{\textit{into this...}}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -182,7 +182,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high \end{bmatrix} \cdot M - \underset{...to~get~this!}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} + \underset{\textit{...to get this!}}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} \begin{bmatrix} P_1 \\ P_2 \\ P_3 \end{bmatrix} diff --git a/docs/chapters/matrixsplit/content.ja-JP.md b/docs/chapters/matrixsplit/content.ja-JP.md index 6c2ad91c..4e90938d 100644 --- a/docs/chapters/matrixsplit/content.ja-JP.md +++ b/docs/chapters/matrixsplit/content.ja-JP.md @@ -155,7 +155,7 @@ 1 & t & t^2 \end{bmatrix} \cdot - \underset{これを…}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} + \underset{\textit{これを…}}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -168,7 +168,7 @@ 1 & t & t^2 \end{bmatrix} \cdot - \underset{…こうして…}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} + \underset{\textit{…こうして…}}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -182,7 +182,7 @@ \end{bmatrix} \cdot M - \underset{…こうじゃ!}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} + \underset{\textit{…こうじゃ!}}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} \begin{bmatrix} P_1 \\ P_2 \\ P_3 \end{bmatrix} diff --git a/docs/chapters/molding/content.en-GB.md b/docs/chapters/molding/content.en-GB.md index 347d0724..7f84b36f 100644 --- a/docs/chapters/molding/content.en-GB.md +++ b/docs/chapters/molding/content.en-GB.md @@ -5,13 +5,13 @@ Armed with knowledge of the "ABC" relation, point-on-curve projection, and guest For quadratic curve, this is a really simple trick: we project our cursor onto the curve, which gives us a `t` value and initial `B` coordinate. We don't even need the latter: with our `t` value and "wherever the cursor is" as target `B`, we can compute the associated `C`: \[ - C = u(t)_{q} \cdot Start + \left ( 1-u(t)_{q} \right ) \cdot End + C = u(t)_{q} \cdot \textit{Start} + \left ( 1-u(t)_{q} \right ) \cdot \textit{End} \] And then the associated `A`: \[ - A = B - \frac{C - B}{ratio(t)_{q}} = B + \frac{B - C}{ratio(t)_{q}} + A = B - \frac{C - B}{\textit{ratio}(t)_{q}} = B + \frac{B - C}{\textit{ratio}(t)_{q}} \] And we're done, because that's our new quadratic control point! diff --git a/docs/chapters/pointvectors/content.en-GB.md b/docs/chapters/pointvectors/content.en-GB.md index 236eafb5..9fa7d0d3 100644 --- a/docs/chapters/pointvectors/content.en-GB.md +++ b/docs/chapters/pointvectors/content.en-GB.md @@ -4,9 +4,9 @@ If you want to move objects along a curve, or "away from" a curve, the two vecto \[ \begin{matrix} - tangent_x(t) = B'_x(t) \\ + \textit{tangent}_x(t) = B'_x(t) \\ \\ - tangent_y(t) = B'_y(t) + \textit{tangent}_y(t) = B'_y(t) \end{matrix} \] @@ -14,14 +14,14 @@ This gives us the directional vector we want. We can normalize it to give us uni \[ \begin{matrix} - d = \left \| tangent(t) \right \| = \sqrt{B'_x(t)^2 + B'_y(t)^2} \\ + d = \left \| \textit{tangent}(t) \right \| = \sqrt{B'_x(t)^2 + B'_y(t)^2} \\ \\ - \hat{x}(t) = \left \| tangent_x(t) \right \| - =\frac{tangent_x(t)}{ \left \| tangent(t) \right \| } + \hat{x}(t) = \left \| \textit{tangent}_x(t) \right \| + =\frac{\textit{tangent}_x(t)}{ \left \| \textit{tangent}(t) \right \| } = \frac{B'_x(t)}{d} \\ \\ - \hat{y}(t) = \left \| tangent_y(t) \right \| - = \frac{tangent_y(t)}{ \left \| tangent(t) \right \| } + \hat{y}(t) = \left \| \textit{tangent}_y(t) \right \| + = \frac{\textit{tangent}_y(t)}{ \left \| \textit{tangent}(t) \right \| } = \frac{B'_y(t)}{d} \end{matrix} \] @@ -30,9 +30,9 @@ The tangent is very useful for moving along a line, but what if we want to move \[ \begin{array}{l} - normal_x(t) = \hat{x}(t) \cdot \cos{\frac{\pi}{2}} - \hat{y}(t) \cdot \sin{\frac{\pi}{2}} = - \hat{y}(t) \\ + \textit{normal}_x(t) = \hat{x}(t) \cdot \cos{\frac{\pi}{2}} - \hat{y}(t) \cdot \sin{\frac{\pi}{2}} = - \hat{y}(t) \\ \\ - normal_y(t) = \underset{quarter~circle~rotation} {\underbrace{ \hat{x}(t) \cdot \sin{\frac{\pi}{2}} + \hat{y}(t) \cdot \cos{\frac{\pi}{2}} }} = \hat{x}(t) + \textit{normal}_y(t) = \underset{\textit{quarter circle rotation}} {\underbrace{ \hat{x}(t) \cdot \sin{\frac{\pi}{2}} + \hat{y}(t) \cdot \cos{\frac{\pi}{2}} }} = \hat{x}(t) \end{array} \] diff --git a/docs/chapters/polybezier/content.en-GB.md b/docs/chapters/polybezier/content.en-GB.md index 40f9f9db..d82b7e0d 100644 --- a/docs/chapters/polybezier/content.en-GB.md +++ b/docs/chapters/polybezier/content.en-GB.md @@ -21,7 +21,7 @@ Dragging the control points around only affects the curve segments that the cont We can effect this quite easily, because we know that the vector from a curve's last control point to its last on-curve point is equal to the derivative vector. If we want to ensure that the first control point of the next curve matches that, all we have to do is mirror that last control point through the last on-curve point. And mirroring any point A through any point B is really simple: \[ - Mirrored = \left [ + \textit{Mirrored} = \left [ \begin{matrix} B_x + (B_x - A_x) \\ B_y + (B_y - A_y) \end{matrix} \right ] = \left [ \begin{matrix} 2B_x - A_x \\ 2B_y - A_y \end{matrix} diff --git a/docs/chapters/reordering/content.en-GB.md b/docs/chapters/reordering/content.en-GB.md index cdb0e264..c06d684d 100644 --- a/docs/chapters/reordering/content.en-GB.md +++ b/docs/chapters/reordering/content.en-GB.md @@ -7,13 +7,13 @@ If we have a curve with three points, then we can create a curve with four point The general rule for raising an *nth* order curve to an *(n+1)th* order curve is as follows (observing that the start and end weights are the same as the start and end weights for the old curve): \[ - Bézier(k,t) = \sum_{i=0}^{k} - \underset{binomial~term}{\underbrace{\binom{k}{i}}} + \textit{Bézier}(k,t) = \sum_{i=0}^{k} + \underset{\textit{binomial term}}{\underbrace{\binom{k}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} ~\cdot \ - \underset{new~weights}{\underbrace{\left ( \frac{(k-i) \cdot w_i + i \cdot w_{i-1}}{k} \right )}} - ~,~with~k = n+1~and~w_{i-1}=0~when~i = 0 + \underset{\textit{new weights}}{\underbrace{\left ( \frac{(k-i) \cdot w_i + i \cdot w_{i-1}}{k} \right )}} + ~,~\textit{with}~k = n+1~\textit{and}~w_{i-1}=0~when~i = 0 \] However, this rule also has as direct consequence that you **cannot** generally safely lower a curve from *nth* order to *(n-1)th* order, because the control points cannot be "pulled apart" cleanly. We can try to, but the resulting curve will not be identical to the original, and may in fact look completely different. @@ -23,7 +23,7 @@ However, there is a surprisingly good way to ensure that a lower order curve loo We start by taking the standard Bézier function, and condensing it a little: \[ - Bézier(n,t) + \textit{Bézier}(n,t) = \sum_{i=0}^{n} w_i B^n_i(t) \textit{, where } @@ -42,7 +42,7 @@ So, with that seemingly trivial observation, we rewrite that Bézier function by \[ \begin{aligned} - Bézier(n,t) &= (1-t) B(n,t) + t B(n,t) \\ + \textit{Bézier}(n,t) &= (1-t) B(n,t) + t B(n,t) \\ &= \sum_{i=0}^{n} w_i (1 - t) B^n_i(t) + \sum_{i=0}^{n} w_i t B^n_i(t) \end{aligned} \] diff --git a/docs/chapters/weightcontrol/content.en-GB.md b/docs/chapters/weightcontrol/content.en-GB.md index 998a61af..1b90e256 100644 --- a/docs/chapters/weightcontrol/content.en-GB.md +++ b/docs/chapters/weightcontrol/content.en-GB.md @@ -5,13 +5,13 @@ We can further control Bézier curves by "rationalising" them: that is, adding a Adding these ratio values to the regular Bézier curve function is fairly easy. Where the regular function is the following: \[ - Bézier(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i + \textit{Bézier}(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \] The function for rational Bézier curves has two more terms: \[ - Rational~Bézier(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } + \textit{Rational Bézier}(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } \] In this, the first new term represents an additional weight for each coordinate. For example, if our ratio values are [1, 0.5, 0.5, 1] then ratio0 = 1, ratio1 = 0.5, and so on, and is effectively identical as if we were just using different weight. So far, nothing too special. diff --git a/docs/chapters/weightcontrol/content.ru-RU.md b/docs/chapters/weightcontrol/content.ru-RU.md index 35a02c89..96144568 100644 --- a/docs/chapters/weightcontrol/content.ru-RU.md +++ b/docs/chapters/weightcontrol/content.ru-RU.md @@ -5,13 +5,13 @@ Как и прочее, воплощение этого коэффициента не должно составить нам особого труда. Тогда как обычная функция: \[ - Bézier(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i + \textit{Bézier}(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \] Функция для соотносительных кривых Безье имеет два дополнительных термина: \[ - Rational~Bézier(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } + \textit{Rational Bézier}(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } \] Первый из добавочных терминов, представляет собой дополнительный "вес" для каждой координаты, Например если наши значения соотношений [1, 0.5, 0.5, 1], тогда частица0 = 1, частица1 = 0.5 и т.д., и на практике ничем не отличается от использования дополнительного "вес"-а. Пока ничего особо выдающегося. diff --git a/docs/chapters/whatis/content.en-GB.md b/docs/chapters/whatis/content.en-GB.md index 61ba77ef..7c4f6083 100644 --- a/docs/chapters/whatis/content.en-GB.md +++ b/docs/chapters/whatis/content.en-GB.md @@ -7,14 +7,14 @@ Bézier curves are the result of [linear interpolations](https://en.wikipedia.or If we know the distance between those two points, and we want a new point that is, say, 20% the distance away from the first point (and thus 80% the distance away from the second point) then we can compute that really easily: \[ -Given \left ( +\textit{Given} \left ( \begin{aligned} - p_1 &= some~point \\ - p_2 &= some~other~point \\ - distance &= (p_2 - p_1) \\ - ratio &= \frac{percentage}{100} \\ + p_1 &= \textit{some point} \\ + p_2 &= \textit{some other point} \\ + \textit{distance} &= (p_2 - p_1) \\ + \textit{ratio} &= \frac{\textit{percentage}}{100} \\ \end{aligned} -\right ),~our~new~point = p_1 + distance \cdot ratio +\right ),~\textit{our new point} = p_1 + \textit{distance} \cdot \textit{ratio} \] So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over those lines gives us two points, between which we can again perform linear interpolation, yielding a single point. And that point —and all points we can form in this way for all ratios taken together— form our Bézier curve: diff --git a/docs/chapters/whatis/content.ja-JP.md b/docs/chapters/whatis/content.ja-JP.md index 922e3bc2..d8814c7e 100644 --- a/docs/chapters/whatis/content.ja-JP.md +++ b/docs/chapters/whatis/content.ja-JP.md @@ -9,12 +9,12 @@ \[ \left ( \begin{aligned} - p_1 &= 一方の点 \\ - p_2 &= もう一方の点 \\ - 距離 &= (p_2 - p_1) \\ - 比率 &= \frac{百分率}{100} \\ + p_1 &= \textit{一方の点} \\ + p_2 &= \textit{もう一方の点} \\ + \textit{距離} &= (p_2 - p_1) \\ + \textit{比率} &= \frac{\textit{百分率}}{100} \\ \end{aligned} -\right )のとき、新しい点 = p_1 + 距離 \cdot 比率 +\right ) \textit{のとき、新しい点} = p_1 + \textit{距離} \cdot \textit{比率} \] では、実際に見てみましょう。下の図はインタラクティブになっています。上下キーで補間の比率が増減しますので、どうなるか確かめてみましょう。最初に3点があり、それを結んで2本の直線が引かれています。この直線の上でそれぞれ線形補間を行うと、2つの点が得られます。この2点の間でさらに線形補間を行うと、1つの点を得ることができます。そして、あらゆる比率に対して同様に点を求め、それをすべて集めると、このようにベジエ曲線ができるのです。 diff --git a/docs/chapters/whatis/content.ru-RU.md b/docs/chapters/whatis/content.ru-RU.md index 0cc67eb6..e8a79566 100644 --- a/docs/chapters/whatis/content.ru-RU.md +++ b/docs/chapters/whatis/content.ru-RU.md @@ -7,17 +7,17 @@ Вот, скажем, зная расстояние между двух точек и желая поставить третью на удалении 20ти % этого расстояния до первой и, соответственно, 80ти % до второй, вычислить результат можно следующим образом: \[ -Дано \left ( +\textit{Дано} \left ( \begin{aligned} - p_1 &= неикая~точка \\ - p_2 &= неикая~другая~точка \\ - расстояние &= (p_2 - p_1) \\ - соотношение &= \frac{процентаж}{100} \\ + p_1 &= \textit{неикая точка} \\ + p_2 &= \textit{неикая другая точка} \\ + \textit{расстояние} &= (p_2 - p_1) \\ + \textit{соотношение} &= \frac{\textit{процентаж}}{100} \\ \end{aligned} -\right ),~наша~новая~точка = p_1 + расстояние \cdot соотношение +\right ),~\textit{наша новая точка} = p_1 + \textit{расстояние} \cdot \textit{соотношение} \] -Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, задаем два отрезка, затем производим линейную интерполяцию по длине каждого из них, получая еще две точки. Далее мы опять производим линейную интерполяцию уже между полученными точками и в итоге получаем искомую точку. (* на изображении видим 3 проекции соответственно этим трем действиям). +Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, задаем два отрезка, затем производим линейную интерполяцию по длине каждого из них, получая еще две точки. Далее мы опять производим линейную интерполяцию уже между полученными точками и в итоге получаем искомую точку. (* на изображении видим 3 проекции соответственно этим трем действиям). diff --git a/docs/chapters/whatis/content.zh-CN.md b/docs/chapters/whatis/content.zh-CN.md index 5f618bf8..e1001a4d 100644 --- a/docs/chapters/whatis/content.zh-CN.md +++ b/docs/chapters/whatis/content.zh-CN.md @@ -7,14 +7,14 @@ 如果我们知道两点之间的距离,并想找出离第一个点20%间距的一个新的点(也就是离第二个点80%的间距),我们可以通过简单的计算来得到: \[ -Given \left ( +\textit{Given} \left ( \begin{aligned} - p_1 &= some~point \\ - p_2 &= some~other~point \\ - distance &= (p_2 - p_1) \\ - ratio &= \frac{percentage}{100} \\ + p_1 &= \textit{some point} \\ + p_2 &= \textit{some other point} \\ + \textit{distance} &= (p_2 - p_1) \\ + \textit{ratio} &= \frac{\textit{percentage}}{100} \\ \end{aligned} -\right ),~our~new~point = p_1 + distance \cdot ratio +\right ),~\textit{our new point} = p_1 + \textit{distance} \cdot \textit{ratio} \] 让我们来通过实际操作看一下:下面的图形都是可交互的,因此你可以通过上下键来增加或减少插值距离,来观察图形的变化。我们从三个点构成的两条线段开始。通过对各条线段进行线性插值得到两个点,对点之间的线段再进行线性插值,产生一个新的点。最终这些点——所有的点都可以通过选取不同的距离插值产生——构成了贝塞尔曲线 diff --git a/docs/chapters/yforx/content.en-GB.md b/docs/chapters/yforx/content.en-GB.md index facc6fe8..57fe0849 100644 --- a/docs/chapters/yforx/content.en-GB.md +++ b/docs/chapters/yforx/content.en-GB.md @@ -13,19 +13,19 @@ Now, if you look more closely at that right graphic, you'll notice something int First, let's look at the function for x(t): \[ - x(t) = a(1-t)³ + 3b(1-t)²t + 3c(1-t)t² + dt³ + x(t) = a(1-t)^3 + 3b(1-t)^2t + 3c(1-t)t^2 + dt^3 \] We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as: \[ - x(t) = (-a + 3b- 3c + d)t³ + (3a - 6b + 3c)t² + (-3a + 3b)t + a + x(t) = (-a + 3b- 3c + d)t^3 + (3a - 6b + 3c)t^2 + (-3a + 3b)t + a \] Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of `t`). So, given that `a`, `b`, `c`, `d`, *and* `x(t)` are all known constants, we can trivially rewrite this (by moving the `x(t)` across the equal sign) as: \[ - (-a + 3b - 3c + d)t³ + (3a - 6b + 3c)t² + (-3a + 3b)t + (a-x) = 0 + (-a + 3b - 3c + d)t^3 + (3a - 6b + 3c)t^2 + (-3a + 3b)t + (a-x) = 0 \] You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using Cardano's algorithm, and we're left with some rather short code: diff --git a/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg b/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg new file mode 100644 index 00000000..7b6adeb2 --- /dev/null +++ b/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg b/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg deleted file mode 100644 index 987ba4f5..00000000 --- a/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg b/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg new file mode 100644 index 00000000..72e70bd5 --- /dev/null +++ b/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg b/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg new file mode 100644 index 00000000..0dd87466 --- /dev/null +++ b/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg b/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg new file mode 100644 index 00000000..09ed54ab --- /dev/null +++ b/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg b/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg deleted file mode 100644 index 74393c28..00000000 --- a/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg b/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg new file mode 100644 index 00000000..29461f1e --- /dev/null +++ b/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg b/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg new file mode 100644 index 00000000..9e198f4f --- /dev/null +++ b/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg b/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg new file mode 100644 index 00000000..20ff40d4 --- /dev/null +++ b/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg b/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg new file mode 100644 index 00000000..b5c36016 --- /dev/null +++ b/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg b/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg deleted file mode 100644 index b1b10de4..00000000 --- a/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg b/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg deleted file mode 100644 index f2e31787..00000000 --- a/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg b/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg deleted file mode 100644 index a07bd242..00000000 --- a/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg b/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg deleted file mode 100644 index ef28accf..00000000 --- a/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg b/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg deleted file mode 100644 index c92d0726..00000000 --- a/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg b/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg deleted file mode 100644 index 0b65462e..00000000 --- a/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg b/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg deleted file mode 100644 index 1ac2d5e3..00000000 --- a/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png b/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png index 4cc00cf30583321c5e1b05ac5cc05a87f03396f9..97953e459b537254a6cd5ed94d5f3f2ad3c5d2ec 100644 GIT binary patch literal 11018 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 literal 11031 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�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 S$_7Ku5Cs`!=?W?1p#KF|nIHE6 literal 11527 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 MDJ97=aidTF3%?UWfdBvi diff --git a/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg b/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg new file mode 100644 index 00000000..bdeddfa9 --- /dev/null +++ b/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg b/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg new file mode 100644 index 00000000..a9dd18c8 --- /dev/null +++ b/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg b/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg deleted file mode 100644 index 675d15f5..00000000 --- a/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png b/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png index d19b73bca05bf6df1aa59ad28f0c15341e8f87e7..6cd4b1822bbd603e71592ff5ea2cc21d803f8a09 100644 GIT binary patch literal 12372 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 G{yzX5dB`yU literal 12388 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 H@z?(a%b1Oz diff --git a/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg b/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg new file mode 100644 index 00000000..9fc67edf --- /dev/null +++ b/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg b/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg new file mode 100644 index 00000000..b7b968bd --- /dev/null +++ b/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg b/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg new file mode 100644 index 00000000..bde14b0f --- /dev/null +++ b/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg b/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg deleted file mode 100644 index b6ae592a..00000000 --- a/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg b/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg deleted file mode 100644 index 318ec473..00000000 --- a/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg b/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg deleted file mode 100644 index 8f58bdba..00000000 --- a/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg b/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg new file mode 100644 index 00000000..7162095c --- /dev/null +++ b/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg b/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg deleted file mode 100644 index c25e7948..00000000 --- a/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg b/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg deleted file mode 100644 index 31325d78..00000000 --- a/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg b/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg new file mode 100644 index 00000000..d8b2ab16 --- /dev/null +++ b/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg b/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg deleted file mode 100644 index bb3f7d82..00000000 --- a/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg b/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg new file mode 100644 index 00000000..ea170f65 --- /dev/null +++ b/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg b/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg new file mode 100644 index 00000000..baa32fa7 --- /dev/null +++ b/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg b/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg deleted file mode 100644 index d880b477..00000000 --- a/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/c1f8861583b4176a9b607aa6a05f9356.svg b/docs/images/chapters/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.svg similarity index 100% rename from docs/images/chapters/catmullconv/c1f8861583b4176a9b607aa6a05f9356.svg rename to docs/images/chapters/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.svg diff --git a/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg b/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg new file mode 100644 index 00000000..0dd27f6b --- /dev/null +++ b/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg b/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg deleted file mode 100644 index aa26f769..00000000 --- a/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg b/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg deleted file mode 100644 index d880b477..00000000 --- a/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg b/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg new file mode 100644 index 00000000..c0395cce --- /dev/null +++ b/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg b/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg deleted file mode 100644 index 7c783bfd..00000000 --- a/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg b/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg new file mode 100644 index 00000000..c0395cce --- /dev/null +++ b/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg b/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg new file mode 100644 index 00000000..27050200 --- /dev/null +++ b/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg b/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg new file mode 100644 index 00000000..89f8397d --- /dev/null +++ b/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg b/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg deleted file mode 100644 index f4f9bc9b..00000000 --- a/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg b/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg deleted file mode 100644 index 0d73182c..00000000 --- a/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg b/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg deleted file mode 100644 index 2ae488c9..00000000 --- a/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg b/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg new file mode 100644 index 00000000..232e2a0c --- /dev/null +++ b/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg b/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg new file mode 100644 index 00000000..2699a596 --- /dev/null +++ b/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg b/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg new file mode 100644 index 00000000..1c3dac4f --- /dev/null +++ b/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg b/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg deleted file mode 100644 index f916f7ea..00000000 --- a/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg b/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg deleted file mode 100644 index 57b7c20c..00000000 --- a/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg b/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg new file mode 100644 index 00000000..0eb401c9 --- /dev/null +++ b/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg b/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg deleted file mode 100644 index 7b252622..00000000 --- a/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg b/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg deleted file mode 100644 index 12aa5b8a..00000000 --- a/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg b/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg new file mode 100644 index 00000000..c6bc08b5 --- /dev/null +++ b/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg b/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg deleted file mode 100644 index 8ebfa042..00000000 --- a/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg b/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg new file mode 100644 index 00000000..d9bc14e1 --- /dev/null +++ b/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png b/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png index 39aaa2f1441ba85e9eecf7d38358efba482c0ad8..7bc49082978adbc3c4afa7f095ffd9bf7e2fea6f 100644 GIT binary patch literal 16616 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 z z#-P#t`qS2vR0{HE70^KV{~q~A)*}UCUN9pH5L@4fribzd+yc9}fE7T93(E*q{L=OP EKfmGlegFUf diff --git a/docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png b/docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png deleted file mode 100644 index fc16b53511e52d14efcdd05fbd695756a29ff6a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17792 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 C@@}*M diff --git a/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg deleted file mode 100644 index 7b88284c..00000000 --- a/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/control/9df7dc66b51db8e3046e1f359874c38e.svg b/docs/images/chapters/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.svg similarity index 100% rename from docs/images/chapters/control/9df7dc66b51db8e3046e1f359874c38e.svg rename to docs/images/chapters/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.svg diff --git a/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png b/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png index 29e2128f971ebe8fe5ee636776f79db6c08534bc..8fa2d8b59aa8dd72c98a6619ac2f995394bb06b7 100644 GIT binary patch literal 13998 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 literal 13971 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 U&QA8=lo^Vch?H=VppN(d15@YJegFUf diff --git a/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg b/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg new file mode 100644 index 00000000..2f8262c6 --- /dev/null +++ b/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg b/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg deleted file mode 100644 index 78e2414a..00000000 --- a/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png b/docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png deleted file mode 100644 index 5cfe86ff8b9f926d863306d439d16e19aaf409db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31587 zcmV*tKtjKXP)lan}!lQ{CAQ`US1xFiHUsh!3W%M!wsxhvEsKfYJoAiKLh0=6 zvD@vxSpSK( z@1#DMK7Bgb+1X5-IFaP!h*d;LPAc65devai8MAg5)u+ZOG^tG85zGw|B1Hmq`m>D)oT3x{XNdd z#Kd^C(P%U%mCF7$|Cjsw->Ofe(V$kVPl#S`_9=g{*8d@=S;!d=!Cvg%d@gIzTJ7)6r*IzSl-aM|q{(7RKqA(hb9654? zy1F`2Qd0Q(>#vzOaUx^KjvbM{1#jLm#97(DYu*qLJ~fVLp63DCp#O?vkBPx8g@=^v zxHjG`kRAK482Cem)UQz{J4RM6^`4iBqsIlZKH+|4qFyB|2!APJPhiPG&r;g(Rj+`YF$NGOE! zX#0Wx%Y_@6a3NE>K`Hg#H$NA0xf7Y9w+%`O6umtb3V~ZCa3~enl`?O_ctLF0-`&OK5md9`Y$E}Bq2kHUUE?MDU^YnqeLSICC*+2 za)DZc-Z3vwxMj#B88T$Z-Eu%6$wA1RNOEw?1jt;tW#C2zGAC}pEeE;Uj$HH-ky02@ zAdpKEN?iSi<4_<6+;TS#m4r*_K(1&(C2K`3YsZfcRKg5^Qxwg_;o4KRV86+jUrI1BS7Kenzl+R ze_Xdx9#%7WsL!%B3xiqpoA;0N-G(ecg%lfzeUuApqyrHf zh{``4r7{SaT!lc1U9w_xnXou@SRDp}{33|fW)T~lO>9Uu8oyX-J6m!3%c(N;_N~#{ zMZ3+2&S}LV2^2CpK}sc&eu0b*2q!&g6jAapRE_|ILj^Vkc9WdW9tZ86cB<+Pw6xmM z>0KyPGEjg_B_lFiMO>_g_-GALeo8`>ak29X4G%ZmSuA3zeuE8R-bV`17qanyYnKW%2*_sH#)j@>&1reqSBt#WJM~g&$sgBZGBbD_g zCKV*^M^2q0pdAJO4zM#lxBmfP^tsp#C>Mc08IEKODd;x%Z;1`!aiK@+P%6YGyA z${)L~m6i>=FxTf{ZmvU{mPJrXI)OszTcZK1Mr2Qp-&N1R5qHjC)M zF(?d9>|x=2TDyyUT?40vCv!vO7{-SrAeYJbdSyLpj7|$UPjl+(>dZSTex}= zwLw;rbiZSAW+=0!#RA~AyV?CjA<m2pt#9sI$UwXV%eT z-b07J5O=GQh?E?HiO0XkA6bhDb43-VnsS1Y#}GO7EW#(AhX1H&kNe~nP8zxoVRsv8 zGnP@OE278Rghi&Ml|W>Ei6jPRlc9}gOi�{^4j<0odJ6ju@J#Gk4Ks)l+6{rORO^ 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 diff --git a/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png b/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png index 9894b8c7cfca5f52b8021dcd9329815b0cf874a6..6359f53a123d0a827d3b90d70f741b36be97334d 100644 GIT binary patch literal 30204 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
iPvlSorR! zD2D?IM(Nag1Sr>Lbnbe+3o)JiOwIAni2TYW+Rf^NflHd3)4V%dg}+g(Ei5P?^%*MaH+bT|vCZ0p;Q(McxKfbpiFecc60}Rq0a!@$ecXCq7l9l2n Gq5lKT>ee>^ literal 30207 zcmV*tKtjKXP))62}a0d1S1&1 zZ-Nmr8Nmof@SEVYl1W8H1&bCf;=q9er?VR)7{UKM4jw$noH=t?wQAKVyT@rG6T98c zMHgK}K|ujmUwt)|m6fNfDL+1c4FTej?UcVh&<0S+EK_`gXeyLazq)TmK>^2sOM za?35OSh3=Cb!7w|ke!{)E3dr5+_`f-63V)D>v-?I_x_K2HiBP^Ns}gV_0?CO(tDgX zGO4bvCO$qMfH7mnP*qiRy1Fs~5AgExLakQ!{d9+O&pnqVOO`Ny{`~*r-i_e*2F2;T zxg<%a^Y$Yc0^`Pwx;ld20Ztp4 z#Ky)_US1ABd3kxCmNJ6h7bHo->2$i3d3kve7#P_1x6Ni7`7n$C#A$-fW)t!8@#4V; z9~2Q05u&1^;&gRo1cPAJs#PK(Aweu%y43A;gTWvsPo6C1&71ds+_Mq<8XP!qKwNdz zRbt}AiDKo-m8aw$r%f|aC=_hoyqT3NS91UT_Y)Tvce=VVfbUQL zbmC9Z|A$2X>WUn*xuDa@~ zLEC#~$-Bhay#D|9o}r1LZ_10o>kmm=k~@Ytq0ti?koxICoX9bK%clY%Tm)Pi=zraN z|CTuZrUM{zO7!wTFE>btzMDyaQ%DFQA&`*wHYkCN<3u9^1-70BWCEoVdgi=9?vRk2 z5)u+JhYS!nWgsLQP8m2P0g@eu1P&ySY&Zai3}h+`GSNds3SmQzK<0F!z}`oSPLv3t zKnNvvr3{1$r%=-K3aPM5Uf8{iNWzXx*^N+lBVj`(*>I|CI8}Cp+=)}^#Hj)y1B5_s zmLs#ukUJ%0PI=FGC6LKMk_+T=fushuI6KT?q&jN-J{7NwC97NVkljZaIM#8UEc0 ze5`V0fJ5fMs&rykSdqyaP)d!cq-MNmK`FWbut{ocGB3LQWSFDuSVAq>f-N|O4Xa9l ztjh~wQBm(5OszJIX0;zaHXB-t1+O**y0Tb|jbZp|b*SZbZfGi{^yj4{UV5YFdH!GE zSCPrdzFHv!_uqd%3Wb8u&`_Rv<{73;nZo<;zfWUhBkR_!WBmB>9^2C@?CkYDgLJ>M zdGXFP92N&vYa1zDT1)&@ktE$3i*P#W%*~;7?=IR8?k8aEc;arqhh{H3{xT_mgYNFKGM4_RcSf3D*R54r?mqoDLpXT;%8d|$) zXfadQY^J2jNPUZ$=rA89r3Z3GRxt4qYAmf5jFnwWSTWU@=&CXyoC0l<2EP<7 zLE{7P4!2{|cVg3bVCiVbs%ytwUyY%>2y;sVl3Ix~(icmp9dn2k5$TK4I|zkBgCtWT zP+)PI>9!j&*>sq#dNf|aglkiY^h+nwKOG;hNZKr2wA;EUGxm(F*4##Ow*j5ajMXWS zOENSH1tDI(j8+GcqzNTV7KqZSMp%{5EyrS%(b{39xz$2dor#+IE_9uC`VbxNLztI>0EG-KGJNfzvN%wfoX}~*TxY^mYr@)YMF@dilHsrm80xSXG;xV& zViHgW2H_PHgh8~>)R|9{KA%QIA!chkUP>)q%0LtfUlcMQY}m0oZJ6y{7_9A>?IwiG zhi=KAX1kJhe9(Buk)Vwt-6xnJm4+ZM4S`Bu{FQ228k`&{)KOSzptRbEOeQfpQcY}( zn&1pC!h=+dj`Afm(2MRW6RrE&Xgk<}sm_c#+6Qf#26eO#K9N57M0(>B=8Z+yNW+HR zbX8~5RbPcRAr(!0627sQ;u|v>ui#L+g^8o}D=2Nc%aAk@xR5d zTFqIwa3OVdb$w>e8*jY9*=L^(z^YZNc=_d*IrrRiiI0!xz<~qIm@$Jp?zqEadkg;g z4wV`+vAP?Xm=eI{(;@+ISRCwmA(!x}fh64;+gD#W95ifLL(NY=puS)_X@9sIg+keP z-O$}gMawS~Hmo5!a1vuj{Q<3aM8CWc6zdz=TvxZ_8x7gp~cME6GE7t8BFph4J!ZsdpgVx^d&|*3-z=g?7&!QA|S($&~pQEq*T$+ zwU?I8T%65a1dUF|k7&F*ypbA=bd{80tSCkkmq^Iea|s%M2Hv6JF3-pzY}B+L#^Ny0 zWGJFamq&-Wj&8X>^-doouThNhOD9Xzw7jN;MXTjbr*cs=C^!Gj~#CXr#^B zMS^cA69YyOWC^3OLXcabr>xFMh`)+4Q5q7WeF^YY(bi@~azc5vk)kpKMw5e-1TB-Z z0-2N*h@S(R4|LFcumfF@0i{MkK#B&xF&gAT;1jIEuCvlrX24i(#M){>lc>cn!ylh0 z3*DW0=nfyCtD+25a0uF@6nvth@f{t9Uuq_DFE4Ce2D+Q;Fjkjhs4PNPk%y(T1zU&; zLzoRkLNvjnvk1|qpj2px37m*rQo209rtVJmwwJQAwUAO{6DgWV(lr5u$!(~Fj!ttm zwVeg{DAdIGXArABgT|`S>^Q6=zf4bjw3>-&fuzR!ku+L^kC(i!?M{OYL#dIj-EB1Q zYDFF8L&zDygiH;>H&*SUt=i2dnznDCY3F8~7BhhvmlA&N1boLNxdi;_yBj%B^KWW8 z4v`soB}t*@;djCuw%ctiJGPOP)&~ACYBEkGM(_GsUF|S{|3K`Oe!iWIQ#6gx#pT{*tl^c#l^+Q?RYr zUwsI5jby$s2ZcuKa@{HHls0YQXwCOT1x{pY{QW58-aXfxP~U1MCd`L&V-xEebJ*Tm z$d!>3xG{PvzKVfnm(gTr`+*jI-r0z*%f_`AMsxW&5iS!8KnMqQ&DoUg+K+L+3{`m| zngnm+u8zlllnixLG{{_i-ooL)P*zCWp}n*n-Um(xVP{=P*f|&D9U6{PIN0Bu%^rO- z2il7XR{1d{D3N%T4289x8r?w*-A%*?Pa`R0I?(}H^v>c=n+X7ar5dZv$)5aH))$qN zYpg|z&?Bj>Ow`74Wn3B)f=0Pa%GxF~QK3G4-L+aA>|R^X?%gfq)fuq@V`F?d`>Zg| zyF3cT@n<2NV6Hc#j`49BV@J+W8rB^|cen}RhzENx{+U`LE>9qMS|~D=44a`70HxNy zSCR(ZQ7T%0p}K7^TJH#={U;L88GuyNPW!O~Saod#Wlh0*YzEO;7a)`5GJ(oaRwWf6o=4@IFFsOa0fjMT1MM&p(>gq$&*$O~rR8#@MbtqGqfpB_65 zusOQfRk4`rjzdfybt|di7b25f+cVg^c{O(>sa83EoOm^Ah05jn_p53+c(k2)&t~DJ z>gltox{HGOd5r)2B#wUjDzR7GMsRf6fPVfK_|_wLb@1I4bI8tb=RjdQkKB;hcfE&Da*4e(oKcs! zez9xKttj>$qITJT$e1-3pNPl-?K_2?qc#7gq-i5(CH|S{z)3D-(hGyVo1g0Tv!OAE z8=|Ljee@J$ZoYwV+7wU+MWgWbY+ZJ@G}5$V6ZJbbp!1U0nH7ROBaZ2j=P@-n1+Bto zpp4BxdD|X}nzx`c*O4A^3F#3taLP24)EL;Xqn)E=Iwm9sa^Cn*CM5^prIKT?ceAIh zoSm(u6d9VB9-71z5n06f2KSMPv8s!jO-(fHY{hSkhKMtR2%j2^Sq9lh+Sqfro$@Lp z=S&IVl5@iu9p&3cCS6q(G;Ul+%g*g+lT!&f^BjVwOhcj3;;=Z-9c-s%dovwJItUmS zNcfCEv`M~LR2GUG*HhBC5kH@362dNIbnuyYDYXN}ZtpVCc61+gyH{hVucc^AG`Xpx zn3_0^i^DUC@DA|!tc@l+E4J6M`d}sLp`l!NVKkYE{s`=pw;$wa<2vdMMWlyaz|@!< z@o@xD@vmy?H#8DeekI;`|vz&$teSZ-4(!B$Min zgKR5(pVaV6m^|v10VD!YZ`Scj-YRa1p2*oUe|*AYT(1ATqlryBo0#`ZCMsn=`IUZH zOwiO|f~Ev>V9}E#-Sss70Wl{x|C`{n2CaSi#rymm-NKKT&Bg9;^6=Y-`0TmKE_G}M zJKO(!m~-A4hj(y46W5wsiSh}?SXe;O`|ptQmuK-yPIY@9y}6!Wirykbo5Ga12WV)s zxR6ONjP`C8S8S!&(7=<)SCFKMaJg>n?D6!g{FN9?c79l2#QNQJWToxn`iqiCj=lmf zrJvhAbmmpkywgF$=4PTVk0kb{7?j$9lO|7J&3|fk(9qq^HQnJv?><6zZ6%|wxP{0I zuRx|8IB{LZU}@!O-8v4{tf8eXif;YITsvthQ__M^Dm+I580{7|Hx;n1F&C}Ehe@?@ zgs+w%lL$Wu@1Y8npWlYU7>;^rNmt0QR`4^$^)p)$O z)8?c-yN$~K6k=>`LqFvhqpnCGIrdU~y+Q^Zug&RTO~YYU*KQ_W9>HbJAZ72uJ1m+} zm)(qCLizw1Lzj&oH`TFjM*|m~8OGV?Xvho?chfqUZF&yZttPu-83FkzOb)n-lxwn3 zY87-EdgjB)WMZf&q2#lLXcJP2zx6)1V>j2D@Q(CiN9AWU8;ZF&pjD6~F_T@^7Gg!Pr{ z?IyHJHQpg%1df|P{u^@%oHzxg-@upIOQ|I>{1U3$_K;t{l3<@H1ZW3_hpS`?rUfUF zq>13&lC`v1jEwbJmQ|Segv-tvLrd$0tk|R>Ek2mgK=-Rt!e%6V zdMr^hBGKjPDSWRKg<6g_QG+B&lp5=Kqwqf*?kMG^m~(hw%;hA!)0LY? z={FxCSEQ8>|x;ea-cZzhp8B zufbRB+Rf!0>i&fGgguNtBZIKIb1*JZp;G#yNz@|A2Wp9S;bd*YVO}p-j=xgP9it|5 zUBX2~Cru#g{Hsy=YN=Yegywyl@r{m0{K3twY3m>Jw+j_O84(8^s=GDw=NYsRZ5ZFxyl$!o|zTm?GZntmW(df96L?8s@Mq{hg-R}I`j zynk*!QRjsaeg5$Wb6hi#9rq9DiwY=u?`_7-dka-ykjH!G)ve@M&2p|9zW|N5`>zpz z-Ra;T<(nz%YGPLEbp(59v3A@$dMlW0{!naGxepQP;(rUlx&-bAE~@Kpst>3*c%5l6dBAZe_8Q@xu?QyVkm&tY;PqanlL&_NT*KOMp)l(n)cc9r*_-|8X%k-*EnIoKAR5 zBr|UsL$H6(OYTHaZ`Kjx<4Uv+i-Xd|73gyHWIUIGCe9ZCldY4@WgpXKs^Q$|#|cr7 z!C$My($Pl2d-Ku6B{Jsr2aqW|o3i@uM%Hfo8yT4wk`?1QVNtuai)V9wPu}g~RC(LI}}qv5SY^I^ec$cZXGMyenH+I;}zoA!69=DsSlGI{ zJl@mc5aLMr9`Qr=-9m4!AF_|TT8qRT`#uyox++mnxJsD-rf?`+zo`!Xb2~8ke%J+DdWc z)h9*n+p|SUex-Q)?}x>lFY-i7N4HBoowZBotUb@d>2!*`h7IDI?0dz&s&9qeVe6?= zVi4ONJtVSU%@c;2{^wTHXzJ^3nW0%cm$Otnlk=mf>1scrA2s60tY^g0SDq8bin5;j zIE3h`G4;1o-zDb!Jx@G3`;aK9FbE-pa5!w@aMicsKl|?$#f=+;)7kTXwCZ)js@J)U zp}VD9o6sOoBQsn>3*5l-O{C!^b97w>&rBwl~!W3l6j zTSWc#H9|Q1=Z!-+MUAQ5MW(YzFLvI!Pn3OADV%oa$xR9&gsAK|BtF`Ex7by-Ty*5; zh<$&#L$n^)<+kpL(3$GR*V%WAvb_C5INY}_gb-aei+K3pKSg$1h3f@}Lzo(S=7Uae z6?Z+IEjo_B6DQ-qgZujCl+$4sdloz(x~w|4b$<(-b~3qb%_~A@HTIRg^yx8C)8w8E zDpuEvW1o}?A>5OR5JJ?gTP5<|nCtPL4u=pmO(xNxJ1Tz2zFTyf>W1uRg}z?gyyG?T z@$Ln})NUNIeqLFp_|psf#M&MGWOX8$bXvQ_GdYXJoZN3kyTu?JHiszrqFn5}YoE~N zb-J|Wj!c9Q!e)1hf4~1PvHXrdh`m3!-%@@ene@pyy2Z}2&&1bz?-AR+SS2>yn=M)n zcMOm{kxY8AtF=_zvF{7YO&@0J;G@l_YF^*uUthQ%WYM{iq8s zhlKvPIu0;>LMYn~yWiUrdszfc+3i?5tRCBon$fd@)bR7VLGK&kpT&8}&#)o)MNF19 zkM(T!E=o$@;E9L`a^#^bYdJJ%y8!89{P^(232Z;m!aH9VVYl}OqL&!zc>KsGTpB)+ zS2AuVP^Cepkdb&#JXtTMk^fFHH7n`{ZNH?}$RlqbM4ovLGv50cb@^WM7S6%isT;Cy z3Yiya=9>xn?mDWX*C2at9|2?C`wLFSS-}Y`44g*8#HgvH7wbzG#~E1 ze;-}WBdqz)o%q`SfI>EO^s~;|#VdI~vMIcn>0eGKAvl7Ak7Q#kF$^lVd`le*zbR(c z%rx$~HV%bcLgg1o#-noxKl5UaEO;D4RY_lcr_D*;+eI|}(!v=ZPQX9iy(9fZG;UZ+ z+y*b=Ctb<%rbSrnT^{QiEp4pKoy8?7&l2sQHE6qQ8;&7E;;P889_w^;TG@ZJolDP) zaC^OFTT`E}1i)t0qfmQxg8wEsWi&Mme7g8O@xb!eL~dtQUzxtkCLUYp-i#1Jh^loB z;^>E^9yJpogs_{>?fEJCu=4-9aZACz3+?F^{(@wGgl|F@7^sM z*7a+Zy_!jv*)HaOk|$pMBu{ji2bzt&FjSR@>{)k<`Wx!e{%w`;Fr@~d z?AuSoo&|G7TWgP|n%}%le170TVY2E6)V0{V#CHcD64fV|$DTBk5<`=ix&Iqsw!1f7 zdNq>|zb+B$w>5a|-=W9$3!A~#_qVPjR~-B9?f-2v=doq;#Gcjym-4@Ulp`A3%x-0z zcBj~U?|xBU+u)H*gb+esS}YDe@sMy>EH33IlZg;Q6gO@VYjd6x4rl-5vsm?F-GPVt zh(rh>EIO;`?y!j0^OuXai&hVJ-ia;yn#2vyY!pv!Un2CjfhK@ER4uC&yYJmEjCDq# zGu4Q0t3%BHI$zBGELWJ^_*R4vqN~0}?EmXbQSrl&E~L^!Oj z=0LNdRD7L%kI1cG+gElXnOOCmBIl)NM9~Keg}uAqH0icm#loVE;@O-ZMW?lATql!B zLH!!>pX_@@tHG7ntyYKl;Oi3c^t>aYQ*S+fpB^%CI-TOnifv-%{!c|sSF78x+D&$G zY<7+)d^=w_Y!1>Oh)<5*BXxQ2`EE%WMDT@B_ zwkY`EbFq-Yu zw|0{fJ1|H|l1V5v3TihtGwQ4`BoABkyn=$UcNu9vu#dnA{n@320E5YnpKpI`K(HnO zLw5tEO`8}Uauz~3*q%F!gviT@55Kstp2Olqk|fTFPGw`$F$xWJObJRDbc{j>ell$& zP}xbtu0*C~gc0B-$mwMGr}^OlXcBIS8L-sqs|q4D{35cezoWME2%`h1U^F?=`YJJ& zmyrAFi$q^_J){3{yUQwtLMG?T;4ui`&7z;l@QWl!rNM5nBh$dn;=iFK=OX|BAOJ~3 zK~&RfEM`X5>u66}Ig`sJrj83jt5GuVg91{=XbIAQ)oJI=@(t*0Cgx`TfncwJa{xf5 zlo2{TjLuvgwcl6M6yxBHFKc+>Psv;`CCshN$uKq8sa_U>I<*v;t%#s;(}v7tTfXFD zthx@;9(xh1y{D{qX*kq34w)opd*v5ohF^>%No*=!NQfqZ@zK}2v}4!XP->N&xWx5& z#ZFTFA~`QK$#VyU;M?!>x!{5^B#d@%wlr^P!Y4+JUuyrVjlL`&J9e~j$){{-__ULW zL1iZ>I+Aq1{yjKqFFEV?Hgf(1_me^!r>5ZZ3Zl;mMd=}s3cxQVjmjlopiNHgTP}7- zCIFEETW=Zw2Rurn0^vhsJIlnf|Wf{=E=F@K(`M z6fy;m$4_Iz_!#DXT0mBkKSBQP;}1@RPoy`>3=IcgE+I7|h+F@dIOJrPDV2ntc|NB4 zYHEM@if(5z#h=tOc~%-B<2*-$Dr72B!!M-8Sjw)7F9=sp#d=^b<)42<+FxfAG-0ww z*#u1}S^m+?FI^RbrJ&*B37)p&Cn_EEUtTenXoQ$LJD6I!~ z5Ip`YkI%Sz#lJAu*O2~~myqO&0dXb(5!xhl-3=7A?xfRHLzlIU>4^ik{hv%GrN(BK z*B#-RluO)3U-zP|y_@B0N_gO&v7Y<+eI=2XN23hrf9|@%!$=w*e52z|8JYYJ9I$c> zHnU6F=m=k`o6Q4uDfdE>NrYb;LdA-PLEDz(a*`f%}#5|v!Z6G_)1NfL>%8sedcE-V-tUhCf00bQ-^Um5I*;5s>8m3-1bvGe+OZw75IjnEx=v zdw*p7-xi^XA6)x_9zt0({uX|!*~^=yA22EIE+&q?li}o~Ns8C<#8WYRu&jj0>apBD z`kZ0(wFhf{X<(_&MCPMWw9YTUTx%LqrnAt%v3UiIeKox=XfWxHCy*2>O8@EpK(U6+ ztI_4>koNd2B>CW*?azz5i)Ld9hw4{yNy;-r_Qxp%?-p<3$>fU%>>WB8D>l}1*?Hl} zWbU7<5CU_J3H4}SmvWoY;1bS%DsbA#MCFv|v=5vBaS>`N8az*o;0yd|+|k;nEqH=9 zAqoHVEb3M+9kMSvV;R136`eL6CQJK}^%atgIT<&xuHgvVTMAsREiT`H)nVf=N!PfP z$3^)v@3BnY_`HC^3cbg+>srjb@X0YAxqb}e#|JU#t#LGLY@*^{)kF3R0r_84&|Vi$ z;I`_%r5_B#yms1arOFqfBRkp4>MI z7(Xu)%}Fm@@*RJ{Vd0+1imOa~O+_s*Kr{)YvB+#>R7G z{xKwJ1~<W&lM*aUjnRq#57;FPcV?uHuM@l+8%1KIz zsPjXp+1NDXJ>vd!4-FgF)7|X3uG48}U-3Jfn>L%X5+7w#{;N2JeaN-u+?R5&v{?qo=t~Ub zzEQ~d*D_spHTOZ1NWSYS^yLNAZ|gaeS6^C4)ldH<^RM%fdkt+KIE9_H`Exlx@lmcz zo6XvycW^j8&!fg}J?k5DxjXL6A=}=#qmlEcg`gN@kCpClJAo4hZkw=o=~15IrQzQN zndseUCXl~~4hS<>a3Gf}msGu{5 z3>e3OiZ6#X27jfRS2J$n&B9geXvt@FLpHBv-hoo)`70J1sb#?!Z@kP+`1_AK*~G5)nox~fc+eOWo6O(6t_-YUXwb};3YbY#aJwZ1W<89VDu z%D(=P)&slU_QzqdaBS`@{E|~iocRcnB;oHJ$xY)Hl3o2B`HdSqj-|M9Jx8kl#g*e0 zqV{jnVYGKG?i z$6ljh`)XPa?4ao5zmf6OoD8p17bh2-A!qEp$3NtCo1I|54dCW{x=* zFZtk3c_9QVHr8|9rO|`d>p0Xw;KYI3No-vPwyQ*kt-%mzt|IwC{;_jxQGl%+)!N2Cc zi1rEMp7`m^EBJ{QQ*J>mA37i_KH8U;9!TevkMgK%He?PMed7&!!A;&UuG~F>dzTRQ>ohE&G0Px#lpNIQGi(1W!Ga z(YLw!iqxt=ZXEYE`HdUMsarmvKY4XOQQY`5SB`rJAC;@~^Uk<4nHCh!^T&R|ZNs@T>!JdtDA1^6$(NGpIEvLG{#Ow#tQMlOv2;iULPux9Y z$b01|j&290Ix{(Q@)-M4I+}Q2w=yR};iD$yzUL|Y$2{V1y$_#=!C&BBRCgSruJb6< z;_m7zn>OlJO566(+BNVj?L!?^IGj$V1&A|*6jL}e9JJ1YpsdG~dWk1#q>pqDyAEn}}e;^zus@{U^l6RS$ z^f;2#@0FKHaxO@n#muhX6q)ylq~K!Vm1Hs3M@JslU_(g^5C3P`UNm{)|*r>{};`B zwgKSi?&jE>7YM)b5@N2o!L6K^!k6o^7Es!{gPgh*edT#|%c*SL#f-5FP$}Gh?Qe{k z$i?Alym0I%x{qrpTbuLvzIr!rj=h}#rF%J9G-QI^k-7gCJj%`7Y+yIUw=f*r8iTv@!vS@Lz}y1TPIsf-eX4U zEMzClBe_h$jN~U-SMn|=X7+UmC!bdAuR~_iox@c7)uRkJUQBh^OPUq z`nw<#Pneh-$id>lO&z~6z6c@ES9%U*?uAcOG(l6(qH|;a7q+}{16rRbLi`41pYrpG zWWwm%`K9QsA=_SDv4Qac3EV&CB9gU{d|bA1NSR)YO%5P3(wnj}Bj=3^9hQtFm&kf4 z4O5Mo1GA3NS!!hBbDoK$7fP)^V`sfd?W%v%xOE*zXFp5CrB@Jn=@o;@Ddb*UoB28= zt=lWCud9 zvFI(%82zV#JF$aO8~ep?tE%Z?W}Li8CIWG?5IPnmUGWF@yz}p7n^-} zT8$)=@ShS$XP%yzvx1N*hWC;wHCi&Cd!5oRKg1_ChKP$U8i1P8{!_sZMo_Q)7l^(b?+el^|-KT=N!a6B0oB|OBQntx$) zSkPHb>~1UL52J>6ROixlb=-9M(59B|NV{8qiE!AFhKSkuE%3V_6F-I8?TSvYzZdO# zD-P%24%YCgLA2#{VmA%GasWNf*ubm)K*hITQe3x;F%dIRxk(3jBF;|wGkJACVX)K> zxMs3jSX8ot=TmR)QzIow;^mAR`LT8%Il6(i@`=c+(6eSwBTwI!!d25F8Jiry-@Ygs z*3xLpp$^KI*K^k5Ni=P1p>b>T&_V!0Q2zNph`#hjObwMZ@7gjvIiRw22YyNoa)pM{ z)}dEw)fVK)z)qn+LLd0|JI$Z%wW(WBtolF_$IY$qGa0qPeR#d?Q$=%lFnoQ|b z;denMTBRDj-F<98$|w!R)q@9kNivDpOCqS=&^WC7X{Ju6tGa^9BdbV`x_-#|O1YYI zQ=Vdb&*6g9ih670nr&to8JA( zlC`6a;?EY6_U9Lo`?&gXyo1Aux%hg@{{68_xx;B^Q_;IzobohE`Ouoy~&4(qo!a_M;yLuzD(B0bs^_k>|L>QS8Hl^pn;kcpqd$0ZHHi5Q<0z~Nz- zI&oJdbnQ(;hHRtHGkh%wy&*-R;!*XBd55P8RHwq!wHu# zH-8!SlR72@yuPH6J7$b#R9OGyl_Yrjt`v$Y4XpXaeZ;G!!%Fttd?wFI!~6J`NTF6R zVSXkhpO&M`_51~{`uDd8n~gDdKLCI#Ac(Bz-=OU44>4AH4zQ~2IKYwW@3<^;J}QM8 zl|s$6nXi*w{ZFbo4tSI+F*fpH+0Xnf>ox*aJvRRX3Fl#T+WBYIK96#_rJa1Xw48a5 zW%k99gammp>#;QEzL$?q?>-Gh?dk^f#Rk%!N^uFkRmb`gdq+Hl3-Sic5#ex<|M$5h z-1!K;qujsbk<+ij+R;M$(f&Rku3Ji!e+H3$1GAjDgHrBIBcr)MJ8<>V9fW`lzcg~i z1q1ysCqs9*gMjhw{Ux?8Jxa}~4OoNU37Ke>Y7A~-O#sFx2Xc4_CoF(ct3W$iP1_(Z zQZMWdGqvg*{6iCHKj3*npNxr-cT=U?MXRA0i^IkzAFE>&J0dsQeZs)XxZyh zzGQtR(IGxuG-+Veqe3q6>LVGf+*VJ{NwGFgyC8dRKFPO@A|Tmyf~W#ijDIbIytj)m zlnvB|nznADGxsP-k3Q+L!OSZ-l&t4pr|{!9>8c%QmbDlP*oG4l3TMZES{CINn~ z`+AbcXu0j`QOsSGkKN(Q3hg;MYFF1Y?$rz=H~ypWiz4uj@}Y8xtJYVwYzcwmrVu=F z+5njok#y&il>P7z999cWh9WB3_A)j0_CaM%#J;u)yfjm2)a}9Q^c|KTt%>?MlWojJSZvrspx}G4mp-|Pll`-KnNSyf?<==dc7{<~c zfLx~HywNYPwQvF7RIcNSh{*%Y8+Z6q>^U@A4Qy%22YUP@d-L0Q@LJFD1!^A!b05v% z?@LOlY3x_ck9|~1$XI`3FLR$1$0yQ~F8^D{pGIF!vw%%ziMP$Po7trgH zg^NlUKR3f;7JYz(2a{;u+t%klY2LjBOM5G^*AGn!-ofESoHK)p6<@NU@C`0XehRs4 zXuk*aegRKinF==ze#q z$>N~2*2vg|6Y?`0KkDM-y)TjktvQ{9jCH?$U){0`bGMA-m@@#-CZ;_8sq&_RRCBqlcdS-XY=mM8r`3*&7`5-^`Tc2Z;)t zFr=K;D-1vH2sRYI$?|F=_hwzpxPZ|^%Bkfl()=QspTCy^_HhKzaXMVmHT&AG8trDlgPKdAjXY}LRTE?dbl62DX74D9@Xxi9- zHqj4XHyiu_+K=u<9We?;$nh-;|Ennopl4}#FwJCqQUE!nL;FntVlE7$Zfgs|;odAN zYgkQO*oA$6D|~&4zUn%v{{8K++CSJ{id<4~W#$}qmb{DAgRjRODvF$pZck&6&(2{- z$O24G@+Q9C&X!~)3g6+!3;0jbV72T5#T{tk2T8bd68zFLX-H8LzRFCrX56slA_68- z=!hg)yN|K{!wW$NNc0WErzn<|sTEAf9R3&7S1sozlq{8Ocn|VrJ{iK{pe^rX)X|BU ziigfC(+jKJ#Fmo3bHOFAA(Lcu=4TH}?%S%pTpvBb<>=Y5{#S6gVU^qZ4u@dd-WD!A zYj{bXI*;fG7$jGX?f<3K9IevF?PkAT1pBGb8HVRKk$cGrofJsJuGRt94CY##!j9%7 zl|AZ;YtS7zh^cPyz$PIC-`8&E!Gy~RP>&)b>U#E+elTR8peG^IH|wjJd&P9d_=fRS z<@RC8At3kDGH$;)o-ql2Ec|A8DFKAjNzuE1BjUOk!lsYm*n)x~H$+0u7`GKJAYjVH zM4x#j1@FH;tXwcoA$YxDIb*}GAk+U`HWa=w?E5WPT)<^9sazAA!fWN5a1Qe*r~G${ zNlNzPkAIBk!_S+B6`KQ4`Jb=Qj7}i)m9we(x&nuOcs{djrSCH?>UsjzqZspthiF>2 zWXLhrnmRbFtKsS>S5gjEj>0Z%w3`Rcxt#}EnLIXdz$Qj_5DtO0(|vqNFYNy>t>*YE z)B_SEos5*xeiRK6Z_1;-KF|?c+OUR%$SVhwOEMYpch98!i%$k^cU$W*GX3L- z@##?))1$A!Z0n$M7{Oa#t*hj&D@GHjRqFnEgBbQ{%&A6Fwt9SL~ zKyin*qn$MDY$N54o|Kl7Br$7dI$N@v*l}o}=GBX)t(!0utl?SI!Sd*r9c&`{Pvr4BgG_sr-t|(q7=i;Fa);|3LHRA3SaZ%+b|ib=a8@ z80+?WYRGg-+IHh`_OI5JR2cB_mJ{w_CF^A9jvx9y80;n^@>6}x1-}zAkt7Mn5YcAi zlLLqCHvx#hI*Q7b{Xt(fEjx$~J`>p>IYyEnd4keUKXAKLyrv?!e9`ZF!z zL3WBt6N=sTLFN zc!=)i25Q$W8z8r=Hk)>dm0mz5NSOwPQl zYx!q&HaWV1CO}7yjm6?pQNG$}XIIP`Z^Tl0EO&k;@b$ z2AxS^Ykx|JHCr0E`eM&3XD36K<2hKZe+Z|3$1wa($OMMY6dLTOqGK5Qbb1j!Er`~m zI_##N2~yd-i7^o~29@!NiY9RUBN*aQTf3Bt(_eK_Jb|F`bdV`tYKP(H}f;E zV`1?|8qEEghM~+z{=3DDe=V~o8S_bqjZ*W+Yh!uyA4M+Z!eJ->@2?Vf^WFHy4vg)Q z2PuiVE{2LP$_89JRQn_T-qFMdyANm!z2HXbHm|^8be*V*WwLXusFP_Pg3nHda0slr!TlwGOMv33#P5bo6p|eK5Gno=W3-gi{D1A;cVN`@ z{rK_c=l00ulFQy9kU&_0fPjE|0d8#(TSsfHT1TZ0T-3Vis;lCzeyje}s&x;>chO7k0`JE^t;gMcK7rip-sAOtz51_j(nFF-WS*W(GC_A&bWm2^ z$vLzAf72YFkk6!;Y@XQr`GIjw*~itW3<@$%^Pi)U9Is*VRb#pD#a&c4bm4K>+5L|P z7) zykQq#H*DwLalb~<&xur(LdQAdA7Dl4v(%gSux3jW?|)sz-*1@Er@8x~QnW^{8+8&7 z?EW0P$Az`3i*5JqV&Y%NqD}HY1vve?Gll?#!aXh*k|Maox?d_{f{7uRb(7o} zHtr4L)aXw}oRdoB(mJXdR+AndTpLS;K8lPB=2P+i{tp1V$H^CU8#p(ug?$BATTRz? z@0J3^y*LGeyE_ywTHM{;T}yCxx8m;ZPLLu23dP+exXTxw_Xm7y0gIfRGqY#=?3p>& z8-BJ^dW7=uYx1r)ao^ra@Ak#zwfE4<{qf4L9>P?UiQ&l91v<5v_KrYb{dwhDW~Pm< zn6W4$Fhs(6A%UpUw~+VksAS}8kP1Nq+jxicR}@rKR1-?1h9B{96w7)_biK=^-Br&Fg{#+rpZLI zq~ct8PVmZ0Wdt?nDoVv#*wSLo?l+VlNWDJkVh4NH?G%2#L-llCOSiGC+GvXHE;w%n zj|Be1fx+b(8=;_~;MeB+GF12Sa~s8Up;^Iw(Hc-G5Ezr(x8GUWpmMR!lgMqV%cHCP zOmfb*f|}WhW&4bsXzu$<2m85alTcjn))l8&e_85J>xLUZMH(-%8gD@8wJp9_w*%Mr zubglfBP~@#+9+lD+A^p`{3k1gu^`Kf$?I)gMH4_CS`AIkRW_+EDQt*u8{H0Ur|eA& z!qm{dWJnwy{yhtuD>>Jm_j$JQHIXEg_6eJeIt@1|pe588iPi=MRn2>&okE~~Dstda zmloXqDzio;od6hq-sQYy^o*Lit=WBU+>qe-P@ufGnMrhgjK#|H)lYpS z<&fiq8Ako!%Wtzqa{w1)r(H;X_sraV=4hY&G_Nwotb4_essW*TH!UbNd10& z;^4w}mRPS!XY>X1nlldfu>M?`SRj|wOB&Fn&e zunML5)s>1%jys#y7B2ViBa?y)x9E#naqGgB?X#(HQ^`TR>jV6l&~kJ;d5GhvbD*E@ zQrW)p%_a)=3nXh*IVL7(&XRjAl|JJ2 zgMZ%1J$WiesnVUqY+%|=u7~`a!{??d^u3d}O7ZJY%RDofFZ8J9X37-*X;)CzWS<#I ztR~4O)3P@9N0BQIpY4lkR6@TbrP8gLX^&iY3fI|I^q49??*-Rj>2+z;>WvBA`kO!d z>xR&OkgMdT&NdekRHm#SQNmIZe@x^FT?HWaUD%NWZ}3BFCg$7uwo#7*@EGPp&Y(0N zAEmD3Y@z^X8?6@m!sk=<`)yJG!RV}-ZqyZ&B1ugU?b6Rh`J2vHMQh)k-6*N% z(nhC0lVE*t!*>7XD&JfF598W;sioNvsWEb3+O$Um@Hz2YG0z8OP#Uywb?=(!8%>Aj z3l94oDNl0rVjN{+SJB_z^JZlkx}>ubvbePiG(I!bU6g5j8gbyy^2|-1xhtp9NDGz1 z9umdGId>UNJ+Zla(~=R#^Um=|b97&e6j|4$GI<>2er5LuvYr-J z8s3_AO)i%jB@tfj0IYg0R(FmYGUR*|nqojGbRVjsVhp#oK&4ubf=%nU4AzUYfa6hZ zM6Vn5$tVUBiFs3>dSezh^>wDWYApf+`{m&SYe@{DuBX5<_0l%?6(0UhZ#+|+Hy+MY zZ+E3j2!(9x3#rPm#_MG$|C+Ye&}&9-k9O5O?Y!D^W+GGfNB54%W`@4E991ptdoLA) zf@WLPM-GA4j>ZUO(3Ig%-1teiWf>Tw)-tHJWfAK-jhrOx%hyTBt+5 zEd5CcwfC@j#&i54$MftY30*SViLP!b@5Yfzfnr_x5rHj)FcbH&UJm z^rhhI#p&czZO60unU{_p=bJIpXGCYkXLf!0Ib2VJXCGp^$0%D{U!j%BTTV9tFCk-` zwI%cYVrHR~;M5(bW6b4$x=!cqZYAkO%Q!5Ir#?;?@+Vh02wgy^63!@^m_ZsSJp7k{ z{tZsp6&bge2ZQU6mCNN(tjrhHl9oCx5xyjDRHbbKdN~h2zYIO`dhRe`f~}wA*)B1D z7Jj?o7hG{8Xcm3-TXJ`=bp&$`GyWNH(O@gXs*2Z^%$r^VjXEE$$Of?CikWOxO~ZPW+0L2T|ad5K6dJ_WQmzgm>agevdxvU(s#u_vko?BP)@ZwM2C{ zn2M^d!osjFX617i%E;nHuPmw4H&fNJb$$P8wsKR$nqWR`h`;=_Os;EvM4X4^Kl(Ty zXt_lknoV@aL}}eugbR|pe#pUeispCO_Q>&W0Ae3!)cwo6w>g%>GSii|n>qA@=ocrk zI6Aujt@TBPY%W%fm)3G#^ae#vUn|$BRL?WN&coH7Fqtnz{=EFx<4&H~w^ebecsuKB zXLETdJJlX^*SsQD(iQ%=8;vEPFTE+c9iG174R$b+za7-3M;K?y6V(px&nYhx0LG@Y9Yvdflx|7Fd&8%Fxc>2T=3-;wfnHZ}LZGH|V&~6#;vv<= zkwStF*`=07*H8NPEsi3yZx^7p3*n|hTy(BLy!6zo zvrBDi?XFNMf09_nRsU|p-qCPlZb89RZ+E|l@#8$Z2Uh6ZwRez@L^yGSkITGoF_uO&QPv8oEp{PfPQ{Nw4dw7&6!81!hc@JKkGxEEUYm{F!MddOj?9<$7$iF>&I_ zetM$pC8{o;mljVB-Y#~HCA{1+Q(md(+&ErxZ^Y!|Xm!QYmLa!Nb|{JcACK$CsFw%> zz8d^j92H|~?)ckatEi|UjCJ@m-dR6VI-Mer?co<|{!-#MbLG+kLwo z!ClYQhexpS2>08%5*^(f(bWWztI;FR@#_7hM z72OxH^2@(1gXB{~Q`hLW!RnD|-p4mP69Tymcl3q6?i;ILt&@{eo?LdgUNUB!*Yj2N z(C4N&g^XznZo=sww=AvHeFxHx&%R@CzkQ;Vsy)bH>3sG3+=RS3s~fv8k?Kthps`}# z_9gs~Y`tqjKa#)2u}+@Bm>NhG(Y;sA;_SV&qGH zr=%PcUDD7GEa-dVlIxfiscXw9D_*-1x=z;wWV45kap|30Wo*5e-7aXSv#t6MABoMj z4IVYzTY-!SIq3*U)&>TTCG*%})|#V~O53b#5v8M3C>}7Xgke_4ia9D7U#X~~wFl)= z3CI8TjBP?wsmnetRlx<6EMhLEB)@@%B7MiZe~4*TW29b<0eDQZea9D<+Z>q|cXi~= z4UK`;XX|00?cLxWc~YkFUzS_+!;GDo3F^6d*U?`uxS!;ux)_P2H&?4<8<@J+_YM9pQos`z2JgEElI*!A zJ2IZVT1rWboma}l4Ahr>M<2b898Vh1edWJor(sX-38FcAzEa~rAvry2n88kVu zDfh{q1+7a~R(m6GkS>g{x#K9Qt`8;O*%&-LhJ3ma;%rKBUfuIAh^O;xK1Xo6h6^2H zO^)icmPqhdCic#yGrZE}V@`EdYVS$xNIBVfaF=O&xCHC4`J2?RCO!TkL?H1&X_Fq> z8(JW;DcTHf-$kzMa{4r1&R8s<>|x+LSU9oMx$^W-cj>B@{Bqn&UA>?m3KG3ZC8_hg zxG9|IitE^4{WWyDv7W3Ae5B1_hq~l#*Okk;HZ%Tl4G?5u`x&IGTp_y4+gQZJ=L3A&TLOUlMTj*WfrH)s2!ngBT<6dB=^h& z8_n*d3rO@;o2g-?1_{4oifO`#h<=S4BUdgR`A61PyJC*k1^W{JOi%vRG!s!&3@LA0 zKHgk@WXOs?DVfax#Jj%`&AmbB@E2SbR_?ug1r}+%B#Pkfe#`k$l{G~sm7SO%hP^_ zN}bm9StPBT?y_HXJboFKbEh>4=h!M?rg}eN3Gz#$xWR(6O6(3CLyKTgh60sl;AxP zJ#lQK_IhN&3bB~k)1S63wNg21b-mU+IVs)x8-eZ8-kw$&Kz(HuGu{<~H2V|o&x&vC z-13UNo2Lx()W4YW337Rh+R~cO?}| zvoQ_K5<%9O?e^binXqcQx8z_?SS0d-urV4715{Kbm1*p|>}8Ykasg1v$7dFMnRdO&apx?jUTN{8zq60CZNCvbk5%0<;##sd9YJ~NxpjpTWH4#ov?H|`xc)ZL64 z6|V`P1gpstlJmGiN*c}=nGBI2{@`9-{&#WLgRae-Ub(I(A(;xPoN@$P zuB7FF>bKOXZ*~-p7&e|RiFP&D=leCMh^5xwJJVyT61Djnz{Km z=)prJcB_^~Q_ikjzYZ)K50)?ZUJ@UlU2bkBOvrQisHffK7+mL(Ma(-+pC-d+xeSh3 zKI$`d&6}oEkf008#2*h^H_4ZKrLpjsD)gOlJ5u)*UDRgEiwGyDrGxX8xDBvOl`R{r zuOW0^)RS;?1$!t_B%AYcJ6@B7aX!4dC;vKj{<+l@LDK5E?7hNwMrf3z)hlB;tL0be zlYO1`5l7bVwzsc~uV#GzwZz@=INt`InLq(Isq|;eW@PI8WlONRq0*sc%Uy0xoYxEw zR?me?jX}MaD5gYUy?x$+sJ=O_Xq6|EC3xFQz>WqYmY6TRHf4DXr7=@sh_I*+plDmz zk8jeWvvCjfP_wfUS29H(0Mn8nZ+m*-=-LB1rA3k$ryat4zdEH@a zw&(sV0T}+t4P)^q(`zBn7G+2|^3|xg+q5_oBmpcOF~_8T-)lph2Dtena%t1vcb|Mt zN#z&yyF84N;|-*Cg;)Y%o&~)rg_@I`w~Jfu<)m5VqDhPusGOY6L=p->*Iut-NCIDT zGy9ZfXf-YuTK%+RZ7j+*9^!>AL*I52R>}i=kGl?(ScMa6=T-7$Ci?B%ulyk?R|iCx zeOqrnnr=3vyH%NwFp0y-$b%%Q-)n8@P8pC7W`WkC_z39OvKVs`^DVbMF%G4gpD$LP zr>cBW=Ki+WQF85O`RP|gt0!_$1q;-uGoQus&{t_sEz$%W|Gf6NTs87@U$k*5Kv=x! zUG>O9*($jcKs&hc&~%@Y$0#0*bF7D~<_sSA$P>5=iI3}1=`<5-j>zsBxtxl&`} zuMl(52FIw$d}c^FvmJ{Mr((0;5(=BSo+SMN9!|(Vog}nSN-6JrSE^!pkXegUGPT$F1=YBjqqe~gkHn_q^Dhry6vs!K6Gl3xbi&Ya30n{f zrPt=JucuDhEy3iZU>{`bo~9v@y2^e(fTE-Aj>*_p(B4(~OO0CPE+lbMvSV5ltn5t< z-H6UqL0m?aBYt|P&wQD0?Q!}dy_b_FqEnf{82M)Vc#=kAQ~i*&sF`}})#)jRnMj-) zHGr|AN$zb;Ui@Vi=w(MOrp62&gh^If7cEJ_G*?m7G^e0zd-}BPwCvEA&BSVr z+HY3s(VYD^g_NTDtbFsF@44v{ZR*c(!FsVnYd_?cakA_PIL!&XRQbzT5?KzN6=;C> zTKpn-?BRb#x})$GQw`lUE$WlNW>p_ErfH28j@Stk+kR2Ie#A-5{wl40xz7M`P+lvG zntqyu5pcF6vw!Z0QGe6!gY1($Q$nB>cacNsa$8$|wR5^CX$IL3rcn{Y*vO>_pGX=b znX=@DKsDPrUeMF0P3O;_0s`aoumcBd`wp9l4jhfE8h=NqlP`>twz^d2DjkMW8X}X? zr==w+Hu3^13g@@)rM~#|G{sl$obBX>+}Z+$@8#KqvSdk(kBA<8+#!@^YZ(yddw=fC zfeCAUmGk=>IPI_01<|rzJ2X~3&sh^KIzNYlzs7q!k0$vqi7gYeu@Mu-c6CGAB|&Se zD*liEr9`kw=(-B9V4@Ot&sJcL$nhdG5%acNFD8LEzwu6^x#+eeyI|*xwPOa1dTHxh(KzGLXht@w%}%dj_Grm$K5$0T;Rh#A}N^ z0s7{$oAcn3JN&w+cFx!;E_;)?*3prV>>CLtPDsWj7n8FPN6YN<~&JexaX+SdBaP=)bnwS{_>R> z^=d7Q-n%h_FtKl3naSAJ8ILKYYH-hu zm4h=A90Fjyp*-r~wNTaIIdzxT^YKHiNq+7PeJH@{}_xkiE7^)=p8S~&w$l9Gx z@y@ySL}8ekLaQlj$&7%;5g&iqomKEE;dhO?scpV%J+`qj76s&lYGH~8?-%qAp);$! zGQQ`XylDaHcnZB=^v;|G{-^o2%U)WXHK4V*Fj+>?%$#6SclObetN=!Vd%dQ9CUPkZ zwrxpPHb1~q6~oC{sjF;S6pca@#UUUQ3?<#cfeZfVz=*XNTj6?f1E$_hWk~$#JJzp9`MY?o{jiJe^y1|8?$CekMC!{`&>^sX)Oo0J55 zi>=tZ0hfLhFx-o4{7OW?d@z(`yRj`AJn-cbx*IyZITyVmHUmYAS0_NXvVOEuzoco%yB# z0H2wRD~q?I#4CG@6uT_S0@r{u)yHMo!3lI-d~qDyHP9z+3nao zPv;HMD7ZB~-dq6!zi$_X002or!K({gV&3v-06Y?9pPCNeN;-(L!KcCdd*4oEd-NZf z!&Q6{Xc_aS+Q(%S|Md=pjMdW>>))k5HdJDouS$}I-F`}JrOtJ+s!CwFG&6hxLj1vJ zXwmZ}sL#Fs8irV3r#D5{R>u`2F>hnjf5zQvN4h{Wq7x^6aW(Y3pXmF1(TrROuxh<( ze-`B9qM^!y9`rC3*5{jGPVsG8mP+TUr9pAoPea;mBMj^1NECBL%G8p9eQxJ2$e`9` zdph0NyIHN19KRcme!x|Nj`b(HDMU#t3oFWhs=By_U^3C?o_@$o&DPn>?(@?=NRBk9jr76U1N$L?WG<4#I0jy7R9vx zg3TdIi0xtTtN9`!|MN^Jp!DzI7Ewzw)p|xi=d7G$@aNQ_iB=$PWB8{xIGm7{6Bhw@ z-F1OWTZ`rfS9JnKULMUuFC$eax3&5&o+XHnJQd0O$1X?e{!$`+p8wUTU+E#Yvqk;W z*%S1Q`Bc|}qI(@)J50p^TEvubYq;wSEgO=+4*uQWK_jXX$t|a_%Ze|wq(uJ#gRwm)n`vTXlM_D&U|7%lX>*h#=7 zckuAdcwTP5-iKybf?G2_yiwya4#??UTQ~QTwgMj9ywi4SM5_T=qRD^OO7}A+YvMjG zf~i?Kqim2nAvxNkQnMt%qIIQD5T+V32I29>I?*RoG9>-tLq`i`R~6rl9`;h5D)C$v zjH~YKmu~gZgf5d8&P?_JjdDIW)O)>7;;A?)5eXgU{}jft{s{zBOp%ng8FM*?)cwgq zL;X>?w%6k@b2q{Fl)d#_+mMc}jo)^(veAHJ4S%kWT1MiT0$|Jq}87m)+cU#a(@air`R0d$lw$B|9lqa;YKu#va@JUYR_@rFC zMoRE}y$%-pYfjqacKPf1g8cy7<4NTbMbF$HOyMyr#Pyqhkrc_+7ys1g|d361Bgz1fCT262L z8QK2Jdu+c4zh;TOEZKVr%r~~9%ao-jv3c(&7vc}2Sd<&vmq}uB)kZBUgh5$JOPic9 z*^6B6-Ix~1LNr4H*N*BY@Lckxv!ydbJyq?4f~DnmI(77tqppeD)neE)KToO_eb$hE zu&BFa0jHv#hcO-^~KF-BY&yM|T!vX)Axmc-4|Q~LS&jv!*md(k%| zkO_ajttP1S&$oms5qh$~(UDTDG2UaKpI>GXma@uvnM{&epXh?@@6P#tM3Ur7#YNaX z01N-ppT#{^Uug`@;TR z_me+FguZ})Fa3NPfTif`tdfA-#;)RXN|fS?t+! za5Lw#DuR6Suqul3uErf7&rQ8r^v9}H)*ksmpVtnS7KzG8ECxVpoo&>x9=F11z@ivs zw!?6mIX^{FXm9@rP7h{WG|I8KvFJw9d})m#=^O5J>Lu((uCP3(cV3RJnhF-7-74l{ zu$aF9a`ZRNoCzE+Klx53-R2P10}7$Vt*CVH5RdVRP6~f8i93g*Y*nSGJsPy2KQ9 zX7w`;xKE5hdF$58!PEB+pJll`eE#7q?pFNNOJ1HHzMbv&x1da&B1*?csky4lE;+&y znUbQ4rTtvbRmM(YR94gb1Qv4Mv=1gn7>nk%Cs(bYZCC)H%zoRVWnqA->6n}A^dD)f zs4#qXW8zf7UdK-#JIrywXABHt68-9w4BrE#=ayz71auPFOXNcv`{T@q1$T;ZtC zYHiWfw%M^?Ph<_`M1OQBoeJr;>P!Fckt}zXryh^x{alIz$!U}I_5F)Sl5SGR;j%zq z>z9ao1B|LULnVnDsVXjaRl_;+JI~j>W+f#KN{qReTmVkck0MTre5oIKwm;XIz%ag? z6Sw7hu~3y1w`I?ZiXbl6zNXm<{L*VV8tkLo)3#uot?TNGqu=G>*|bIAm+iQsu$J>J zNaqpns_g#Yui%U87CT6v%f-3M`^trFmL(J3EI2Mer`^{oz6DG!n&(X90kX6a z3Or?F$qQrWpXO{#dMjOSP8p{}&>a~WLNRHWIhj~NXapA(6{U}lzJ#_DaKwpH2rI1z zJO#6zH*iKEqCmiLM+MJZh&c0qX_@@VOh=p_rgtrbtD+8X_NP)Ab}vtq!8BsW@|z>S zr;kPi_gSUaee)K!d4uESCFwr6R&;-RXl>hU?Gg-;V;-HS0v{a|4jB%wsLCZhZm=B7 zRZ%qZ^761air_*N&_tLVm!zOsh{dX}!vwQhx|p>(M@+LBA(8EYaznpIC>(O8!N=Nf z+a7i+mt@BoZog*%n>Svb=5NwDOuAzep8IgBK3ZrY*ivMW%S@V=sfH8%TSmQ_R9saI z)uM{U%MlUQeMa~@B4V_<&qcmGjE4M+kASnaNBYAhF~OBb1fEAg4$X67sX7^9U1N9| z7NcLvjJv+cvT@7CkJQpTHOI;5*aDeJ_`6dg=1Sm~?;(r+?+n3Lm_K)W`C(MQ{e=$ zPhxu>D}7)%=vZuT`&aHaLgbwU!WIzT+46z$zt5PN1=!JJSZB*#cU9x*h*z$DFoPOY{d1QnH(8MarIO((`xTj>S7g*xH>gnZ3~^Yd(B!23}0Ogk-)~h4+lD6P18neWS?$!M}G=YWj?G`iyTrHz7Lm5 zm9U1X%0#L#Aajz1+5CNWx;Zk+fv472II9*YOef8X@bP;kB}0C5Xs9Z4-M^!0YcWhG z;SXV8z^vWX`hia=a)ZIluh%#PYoG&r1jV&$`O-%QhmH6{2&Kc2#X zIJ8Xs&CLm>ug5}8MC{}s$Y#Q%5BM1hp_H_s@1LENG(B&D%|i*?&~M~r#aIx*kR6UD z02QU`jYTqbhe;G{)`5uM+nCONp#_G2yT_mjwa6^AZZrr*wPLT)2q6w4k zaDp}`OQj0)8u(XQSom2D7|0Ce(4HgIsEBy1DFt|Wc{N(>bg9=dK2%f*)Au3(NrvHR z60l|rlyr3dG%e^6jJ3e@?%7CIv4=eSLdW%68NZIVfBn)3SJt^xO#0%haF{H{8vK1! z5Pg~lKXLBcTWUSuGMHL?n?d*>mhmILQ!stnJ1|d^^}@&V=c}pEBU`A1r^9bBgb&nR zV6dbRG@0W^P3ZMH)3&yZ);zYO6}oKiEDhtKM)ML8q>~u;IS~l_Xf}}{E-4Auvf?CD zx`tCxrD)QFAo2lxbpBNe;gDqoMB<4DE7r z&<(LjdnTLNpR~B@)DQm%CoKLJ$90!{Becv{adhF$81Olo@y@MC*iRNhs=6Rz;-$ zYbQd&uy^kWX}pP?GtFgj$SeFCk_xx892r+yn605OZY{Ozy^|a?oBZFW)>39WR7o3V z^yPjav%_lWix~5vxU4gb;YNSDHAY{b*!%y#2R~M#a zhBwGXL0z8tOogmQw$TL4hYnG8y01aGbUJc>$l21kmlf%Z`+W(3%=CvzEM#fdwNO0` zix2AzqpZUMTdPLxhhr(dc-xogQ(3|GNl~@^CrfbJdUuPs^GU1>@-4PMYVaJPYnoJ&^xX*kOz1JEn_-BQoaTJ^?-K3_lcxZN zL%os+e2}p>w@9FrORK#oS_ns#NR%v;n!ynKltE;AU|M3nb#d*b9x3&(jH zn+(XA)516~h3|_RjkqMU#?gZm&=6}~?2#ki$G}Q91rz@t9em#Jgky)+Dp9WqXvb(d zIV8|%cY$(YPLmG|UpN+zsMN*?GL#W9qVCBeKT14yam`o4eP@b;*fcfLKOIr^1pxHU zcWs@-*$$cjZG3d1Mo z*?FQv*K|dpav&9hex+Mo09B*+hiD~l>|*}m;{;8kckqy?1DAeBq%x0x*5&QVg||Q~-#Ny-I|fGR?&vG4ezmI_Iil z^%}A2lTctrkE{WrS&6m@&_f*}VPA-oH#ZO{mHBQQVV2ku^rCY@R6t<(kD{+Z3dh9h zgs#?nXQj-~-g5Wdhb)%?8JBtx8e85zqDhe8Q;rr3W3z!X@iCy~& zF^fcC-e-EzWJd>t>0y>J--1#k@Pa2yi4&}$#5%TDQtv*#>pY?2+$Hr1<9M779ki*h zs0n~zsGe_zLAOom@rycDL3jTFzaiP9LzQkB7@-I?K$I^v?&r%v5@OI+7^tz0y2Q|6 z1GVx7Hk(l%UCGGPT6q=2-;EPXv`K&v{r^m20%xfMZfQ8uyS_~Sp{Y$WKf17;Y^_YWe<-t zFv9Vq1Tz1KskZ!|u!NmeY?1lIU@N~NWfWLtY+vw-4>$?q0-Vx6wt#pJ7Q({}$l&|W zsh~~3lcL{3S2*mjSmpjFE(?To{8SK2=>ohrv+y1k)KHm6*dwS<0z2Uepf`>ZZRx~( zLt>5YXFdon8X%U9;}MU65>kJb^hnO1_QNR@D!Tq}e6+&CQ%SzPFkwjJit@BnN>^@kYX1EEFd)>e#p!3U5+!EPh@bwz5XsJ2vn_515Z!) zYTI`WLFt<~S!{UXPf1P|7ZLgB|FpcW(dohRQ|N_VUC)z3tBNx$cQSmT3cry=9xW(P z1%U`96 zBV%Ki54gRJmb0yA?Z+Na)^Wc>Fv@y2+piOE9HF3*V+!M9SOxnjU@oAX?9pr1@ASTX z#Eq6Po64C0enxDCbU$g-8U##%ynN34;Gjcu0*ikoO1qU!W6oQTlu3|z4_jd_Kb>Li zO~`tn(2i$yT2(6Q>TJftNLyQ5Y3!C5ADs6mhio{VFNVId*{|{U#Qv9*lyqL9{}Pdv zMJUgE2)OnVfI@~sAvvGAS_hz&+7tL0~=>XDH*w?$`8#jnkslUWJrBs3fwF&i(&^Gi%d2uTBxi?RAQmiKB0dIoT zCelbp+(<|F|MhU!MWAvuw?w Qh^`-`#O1}RMGS!d4{|g9(EtDd diff --git a/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg b/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg new file mode 100644 index 00000000..3e42bd91 --- /dev/null +++ b/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png b/docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png deleted file mode 100644 index 4659b5a2d07c86e161ddfcfc2f8403e97aee188b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14908 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 diff --git a/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg b/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg deleted file mode 100644 index 0e69dda5..00000000 --- a/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/940455f4016ab1be6d46c6f176fd2f76.svg b/docs/images/chapters/curvefitting/097aa1948b6cdbf9dc7579643a7af246.svg similarity index 100% rename from docs/images/chapters/curvefitting/940455f4016ab1be6d46c6f176fd2f76.svg rename to docs/images/chapters/curvefitting/097aa1948b6cdbf9dc7579643a7af246.svg diff --git a/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg b/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg new file mode 100644 index 00000000..89d9ceb4 --- /dev/null +++ b/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg b/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg new file mode 100644 index 00000000..e9fac0fe --- /dev/null +++ b/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg b/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg deleted file mode 100644 index 869937f0..00000000 --- a/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg b/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg deleted file mode 100644 index 7397a05a..00000000 --- a/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg b/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg new file mode 100644 index 00000000..10be2fd5 --- /dev/null +++ b/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg b/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg deleted file mode 100644 index 6b97b0a5..00000000 --- a/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg b/docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg similarity index 63% rename from docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg rename to docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg index 87002d07..838a5828 100644 --- a/docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg +++ b/docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg b/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg new file mode 100644 index 00000000..406ce39f --- /dev/null +++ b/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg b/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg deleted file mode 100644 index 98588d0c..00000000 --- a/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg b/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg deleted file mode 100644 index e618c6a9..00000000 --- a/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/464dbfb5adb6233108053dfac6fa4fe5.svg b/docs/images/chapters/curvefitting/d39ca235454ced9681b523be056864d2.svg similarity index 100% rename from docs/images/chapters/curvefitting/464dbfb5adb6233108053dfac6fa4fe5.svg rename to docs/images/chapters/curvefitting/d39ca235454ced9681b523be056864d2.svg diff --git a/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg b/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg new file mode 100644 index 00000000..f10573ec --- /dev/null +++ b/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg b/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg new file mode 100644 index 00000000..86025bd5 --- /dev/null +++ b/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png b/docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png deleted file mode 100644 index b7f3b5e004bb76fbd754f2a91d27c5941d883804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14459 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 bQ#L7it$-Zs#t?X$5T$udN3}%RBJlqJr83R2 diff --git a/docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png b/docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png deleted file mode 100644 index 1da34d5d8a8e5e026288b6a897cd6ec7340af2fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10563 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 MI~odQNYkMI0&z$SiU0rr diff --git a/docs/images/chapters/derivatives/897cfd8648720dc21463a9358cc65ab4.svg b/docs/images/chapters/derivatives/02cecadc92b8ff681edc8edb0ace53ce.svg similarity index 100% rename from docs/images/chapters/derivatives/897cfd8648720dc21463a9358cc65ab4.svg rename to docs/images/chapters/derivatives/02cecadc92b8ff681edc8edb0ace53ce.svg diff --git a/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg b/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg new file mode 100644 index 00000000..3e42bd91 --- /dev/null +++ b/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg b/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg new file mode 100644 index 00000000..76451738 --- /dev/null +++ b/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg b/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg new file mode 100644 index 00000000..52ec935d --- /dev/null +++ b/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg b/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg deleted file mode 100644 index 10a2db42..00000000 --- a/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg b/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg new file mode 100644 index 00000000..2f8262c6 --- /dev/null +++ b/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg b/docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg similarity index 59% rename from docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg rename to docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg index 9dfa27fa..e6f95782 100644 --- a/docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg +++ b/docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg deleted file mode 100644 index 7b88284c..00000000 --- a/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/a7c61e0e8b42010df6dab641c92ef13d.svg b/docs/images/chapters/derivatives/5d7af72e00fb0390af5281d918d77055.svg similarity index 100% rename from docs/images/chapters/derivatives/a7c61e0e8b42010df6dab641c92ef13d.svg rename to docs/images/chapters/derivatives/5d7af72e00fb0390af5281d918d77055.svg diff --git a/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg b/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg deleted file mode 100644 index f14eff34..00000000 --- a/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg b/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg new file mode 100644 index 00000000..e3c04a42 --- /dev/null +++ b/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/67ca2710769505572e097ffb40de099f.svg b/docs/images/chapters/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.svg similarity index 100% rename from docs/images/chapters/derivatives/67ca2710769505572e097ffb40de099f.svg rename to docs/images/chapters/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.svg diff --git a/docs/images/chapters/derivatives/f67d2d379ba6dfaa7f7686a7d1eae367.svg b/docs/images/chapters/derivatives/a7b79877822a8f60e45552dcafc0815d.svg similarity index 100% rename from docs/images/chapters/derivatives/f67d2d379ba6dfaa7f7686a7d1eae367.svg rename to docs/images/chapters/derivatives/a7b79877822a8f60e45552dcafc0815d.svg diff --git a/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg b/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg deleted file mode 100644 index 78e2414a..00000000 --- a/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg b/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg deleted file mode 100644 index ce4840f5..00000000 --- a/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg b/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg deleted file mode 100644 index f82f95bc..00000000 --- a/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg b/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg deleted file mode 100644 index b20000a0..00000000 --- a/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/b5977078d36d847fb299cbe3e7e2c3ba.svg b/docs/images/chapters/explanation/29695045f04fd06c75bfda7845121213.svg similarity index 100% rename from docs/images/chapters/explanation/b5977078d36d847fb299cbe3e7e2c3ba.svg rename to docs/images/chapters/explanation/29695045f04fd06c75bfda7845121213.svg diff --git a/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg b/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg deleted file mode 100644 index 68a70358..00000000 --- a/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg b/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg new file mode 100644 index 00000000..cd21d6e7 --- /dev/null +++ b/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg b/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg new file mode 100644 index 00000000..d1e1f690 --- /dev/null +++ b/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg b/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg new file mode 100644 index 00000000..27a03dc9 --- /dev/null +++ b/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg b/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg new file mode 100644 index 00000000..ebd85186 --- /dev/null +++ b/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg b/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg new file mode 100644 index 00000000..f34d2313 --- /dev/null +++ b/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg b/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg deleted file mode 100644 index 9e38f941..00000000 --- a/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg b/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg deleted file mode 100644 index ed6c08d3..00000000 --- a/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg b/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg new file mode 100644 index 00000000..98e4befd --- /dev/null +++ b/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg b/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg new file mode 100644 index 00000000..f1d635c3 --- /dev/null +++ b/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg b/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg deleted file mode 100644 index dfbbde5a..00000000 --- a/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg b/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg deleted file mode 100644 index 69f2287e..00000000 --- a/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg b/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg new file mode 100644 index 00000000..34f68620 --- /dev/null +++ b/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg b/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg new file mode 100644 index 00000000..fc312a9e --- /dev/null +++ b/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg b/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg new file mode 100644 index 00000000..94b48f4d --- /dev/null +++ b/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg b/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg deleted file mode 100644 index c2d62666..00000000 --- a/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg b/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg new file mode 100644 index 00000000..cce59def --- /dev/null +++ b/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg b/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg deleted file mode 100644 index 4c2c8df8..00000000 --- a/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg b/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg deleted file mode 100644 index d307f8b4..00000000 --- a/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg b/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg deleted file mode 100644 index 769caa5b..00000000 --- a/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extended/fd520a6e2c7f39e90496e5cf494cce2e.svg b/docs/images/chapters/extended/08cd4a8bf4557862c095066728e6ed5e.svg similarity index 100% rename from docs/images/chapters/extended/fd520a6e2c7f39e90496e5cf494cce2e.svg rename to docs/images/chapters/extended/08cd4a8bf4557862c095066728e6ed5e.svg diff --git a/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg b/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg new file mode 100644 index 00000000..6b2f9771 --- /dev/null +++ b/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extended/b0eb0b24e7fa29c545ab1479d2df0554.svg b/docs/images/chapters/extended/5a7a12213ca36f2f833e638ea0174d4a.svg similarity index 100% rename from docs/images/chapters/extended/b0eb0b24e7fa29c545ab1479d2df0554.svg rename to docs/images/chapters/extended/5a7a12213ca36f2f833e638ea0174d4a.svg diff --git a/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg b/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg new file mode 100644 index 00000000..51a76104 --- /dev/null +++ b/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg b/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg deleted file mode 100644 index 9f7786ca..00000000 --- a/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg b/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg deleted file mode 100644 index ac4c488f..00000000 --- a/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg b/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg deleted file mode 100644 index c810f40e..00000000 --- a/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg b/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg new file mode 100644 index 00000000..e9a3725f --- /dev/null +++ b/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg b/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg new file mode 100644 index 00000000..e106ba88 --- /dev/null +++ b/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg b/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg deleted file mode 100644 index ed3b2aee..00000000 --- a/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/inflections/f9f2258e59b038659087a5e87ba2e0af.svg b/docs/images/chapters/inflections/35299f4eb8e0bed76b68c7beb2038031.svg similarity index 100% rename from docs/images/chapters/inflections/f9f2258e59b038659087a5e87ba2e0af.svg rename to docs/images/chapters/inflections/35299f4eb8e0bed76b68c7beb2038031.svg diff --git a/docs/images/chapters/inflections/be9e409d619ecd735b0fbc219bec6d07.svg b/docs/images/chapters/inflections/8278b9bec92ae49927283396692b51d5.svg similarity index 100% rename from docs/images/chapters/inflections/be9e409d619ecd735b0fbc219bec6d07.svg rename to docs/images/chapters/inflections/8278b9bec92ae49927283396692b51d5.svg diff --git a/docs/images/chapters/inflections/a283e01df17f3d763ec89621f2af6c5c.svg b/docs/images/chapters/inflections/852f0346f025c671b8a1ce6b628028aa.svg similarity index 100% rename from docs/images/chapters/inflections/a283e01df17f3d763ec89621f2af6c5c.svg rename to docs/images/chapters/inflections/852f0346f025c671b8a1ce6b628028aa.svg diff --git a/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg b/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg new file mode 100644 index 00000000..aee66390 --- /dev/null +++ b/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg b/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg new file mode 100644 index 00000000..bfef7ec3 --- /dev/null +++ b/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg b/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg new file mode 100644 index 00000000..a3da0176 --- /dev/null +++ b/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg b/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg deleted file mode 100644 index e2b0b970..00000000 --- a/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg b/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg deleted file mode 100644 index 2a0ee900..00000000 --- a/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg b/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg deleted file mode 100644 index 6352ea3e..00000000 --- a/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg b/docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg similarity index 62% rename from docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg rename to docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg index 8879e5c7..6c25bf4b 100644 --- a/docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg +++ b/docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg b/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg new file mode 100644 index 00000000..532e5ffb --- /dev/null +++ b/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg b/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg deleted file mode 100644 index bfe4b273..00000000 --- a/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg b/docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg similarity index 52% rename from docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg rename to docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg index 93dba041..c8fac6db 100644 --- a/docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg +++ b/docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg b/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg new file mode 100644 index 00000000..ef65e929 --- /dev/null +++ b/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg b/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg new file mode 100644 index 00000000..26ab4b25 --- /dev/null +++ b/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg b/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg deleted file mode 100644 index 59451769..00000000 --- a/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg b/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg deleted file mode 100644 index de6c0325..00000000 --- a/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg b/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg new file mode 100644 index 00000000..2ff19cd8 --- /dev/null +++ b/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png b/docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png deleted file mode 100644 index 2ee3127f5fd7aff1f6a67d47ebf82fede0c6c5de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12462 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 XuY|{J8O(uSK!7O9s>qZ{o4omd5sBLB diff --git a/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg b/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg deleted file mode 100644 index e91a6c67..00000000 --- a/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg b/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg deleted file mode 100644 index 77314421..00000000 --- a/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg b/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg deleted file mode 100644 index 612dfc51..00000000 --- a/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg b/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg new file mode 100644 index 00000000..f6af659e --- /dev/null +++ b/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg b/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg new file mode 100644 index 00000000..acc07560 --- /dev/null +++ b/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png b/docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png deleted file mode 100644 index 403dac6d81e81d68bd9f3664fbbc51a8be0abd81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9800 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 \ No newline at end of file diff --git a/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg b/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg deleted file mode 100644 index 16c75145..00000000 --- a/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/reordering/56130afc4cb313e0e74cf670d34590f6.svg b/docs/images/chapters/reordering/0cf0d5f856ec204dc32e0e42691cc70a.svg similarity index 100% rename from docs/images/chapters/reordering/56130afc4cb313e0e74cf670d34590f6.svg rename to docs/images/chapters/reordering/0cf0d5f856ec204dc32e0e42691cc70a.svg diff --git a/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg b/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg new file mode 100644 index 00000000..3835ea2a --- /dev/null +++ b/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/reordering/8090b63b005bf3edb916b97bda317a0e.svg b/docs/images/chapters/reordering/9fc4ecc087d389dd0111bcba165cd5d0.svg similarity index 100% rename from docs/images/chapters/reordering/8090b63b005bf3edb916b97bda317a0e.svg rename to docs/images/chapters/reordering/9fc4ecc087d389dd0111bcba165cd5d0.svg diff --git a/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png b/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png index 46170a67bd409488adf0f86edf3cd42efd4b204c..576497c1055e898aa42693c726db70c6acd90ad9 100644 GIT binary patch literal 11321 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 diff --git a/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg b/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg deleted file mode 100644 index 56f9b36c..00000000 --- a/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg b/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg deleted file mode 100644 index bfcda18d..00000000 --- a/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg b/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg new file mode 100644 index 00000000..e8dfa85f --- /dev/null +++ b/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/85d526fb17f9e859dcd7d40d22192e37.svg b/docs/images/chapters/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.svg similarity index 100% rename from docs/images/chapters/weightcontrol/85d526fb17f9e859dcd7d40d22192e37.svg rename to docs/images/chapters/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.svg diff --git a/docs/images/chapters/whatis/06bbc5c11ad3fd88ff93eb2c06177b66.svg b/docs/images/chapters/whatis/3437a38af1218ca206e921e48678c07e.svg similarity index 100% rename from docs/images/chapters/whatis/06bbc5c11ad3fd88ff93eb2c06177b66.svg rename to docs/images/chapters/whatis/3437a38af1218ca206e921e48678c07e.svg diff --git a/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg b/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg new file mode 100644 index 00000000..98f98e1f --- /dev/null +++ b/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg b/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg deleted file mode 100644 index 62ad7c58..00000000 --- a/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg b/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg new file mode 100644 index 00000000..5be3bea1 --- /dev/null +++ b/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg b/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg deleted file mode 100644 index 785f4fb5..00000000 --- a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/yforx/4d23ee228c5b1cbc40e380496c2184d1.svg b/docs/images/chapters/yforx/021718d3b46893b271f90083ccdceaf8.svg similarity index 100% rename from docs/images/chapters/yforx/4d23ee228c5b1cbc40e380496c2184d1.svg rename to docs/images/chapters/yforx/021718d3b46893b271f90083ccdceaf8.svg diff --git a/docs/images/chapters/yforx/699459d89ca6622c90c1e42e4aa03f32.svg b/docs/images/chapters/yforx/058a76e3e7d67c03f733e075829a6252.svg similarity index 100% rename from docs/images/chapters/yforx/699459d89ca6622c90c1e42e4aa03f32.svg rename to docs/images/chapters/yforx/058a76e3e7d67c03f733e075829a6252.svg diff --git a/docs/images/chapters/yforx/316e7fae61e10014000d770209779ab6.svg b/docs/images/chapters/yforx/378d0fd8cefa688d530ac38930d66844.svg similarity index 100% rename from docs/images/chapters/yforx/316e7fae61e10014000d770209779ab6.svg rename to docs/images/chapters/yforx/378d0fd8cefa688d530ac38930d66844.svg diff --git a/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii b/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii new file mode 100644 index 00000000..f8eb0655 --- /dev/null +++ b/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + distance(B,C) + ratio(t) = ────────────── = Constant + distance(A,B) diff --git a/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii b/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii new file mode 100644 index 00000000..b9fa5fa4 --- /dev/null +++ b/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C - B B - C + A = B - ───────── = B + ───────── + ratio(t) ratio(t) diff --git a/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii b/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii new file mode 100644 index 00000000..8c413b3c --- /dev/null +++ b/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 2 + t + (1-t) - 1 + ratio(t) = |───────────────| + quadratic 2 2 + t + (1-t) diff --git a/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii b/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii new file mode 100644 index 00000000..27bc301e --- /dev/null +++ b/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ v - start + │ 1 + │ C '= start + ─────────── + ╡ 1 t + │ v - end + │ 2 + │ C '= end + ───────── + ╰ 2 1 - t diff --git a/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii b/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii new file mode 100644 index 00000000..a4d5fb8d --- /dev/null +++ b/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C = u(t) · P + (1-u(t)) · P + start end diff --git a/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii b/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii new file mode 100644 index 00000000..32c7f760 --- /dev/null +++ b/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 3 + t + (1-t) - 1 + ratio(t) = |───────────────| + cubic 3 3 + t + (1-t) diff --git a/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii b/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii new file mode 100644 index 00000000..afc09ab9 --- /dev/null +++ b/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 + (1-t) + u(t) = ─────────── + quadratic 2 2 + t + (1-t) diff --git a/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii b/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii new file mode 100644 index 00000000..1858a2ac --- /dev/null +++ b/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 + (1-t) + u(t) = ─────────── + cubic 3 3 + t + (1-t) diff --git a/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii b/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii new file mode 100644 index 00000000..714299cc --- /dev/null +++ b/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ + ╭ z │ 2 2 + length = | ⟍│(dx/dt) +(dy/dt) dt + ╯ 0 diff --git a/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii b/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii new file mode 100644 index 00000000..10c3da8f --- /dev/null +++ b/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii @@ -0,0 +1,9 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ +╭ 1 │ 2 2 ╭ 1 +| ⟍│(dx/dt) +(dy/dt) dt = | f(t) dt ≃ ┌ \underset strip 1 \underbrace C · f(t ) + ... + \underset strip n \underbrace C · f(t ) ┐ = +╯ -1 ╯ -1 └ 1 1 n n ┘ + __ n + \underset strips 1 through n \underbrace ❯ C · f(t ) + ‾‾ i=1 i i diff --git a/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii b/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii new file mode 100644 index 00000000..a5531f0d --- /dev/null +++ b/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ t- knot ╮ ╭ knot -t ╮ + │ i │ │ (i+k) │ + N (t) = │ ───────────────────── │ · N (t) + │ ─────────────────────── │ · N (t) + i,k │ knot - knot │ i,k-1 │ knot - knot │ i+1,k-1 + ╰ (i+k-1) i ╯ ╰ (i+k) (i+1) ╯ diff --git a/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii b/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii new file mode 100644 index 00000000..6a4fc7bd --- /dev/null +++ b/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ 1 if t ∈[ knot , knot ) + N (t) = ╡ i i+1 + i,1 ╰ 0 otherwise diff --git a/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii b/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii new file mode 100644 index 00000000..ae16d003 --- /dev/null +++ b/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + k 0 ╭ 1 if t ∈[ knot , knot ) + d (t) = 0, d (t) = N (t) = ╡ i i+1 + 0 i i,1 ╰ 0 otherwise diff --git a/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii b/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii new file mode 100644 index 00000000..340f3fb5 --- /dev/null +++ b/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + t - knots[i] + α = ─────────────────────────── + i,k knots[i+1+n-k] - knots[i] diff --git a/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii b/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii new file mode 100644 index 00000000..51769205 --- /dev/null +++ b/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii @@ -0,0 +1,24 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ (-x +x )(-y +y ) ╮ + │ 1 2 1 4 │ + │ -x + x - ──────────────── │ + │ 1 4 -y +y │ + │ 1 2 │ + │ ─────────────────────────── │ + │ (-x +x )(-y +y ) │ + │ 1 2 1 3 │ + │ -x +x -──────────────── │ + │ 1 3 -y +y │ + mapped = (x) = │ 1 2 │ + 4 y │ ╭ -y +y ╮ ╭ (-x +x )(-y +y ) ╮ │ + │ │ 1 3 │ │ 1 2 1 4 │ │ + │ │ 1 - ────── │ │ -x + x - ──────────────── │ │ + │ (-y +y ) │ -y +y │ │ 1 4 -y +y │ │ + │ 1 4 ╰ 1 2 ╯ ╰ 1 2 ╯ │ + │ ──────── + ────────────────────────────────────────────── │ + │ -y +y (-x +x )(-y +y ) │ + │ 1 2 1 2 1 3 │ + │ -x +x -──────────────── │ + │ 1 3 -y +y │ + ╰ 1 2 ╯ diff --git a/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii b/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii new file mode 100644 index 00000000..224d8fa8 --- /dev/null +++ b/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ ┌ P + 6(P - P ) ┐ + │ 1 │ │ 4 1 2 │ + │ P │ │ P │ + │ 2 │ \Rightarrow │ 1 │ + │ P │ Bézier │ P │ CatmullRom + │ 3 │ │ 4 │ + │ P │ │ P + 6(P - P ) │ + └ 4 ┘ └ 1 4 3 ┘ diff --git a/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii b/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii new file mode 100644 index 00000000..eaea3f72 --- /dev/null +++ b/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 0 1 0 0 ┐ ┌ P ┐ + │ 0 0 1 0 │ │ 1 │ + ┌ 1 0 0 0 ┐ │ -1 1 │ │ P │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ ── 0 ── 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ 2τ 2τ │ │ P │ + └ 2 -2 1 1 ┘ │ -1 1 │ │ 3 │ + │ 0 ── 0 ── │ │ P │ + └ 2τ 2τ ┘ └ 4 ┘ diff --git a/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii b/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii new file mode 100644 index 00000000..b1b40ccd --- /dev/null +++ b/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ P │ + Bézier(t) = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ 2 │ + └ 1 t t t ┘ │ 3 -6 3 0 │ │ P │ + └ -1 3 -3 1 ┘ │ 3 │ + │ P │ + └ 4 ┘ diff --git a/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii b/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii new file mode 100644 index 00000000..8a301512 --- /dev/null +++ b/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V = P ┐ + │ 1 2 │ + ┌ P ┐ │ V = P │ + │ 1 │ │ 2 3 │ + │ P │ │ P - P │ + │ 2 │ = │ 3 1 │ + │ P │points │ V' = ─────── │ point-tangent + │ 3 │ │ 1 2 │ + │ P │ │ P - P │ + └ 4 ┘ │ 4 2 │ + │ V' = ─────── │ + └ 2 2 ┘ diff --git a/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii b/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii new file mode 100644 index 00000000..83393491 --- /dev/null +++ b/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ V │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ V' │ + └ 2 -2 1 1 ┘ │ 1 │ + │ V' │ + └ 2 ┘ diff --git a/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii b/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii new file mode 100644 index 00000000..83393491 --- /dev/null +++ b/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ V │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ V' │ + └ 2 -2 1 1 ┘ │ 1 │ + │ V' │ + └ 2 ┘ diff --git a/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii b/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii new file mode 100644 index 00000000..1d57baff --- /dev/null +++ b/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ ┌ P ┐ + │ 1 │ │ 1 │ + │ P │ │ P │ + │ 2 │ \Rightarrow │ 4 │ + │ P │ Bézier │ P + 3(P - P ) │ CatmullRom + │ 3 │ │ 4 1 2 │ + │ P │ │ P + 3(P - P ) │ + └ 4 ┘ └ 1 4 3 ┘ diff --git a/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii b/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii new file mode 100644 index 00000000..68fcdb6a --- /dev/null +++ b/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 2 │ + ┌ P ┐ │ P -P │ + │ 1 │ │ 3 1 │ + │ P │ │ P + ────── │ + │ 2 │ \Rightarrow │ 2 6 · τ │ + │ P │ CatmullRom │ P -P │ Bézier + │ 3 │ │ 4 2 │ + │ P │ │ P - ────── │ + └ 4 ┘ │ 3 6 · τ │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii b/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii new file mode 100644 index 00000000..e4c8099d --- /dev/null +++ b/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii @@ -0,0 +1,12 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 0 1 0 0 ┐ + │ -1 1 │ ┌ P ┐ + │ ── 0 ── 0 │ │ 1 │ + │ 2τ 2τ │ │ P │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 1 1 1 -1 │ · │ 2 │ + └ 1 t t t ┘ │ ─ ── - 3 3 - ─ ── │ │ P │ + │ τ 2t t 2t │ │ 3 │ + │ -1 1 1 1 │ │ P │ + │ ── 2 - ── ── - 2 ── │ └ 4 ┘ + └ 2t 2τ 2τ 2t ┘ diff --git a/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii b/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii new file mode 100644 index 00000000..6cb05741 --- /dev/null +++ b/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii @@ -0,0 +1,11 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + r= dist(B(t), c) + ┌─────────────────────────┐ + │ 2 2 + = │(B t - c ) + (B t - c ) + ⟍│ x x y y + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │╭ 3 2 2 3 ╮2 ╭ 3 2 2 3 ╮2 + = ││ x (1-t) + 3 x (1-t) t + 2 x (1-t) t + x t - c │ + │ y (1-t) + 3 y (1-t) t + 2 y (1-t) t + y t - c │ + ⟍│╰ 1 2 3 4 x ╯ ╰ 1 2 3 4 y ╯ diff --git a/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii b/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii new file mode 100644 index 00000000..b7afcee9 --- /dev/null +++ b/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii @@ -0,0 +1,3 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + dist(B(t), c) = r diff --git a/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii b/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii new file mode 100644 index 00000000..4980b769 --- /dev/null +++ b/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 4 ╭ φ ╮ + C = ┌ cos(φ) + f · sin(φ) ┐ , with f = ─ tan │ ─ │ + 2 └ sin(φ) - f · cos(φ) ┘ 3 ╰ 4 ╯ diff --git a/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii b/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii new file mode 100644 index 00000000..1c87ca6d --- /dev/null +++ b/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 4 ╭ φ ╮ + C = ┌ 1 ┐ , with f = ─ tan │ ─ │ + 1 └ f ┘ 3 ╰ 4 ╯ diff --git a/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii b/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii new file mode 100644 index 00000000..d11e31d6 --- /dev/null +++ b/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ 1 ╮ 1 4 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 diff --git a/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii b/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii new file mode 100644 index 00000000..6b0389a1 --- /dev/null +++ b/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t · \ \underset重み\underbracew + ‾‾ i=0 i diff --git a/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii b/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii new file mode 100644 index 00000000..84c3fd7c --- /dev/null +++ b/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetweight\underbracew + i diff --git a/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii b/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii new file mode 100644 index 00000000..6a5dfe6b --- /dev/null +++ b/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t · \ \underset 重み\underbracew + ‾‾ i=0 i diff --git a/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii b/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii new file mode 100644 index 00000000..ee160ac1 --- /dev/null +++ b/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii b/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii new file mode 100644 index 00000000..6c8d9694 --- /dev/null +++ b/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + вес\underbracew + i diff --git a/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii b/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii new file mode 100644 index 00000000..2e1eac5e --- /dev/null +++ b/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii @@ -0,0 +1,7 @@ + \usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontgbsn00lp.ttf + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + weight\underbracew + i diff --git a/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii b/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii new file mode 100644 index 00000000..9272dba9 --- /dev/null +++ b/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n 2 + E(C) = ❯ (p - Bézier(s )) + ‾‾ i=1 i i diff --git a/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii b/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii new file mode 100644 index 00000000..1a6bcb00 --- /dev/null +++ b/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ diff --git a/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii b/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii new file mode 100644 index 00000000..4a235f5a --- /dev/null +++ b/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + B =a(1-t) + 3b(1-t) t + 3c(1-t)t + dt + cubic diff --git a/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii b/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii new file mode 100644 index 00000000..0a85fa31 --- /dev/null +++ b/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 1 0 0 0 ┐ ┌ a ┐ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ + └ -1 3 -3 1 ┘ └ d ┘ diff --git a/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii b/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii new file mode 100644 index 00000000..39708cf8 --- /dev/null +++ b/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B =a + cubic + - 3at + 3bt + 2 2 2 + + 3at - 6bt +3ct + 3 3 3 3 + - at + 3bt -3ct + dt diff --git a/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii b/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii new file mode 100644 index 00000000..e8fcab3b --- /dev/null +++ b/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 1 0 0 0 0 ┐ ┌ a ┐ + │ -4 4 0 0 0 │ │ b │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ + └ 1 -4 6 -4 1 ┘ └ e ┘ diff --git a/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii b/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii new file mode 100644 index 00000000..4cf5c5e4 --- /dev/null +++ b/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 + E(C) = (p - Bézier(s )) + i i i diff --git a/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii b/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii new file mode 100644 index 00000000..2b38a216 --- /dev/null +++ b/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 2 + B = a (1-t) + 2 b (1-t) t + c t + quadratic + 2 2 2 + = a - 2at + at + 2bt - 2bt + ct diff --git a/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii b/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii new file mode 100644 index 00000000..17c63901 --- /dev/null +++ b/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B =a + quadratic + - 2at+ 2bt + 2 2 2 + + at - 2bt + ct diff --git a/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii b/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii new file mode 100644 index 00000000..27521999 --- /dev/null +++ b/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + Bézier (t) = B (t) · w + B (t) · w + B (t) · w + B (t) · w + ... + n,k n,0 0 n,1 1 n,2 2 n,3 3 + d + Bézier (t) ── = n · (B (t) - B (t)) · w + + n,k dt n-1,-1 n-1,0 0 + n · (B (t) - B (t)) · w + + n-1,0 n-1,1 1 + n · (B (t) - B (t)) · w + + n-1,1 n-1,2 2 + n · (B (t) - B (t)) · w + + n-1,2 n-1,3 3 + ... diff --git a/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii b/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii new file mode 100644 index 00000000..6bafb566 --- /dev/null +++ b/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + weight\underbracew + i diff --git a/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii b/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii new file mode 100644 index 00000000..c0002991 --- /dev/null +++ b/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii @@ -0,0 +1,5 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + d __ n-1 __ n-1 + Bézier (t) ── = ❯ n · B (t) · (w - w ) = ❯ B (t) · \underset вес производной \underbracen · (w - w ) + n,k dt ‾‾ k=0 n-1,k k+1 k ‾‾ k=0 n-1,k k+1 k diff --git a/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii b/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii new file mode 100644 index 00000000..4c419367 --- /dev/null +++ b/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ k k-i i +Bézier'(n,t) = ❯ \underset binomial term\underbrace\binomki · \ \underset polynomial term\underbrace(1-t) · t · \ \underset derivative + ‾‾ i=0 + weight\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii b/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii new file mode 100644 index 00000000..fd6b9ea1 --- /dev/null +++ b/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ k k-i i +Bézier'(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomki · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес производной\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii b/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii new file mode 100644 index 00000000..17eccb78 --- /dev/null +++ b/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + вес\underbracew + i diff --git a/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii b/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii new file mode 100644 index 00000000..fec66bd6 --- /dev/null +++ b/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + d __ n-1 __ n-1 + Bézier (t) ── = ❯ n · B (t) · (w - w ) = ❯ B (t) · \underset derivative weights \underbracen · (w - w ) + n,k dt ‾‾ k=0 n-1,k k+1 k ‾‾ k=0 n-1,k k+1 k diff --git a/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii b/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii new file mode 100644 index 00000000..df3609a0 --- /dev/null +++ b/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii @@ -0,0 +1,6 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + d +Bézier (t) ── = n · B (t) · (w - w ) + n · B (t) · (w - w ) + n · B (t) · (w - w ) + + n,k dt (n-1),\colorblue0 1 0 (n-1),\colorred1 2 1 (n-1),\colormagenta2 3 2 + ... diff --git a/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii b/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii new file mode 100644 index 00000000..85f341ff --- /dev/null +++ b/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ k k-i i +Bézier'(n,t) = ❯ \underset биноминальный термин\underbrace\binomki · \ \underset полиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \underset вес производной\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii b/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii new file mode 100644 index 00000000..91f9ff0b --- /dev/null +++ b/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n-1 + Bézier'(n,t) = ❯ Bézier(n-1,t) · n · (w -w ) + ‾‾ i=0 i i+1 i diff --git a/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii b/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii new file mode 100644 index 00000000..6585b9d4 --- /dev/null +++ b/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n-1 + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i diff --git a/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii b/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii new file mode 100644 index 00000000..cd0ec93e --- /dev/null +++ b/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomni · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii b/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii new file mode 100644 index 00000000..cd4a8901 --- /dev/null +++ b/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii b/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii new file mode 100644 index 00000000..a1de268f --- /dev/null +++ b/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii @@ -0,0 +1,7 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= (1-t) + t + 2 2 + квадратый= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + кубический= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii b/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii new file mode 100644 index 00000000..389a9490 --- /dev/null +++ b/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii b/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii new file mode 100644 index 00000000..de7e8f83 --- /dev/null +++ b/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii @@ -0,0 +1,7 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 1次= (1-t) + t + 2 2 + 2次= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + 3次= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii b/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii new file mode 100644 index 00000000..3cc491c8 --- /dev/null +++ b/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii @@ -0,0 +1,8 @@ + \usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + +1次= \colorbluea + \colorredb +2次= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb +3次= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorredb · \c + + + olorredb · \colorredb diff --git a/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii b/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii new file mode 100644 index 00000000..ef6d3f1a --- /dev/null +++ b/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii @@ -0,0 +1,5 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i + Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii b/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii new file mode 100644 index 00000000..7e4a09a6 --- /dev/null +++ b/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii b/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii new file mode 100644 index 00000000..bf17a8c5 --- /dev/null +++ b/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii @@ -0,0 +1,8 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= \colorbluea + \colorredb + квадратый= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb +кубический= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorre + + + db · \colorredb · \colorredb diff --git a/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii b/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii new file mode 100644 index 00000000..ff567ba6 --- /dev/null +++ b/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + linear= (1-t) + t + 2 2 + square= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + cubic= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii b/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii new file mode 100644 index 00000000..5c482a92 --- /dev/null +++ b/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii @@ -0,0 +1,6 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= 1 + 1 + квадратый= 1 + 2 + 1 + кубический= 1 + 3 + 3 + 1 + квартический= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii b/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii new file mode 100644 index 00000000..9284a2ad --- /dev/null +++ b/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii @@ -0,0 +1,6 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 1次= 1 + 1 + 2次= 1 + 2 + 1 + 3次= 1 + 3 + 3 + 1 + 4次= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii b/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii new file mode 100644 index 00000000..553bf649 --- /dev/null +++ b/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii @@ -0,0 +1,8 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + +linear= \colorbluea + \colorredb +square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb + cubic= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorredb + + + · \colorredb · \colorredb diff --git a/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii b/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii new file mode 100644 index 00000000..271cd244 --- /dev/null +++ b/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + linear= 1 + 1 + square= 1 + 2 + 1 + cubic= 1 + 3 + 3 + 1 + quartic= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii b/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii new file mode 100644 index 00000000..cb9ef993 --- /dev/null +++ b/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii @@ -0,0 +1,4 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 混ぜ合わさった値 = a · 値 + (1 - a) · 値 + 1 2 diff --git a/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii b/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii new file mode 100644 index 00000000..a6d2320b --- /dev/null +++ b/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + m = a · value + (1 - a) · value + 1 2 diff --git a/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii b/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii new file mode 100644 index 00000000..cf911ef2 --- /dev/null +++ b/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii @@ -0,0 +1,4 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 混ぜ合わさった値 = a · 値 + b · 値 + 1 2 diff --git a/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii b/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii new file mode 100644 index 00000000..bf6e7bb5 --- /dev/null +++ b/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + mixture = a · value + b · value + 1 2 diff --git a/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii b/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii new file mode 100644 index 00000000..cae6081b --- /dev/null +++ b/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌────────┐ + │ 2 + 2 -b ±⟍│b - 4ac + Given f(t) = at + bt + c, f(t)=0 when t = ─────────────── + 2a diff --git a/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii b/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii new file mode 100644 index 00000000..98718442 --- /dev/null +++ b/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B(t) uses { p ,p ,p ,p } + 1 2 3 4 + B'(t) uses { v ,v ,v }, where v = 3(p -p ), v = 3(p -p ), v = 3(p -p ) + 1 2 3 1 2 1 2 3 2 3 4 3 diff --git a/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii b/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii new file mode 100644 index 00000000..2e8de6e9 --- /dev/null +++ b/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + Bézier(t) = x (1-t) + 3x (1-t) t + 3x (1-t)t + x t + 1 2 3 4 + \prime 2 2 + Bézier (t) = a(1-t) + 2b(1-t)t + ct { a=3(x -x ),b=3(x -x ),c=3(x -x ) } + 2 1 3 2 4 3 + \prime\prime + Bézier (t) = u(1-t) + vt {u=2(b-a),v=2(c-b)}\ diff --git a/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii b/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii new file mode 100644 index 00000000..d6e925a0 --- /dev/null +++ b/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + Bézier(t) = y (1-t) + 3y (1-t) t + 3y (1-t)t + y t + 1 2 3 4 + \prime 2 2 + Bézier (t) = d(1-t) + 2e(1-t)t + ft + \prime\prime + Bézier (t) = w(1-t) + zt diff --git a/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii b/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii new file mode 100644 index 00000000..08c35d78 --- /dev/null +++ b/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C(t) = Bézier \prime(t) · Bézier \prime\prime(t) - Bézier \prime(t) · Bézier \prime\prime(t) + x y y x diff --git a/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii b/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii new file mode 100644 index 00000000..0cc1d356 --- /dev/null +++ b/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · M \underset …こうじゃ!\underbrace \kern 1.25em · \kern 1.25em Q \kern 1.25em · \kern 1.25em │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii b/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii new file mode 100644 index 00000000..42df6a71 --- /dev/null +++ b/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · M \underset ...to get this!\underbrace \kern 1.25em · \kern 1.25em Q \kern 1.25em · \kern 1.25em │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii b/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii new file mode 100644 index 00000000..4e981e34 --- /dev/null +++ b/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + -1 │ 1 │ + = ┌ 2 ┐ · \underset into this...\underbrace M · M · Z · M · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii b/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii new file mode 100644 index 00000000..f845e1fd --- /dev/null +++ b/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · \underset これを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii b/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii new file mode 100644 index 00000000..34b7315b --- /dev/null +++ b/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · \underset we turn this...\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii b/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii new file mode 100644 index 00000000..7bc93369 --- /dev/null +++ b/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + -1 │ 1 │ + = ┌ 2 ┐ · \underset …こうして…\underbrace M · M · Z · M · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii b/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii new file mode 100644 index 00000000..4da8e4ab --- /dev/null +++ b/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C - B B - C + A = B - ────────── = B + ────────── + ratio(t) ratio(t) + q q diff --git a/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii b/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii new file mode 100644 index 00000000..25ab67d6 --- /dev/null +++ b/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C = u(t) · Start + (1-u(t) ) · End + q q diff --git a/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii b/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii new file mode 100644 index 00000000..a21a609d --- /dev/null +++ b/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii @@ -0,0 +1,16 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌─────────────────┐ + │ 2 2 + d = \| tangent(t)\| = │B' (t) + B' (t) + ⟍│ x y + + tangent (t) B' (t) + ^ x x + x(t) = \| tangent (t)\| =─────────────── = ────── + x \| tangent(t)\| d + + tangent (t) B' (t) + ^ y y + y(t) = \| tangent (t)\| = ─────────────── = ────── + y \| tangent(t)\| d diff --git a/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii b/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii new file mode 100644 index 00000000..25b4285d --- /dev/null +++ b/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii @@ -0,0 +1,16 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ + │ 2 2 + d = \|tangent(t)\| = │B' (t) + B' (t) + ⟍│ x y + + tangent (t) B' (t) + ^ x x + x(t) = \| tangent (t)\| =────────────── = ────── + x \|tangent(t)\| d + + tangent (t) B' (t) + ^ y y + y(t) = \| tangent (t)\| = ────────────── = ────── + y \|tangent(t)\| d diff --git a/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii b/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii new file mode 100644 index 00000000..5f6e0673 --- /dev/null +++ b/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ^ \pi ^ \pi ^ + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + x 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 diff --git a/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii b/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii new file mode 100644 index 00000000..4585c7ae --- /dev/null +++ b/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ^ \pi ^ \pi ^ + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + x 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 diff --git a/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii b/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii new file mode 100644 index 00000000..37b640a4 --- /dev/null +++ b/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + tangent (t) = B' (t) + x x + + tangent (t) = B' (t) + y y diff --git a/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii b/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii new file mode 100644 index 00000000..36d62e0d --- /dev/null +++ b/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ B + (B - A ) ┐ ┌ 2B - A ┐ + Mirrored = │ x x x │ = │ x x │ + │ B + (B - A ) │ │ 2B - A │ + └ y y y ┘ └ y y ┘ diff --git a/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii b/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii new file mode 100644 index 00000000..087ea198 --- /dev/null +++ b/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + Bézier(n,t)= (1-t) B(n,t) + t B(n,t) + __ n n __ n n + = ❯ w (1 - t) B (t) + ❯ w t B (t) + ‾‾ i=0 i i ‾‾ i=0 i i diff --git a/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii b/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii new file mode 100644 index 00000000..da33d525 --- /dev/null +++ b/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii @@ -0,0 +1,9 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ k k-i i +Bézier(k,t) = ❯ \underset binomial term\underbrace\binomki · \ \underset polynomial term\underbrace(1-t) · t · \ \underset new + ‾‾ i=0 + ╭ (k-i) · w + i · w ╮ + │ i i-1 │ + weights\underbrace│ ─────────────────────── │ , with k = n+1 and w =0 when i = 0 + ╰ k ╯ i-1 diff --git a/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii b/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii new file mode 100644 index 00000000..1fa197dc --- /dev/null +++ b/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n n n-i i + Bézier(n,t) = ❯ w B (t) , where B (t) = \binomni · (1-t) · t + ‾‾ i=0 i i i diff --git a/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii b/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii new file mode 100644 index 00000000..28f15b93 --- /dev/null +++ b/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + ❯ \binomni · (1-t) · t · w · \colorblueratio + ‾‾ i=0 i i + Rational Bézier(n,t) = ─────────────────────────────────────────────────────────── + __ n n-i i + \colorblue ❯ \binomni · (1-t) · t · ratio + ‾‾ i=0 i diff --git a/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii b/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii new file mode 100644 index 00000000..f1659f8a --- /dev/null +++ b/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + Bézier(n,t) = ❯ \binomni · (1-t) · t · w + ‾‾ i=0 i diff --git a/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii b/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii new file mode 100644 index 00000000..fc0843cf --- /dev/null +++ b/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii @@ -0,0 +1,11 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ╭ p = 一方の点 ╮ + │ 1 │ + │ p = もう一方の点 │ + │ 2 │ + │ 距離= (p - p ) │ のとき、新しい点 = p + 距離 · 比率 + │ 2 1 │ 1 + │ 百分率 │ + │ 比率= ──── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii b/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii new file mode 100644 index 00000000..c118242f --- /dev/null +++ b/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii @@ -0,0 +1,11 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + ╭ p = неикая точка ╮ + │ 1 │ + │ p = неикая другая точка │ + │ 2 │ + Дано │ расстояние= (p - p ) │, наша новая точка = p + расстояние · соотношение + │ 2 1 │ 1 + │ процентаж │ + │ соотношение= ────────── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii b/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii new file mode 100644 index 00000000..3a98fb94 --- /dev/null +++ b/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii @@ -0,0 +1,11 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ p = some point ╮ + │ 1 │ + │ p = some other point │ + │ 2 │ + Given │ distance= (p - p ) │, our new point = p + distance · ratio + │ 2 1 │ 1 + │ percentage │ + │ ratio= ─────────── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii b/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii new file mode 100644 index 00000000..6bdb24e2 --- /dev/null +++ b/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 + x(t) = (-a + 3b- 3c + d)t + (3a - 6b + 3c)t + (-3a + 3b)t + a diff --git a/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii b/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii new file mode 100644 index 00000000..64fa9f99 --- /dev/null +++ b/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 + (-a + 3b - 3c + d)t + (3a - 6b + 3c)t + (-3a + 3b)t + (a-x) = 0 diff --git a/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii b/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii new file mode 100644 index 00000000..57a30ec8 --- /dev/null +++ b/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + x(t) = a(1-t) + 3b(1-t) t + 3c(1-t)t + dt diff --git a/docs/index.html b/docs/index.html index 0071c3b1..6da63a68 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@ - + @@ -537,17 +537,17 @@ - +

So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over @@ -689,15 +689,15 @@ @@ -731,19 +731,19 @@ and remove the weights for a moment, we get this:

@@ -755,14 +755,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -1047,15 +1047,15 @@ function Bezier(3,t): called "weights", and we can add them to our original Bézier function:

- +

That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between @@ -1197,7 +1197,7 @@ function Bezier(3,t,w[]): --> @@ -1394,10 +1394,10 @@ function RationalBezier(3,t,w[],r[]): - +

The obvious start and end values here need to be a=1, b=0, so that the mixed value is 100% value 1, and 0% value 2, and a=0, b=1, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: @@ -1409,10 +1409,10 @@ function RationalBezier(3,t,w[],r[]): - +

With this we can guarantee that we never sum above 100%. By restricting a to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. @@ -2106,16 +2106,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2545,11 +2545,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2568,12 +2568,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2794,12 +2794,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3119,9 +3119,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3129,27 +3129,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3162,16 +3162,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3735,14 +3735,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5064,18 +5064,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5084,9 +5086,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5183,7 +5186,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5214,13 +5217,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -5990,10 +5993,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6005,24 +6008,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6033,33 +6036,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6069,11 +6072,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6098,16 +6101,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6393,12 +6396,12 @@ for (coordinate, index) in LUT: @@ -6406,7 +6409,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6832,16 +6835,16 @@ findClosest(start, p, r, LUT): @@ -6855,13 +6858,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -6869,14 +6872,14 @@ findClosest(start, p, r, LUT): @@ -6884,18 +6887,18 @@ findClosest(start, p, r, LUT): @@ -6904,14 +6907,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -6921,14 +6924,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7031,13 +7034,13 @@ findClosest(start, p, r, LUT): @@ -7430,18 +7433,18 @@ for p = 1 to points.length-3 (inclusive): @@ -7984,19 +7987,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8004,19 +8007,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8109,7 +8112,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -8895,13 +8898,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9049,14 +9052,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9064,14 +9067,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9314,13 +9317,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9330,11 +9333,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9366,11 +9369,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9381,11 +9384,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/ja-JP/index.html b/docs/ja-JP/index.html index 0e81940d..68fe1327 100644 --- a/docs/ja-JP/index.html +++ b/docs/ja-JP/index.html @@ -41,7 +41,7 @@ - + @@ -530,17 +530,17 @@ - +

では、実際に見てみましょう。下の図はインタラクティブになっています。上下キーで補間の比率が増減しますので、どうなるか確かめてみましょう。最初に3点があり、それを結んで2本の直線が引かれています。この直線の上でそれぞれ線形補間を行うと、2つの点が得られます。この2点の間でさらに線形補間を行うと、1つの点を得ることができます。そして、あらゆる比率に対して同様に点を求め、それをすべて集めると、このようにベジエ曲線ができるのです。

@@ -667,16 +667,16 @@ @@ -686,16 +686,16 @@

@@ -705,19 +705,19 @@ 多項式部分の項がどうなっているのか、同じぐらい簡単な方法で考えることができます。仮に、(1-t)aに、tbに書き換え、さらに重みを一旦削除してしまえば、このようになります。

@@ -727,13 +727,13 @@ - +

複雑そうに見えますが、運がいいことに「重み」というのは実はただの座標値です。というのはn次の曲線の場合、w0が始点の座標、wnが終点の座標となり、その間はどれも制御点の座標になります。例えば、始点が(120,160)、制御点が(35,200)と(220,260)、終点が(220,40)となる3次ベジエ曲線は、次のようになります。

@@ -1165,7 +1165,7 @@ function Bezier(3,t,w[]): --> @@ -1367,10 +1367,10 @@ function RationalBezier(3,t,w[],r[]): - +

明らかに、始点ではa=1, b=0とする必要があります。こうすれば、値1が100%、値2が0%で混ぜ合わさるからです。また、終点ではa=0, b=1 - +

こうすれば、和が100%を超えることはないと保証できます。aの値を区間[0,1]に制限してしまえば、混ぜ合わさった値は常に2つの値の間のどこか(両端を含む)になり、また和は常に100%になります。

@@ -2070,14 +2070,14 @@ function drawCurve(points[], t): ┌ P ┐ │ 1 │ - = ┌ 2 ┐ · \undersetこれを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ - └ 1 t t ┘ │ 2 │ + = ┌ 2 ┐ · \underset これを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ │ P │ └ 3 ┘ --> - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2494,11 +2494,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2517,12 +2517,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2750,12 +2750,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3075,9 +3075,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3085,27 +3085,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3118,16 +3118,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3713,14 +3713,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5105,18 +5105,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5125,9 +5127,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5231,7 +5234,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5262,13 +5265,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6107,10 +6110,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6122,24 +6125,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6150,33 +6153,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6186,11 +6189,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6215,16 +6218,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6540,12 +6543,12 @@ for (coordinate, index) in LUT: @@ -6553,7 +6556,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6998,16 +7001,16 @@ findClosest(start, p, r, LUT): @@ -7021,13 +7024,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7035,14 +7038,14 @@ findClosest(start, p, r, LUT): @@ -7050,18 +7053,18 @@ findClosest(start, p, r, LUT): @@ -7070,14 +7073,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7087,14 +7090,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7197,13 +7200,13 @@ findClosest(start, p, r, LUT): @@ -7610,18 +7613,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8164,19 +8167,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8184,19 +8187,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8293,7 +8296,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9113,13 +9116,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9267,14 +9270,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9282,14 +9285,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9568,13 +9571,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9584,11 +9587,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9620,11 +9623,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9635,11 +9638,11 @@ for p = 1 to points.length-3 (inclusive): - +

- +

Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, @@ -716,18 +716,18 @@ b и т.д. принимающими "биноминальную" форму. Звучит сложно, но на практике выглядит понятнее:

@@ -736,18 +736,18 @@ ясно. Примите ко внимаю такие биномиальные термины:

@@ -765,20 +765,20 @@ t в b, убрав "веса", получим следующее:

@@ -787,17 +787,17 @@ функцию:

@@ -1106,15 +1106,15 @@ function Bezier(3,t): можем учесть их запись в нашей оригинальной функции Безье:

- +

Хоть и выглядит заморочено, но, так уж получается, в реальности "веса" просто значения координат на графике, к которым мы бы хотели, чтобы наша функция стремилась. Так, для кривой n-го порядка, w0 есть начальной координатой, wn конечной @@ -1266,7 +1266,7 @@ function Bezier(3,t,w[]): --> @@ -1469,10 +1469,10 @@ function RationalBezier(3,t,w[],r[]): - +

Очевидно, что начальное и конечное значения a и b должны быть a=1, b=0, чтобы в начале получать вывод 100% первого показателя и 0% второго; и a=0, b=1, чтобы в конце получать 0% value 1 и 100% value 2. В дополнение, мы не @@ -1484,10 +1484,10 @@ function RationalBezier(3,t,w[],r[]): - +

С этим у нас есть гарантия, что мы не получим суму значений пропорций более 100%. Мы ограничиваем значение a интервалом [0,1], потому всегда получаем вывод из пропорционального смешения двух показателей, с сумой смесителей не превышающей 100%. @@ -2215,16 +2215,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2654,11 +2654,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2677,12 +2677,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2910,12 +2910,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

И это по сути формула функции сумы на 1 порядок ниже:

Можно переписать по стандартной форме сумы, и готово:

@@ -3157,35 +3157,35 @@ Bézier (t) ── = n · B (t) · (w - w ) + n · B производная:

@@ -3236,9 +3236,9 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb -->

@@ -3246,27 +3246,27 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb point, and then do whatever it is we want to do based on those directions:

@@ -3279,16 +3279,16 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3874,14 +3874,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5266,18 +5266,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5286,9 +5288,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5392,7 +5395,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5423,13 +5426,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6268,10 +6271,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6283,24 +6286,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6311,33 +6314,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6347,11 +6350,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6376,16 +6379,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6701,12 +6704,12 @@ for (coordinate, index) in LUT: @@ -6714,7 +6717,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -7159,16 +7162,16 @@ findClosest(start, p, r, LUT): @@ -7182,13 +7185,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7196,14 +7199,14 @@ findClosest(start, p, r, LUT): @@ -7211,18 +7214,18 @@ findClosest(start, p, r, LUT): @@ -7231,14 +7234,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7248,14 +7251,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7358,13 +7361,13 @@ findClosest(start, p, r, LUT): @@ -7771,18 +7774,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8325,19 +8328,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8345,19 +8348,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8454,7 +8457,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9274,13 +9277,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9428,14 +9431,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9443,14 +9446,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9729,13 +9732,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9745,11 +9748,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9781,11 +9784,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9796,11 +9799,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/uk-UA/index.html b/docs/uk-UA/index.html index 72bdd6fc..b531eaeb 100644 --- a/docs/uk-UA/index.html +++ b/docs/uk-UA/index.html @@ -39,7 +39,7 @@ - + @@ -546,17 +546,17 @@ - +

So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over @@ -712,15 +712,15 @@ @@ -754,19 +754,19 @@ and remove the weights for a moment, we get this:

@@ -778,14 +778,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -1094,15 +1094,15 @@ function Bezier(3,t): called "weights", and we can add them to our original Bézier function:

- +

That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between @@ -1251,7 +1251,7 @@ function Bezier(3,t,w[]): --> @@ -1455,10 +1455,10 @@ function RationalBezier(3,t,w[],r[]): - +

The obvious start and end values here need to be a=1, b=0, so that the mixed value is 100% value 1, and 0% value 2, and a=0, b=1, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: @@ -1470,10 +1470,10 @@ function RationalBezier(3,t,w[],r[]): - +

With this we can guarantee that we never sum above 100%. By restricting a to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. @@ -2190,16 +2190,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2629,11 +2629,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2652,12 +2652,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2885,12 +2885,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3210,9 +3210,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3220,27 +3220,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3253,16 +3253,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3848,14 +3848,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5240,18 +5240,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5260,9 +5262,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5366,7 +5369,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5397,13 +5400,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6242,10 +6245,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6257,24 +6260,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6285,33 +6288,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6321,11 +6324,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6350,16 +6353,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6675,12 +6678,12 @@ for (coordinate, index) in LUT: @@ -6688,7 +6691,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -7133,16 +7136,16 @@ findClosest(start, p, r, LUT): @@ -7156,13 +7159,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7170,14 +7173,14 @@ findClosest(start, p, r, LUT): @@ -7185,18 +7188,18 @@ findClosest(start, p, r, LUT): @@ -7205,14 +7208,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7222,14 +7225,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7332,13 +7335,13 @@ findClosest(start, p, r, LUT): @@ -7745,18 +7748,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8299,19 +8302,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8319,19 +8322,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8428,7 +8431,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9248,13 +9251,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9402,14 +9405,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9417,14 +9420,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9703,13 +9706,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9719,11 +9722,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9755,11 +9758,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9770,11 +9773,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/zh-CN/index.html b/docs/zh-CN/index.html index c70790ca..f675205a 100644 --- a/docs/zh-CN/index.html +++ b/docs/zh-CN/index.html @@ -41,7 +41,7 @@ - + @@ -510,17 +510,17 @@ - +

让我们来通过实际操作看一下:下面的图形都是可交互的,因此你可以通过上下键来增加或减少插值距离,来观察图形的变化。我们从三个点构成的两条线段开始。通过对各条线段进行线性插值得到两个点,对点之间的线段再进行线性插值,产生一个新的点。最终这些点——所有的点都可以通过选取不同的距离插值产生——构成了贝塞尔曲线 : @@ -645,15 +645,15 @@ @@ -681,19 +681,19 @@ 还有一个简单的办法可以弄清参数项怎么工作的:如果我们将(1-t)重命名为a,将t重命名为b,暂时把权重删掉,可以得到这个:

@@ -703,14 +703,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -996,15 +996,15 @@ function Bezier(3,t): 如果我们要改变曲线,就需要改变每个点的权重,有效地改变插值。可以很直接地做到这个:只要用一个值乘以每个点,来改变它的强度。这个值照惯例称为“权重”,我们可以将它加入我们原始的贝塞尔函数:

- +

看起来很复杂,但实际上“权重”只是我们想让曲线所拥有的坐标值:对于一条nth阶曲线,w0是起始坐标,wn是终点坐标,中间的所有点都是控制点坐标。假设说一条曲线的起点为(110,150),终点为(210,30),并受点(25,190)和点(210,250)的控制,贝塞尔曲线方程就为:

@@ -1135,7 +1135,7 @@ function Bezier(3,t,w[]): --> @@ -1335,10 +1335,10 @@ function RationalBezier(3,t,w[],r[]): - +

很显然,起始值需要a=1, b=0,混合值就为100%的value 1和0%的value 2。终点值需要a=0, b=1,则混合值是0%的value 1和100%的value @@ -1347,10 +1347,10 @@ function RationalBezier(3,t,w[],r[]): - +

用这个式子我们可以保证相加的值永远不会超过100%。通过将a限制在区间[0,1],我们将会一直处于这两个值之间(包括这两个端点),并且相加为100%。

@@ -2031,16 +2031,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2470,11 +2470,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2493,12 +2493,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2726,12 +2726,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3051,9 +3051,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3061,27 +3061,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3094,16 +3094,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3689,14 +3689,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5081,18 +5081,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5101,9 +5103,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5207,7 +5210,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5238,13 +5241,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6083,10 +6086,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6098,24 +6101,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6126,33 +6129,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6162,11 +6165,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6191,16 +6194,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6516,12 +6519,12 @@ for (coordinate, index) in LUT: @@ -6529,7 +6532,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6974,16 +6977,16 @@ findClosest(start, p, r, LUT): @@ -6997,13 +7000,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7011,14 +7014,14 @@ findClosest(start, p, r, LUT): @@ -7026,18 +7029,18 @@ findClosest(start, p, r, LUT): @@ -7046,14 +7049,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7063,14 +7066,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7173,13 +7176,13 @@ findClosest(start, p, r, LUT): @@ -7586,18 +7589,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8140,19 +8143,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8160,19 +8163,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8269,7 +8272,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9089,13 +9092,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9243,14 +9246,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9258,14 +9261,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9544,13 +9547,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9560,11 +9563,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9596,11 +9599,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9611,11 +9614,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above.

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/news/2020-09-18.html b/docs/news/2020-09-18.html index 7d762d7c..7d39a659 100644 --- a/docs/news/2020-09-18.html +++ b/docs/news/2020-09-18.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/2020-11-22.html b/docs/news/2020-11-22.html index d34ab120..95fa4ff6 100644 --- a/docs/news/2020-11-22.html +++ b/docs/news/2020-11-22.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/index.html b/docs/news/index.html index 18697a10..6616beec 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -33,7 +33,7 @@ - + diff --git a/docs/news/rss.xml b/docs/news/rss.xml index ff3d7dd6..c28bdd6d 100644 --- a/docs/news/rss.xml +++ b/docs/news/rss.xml @@ -6,7 +6,7 @@ News updates for the primer on Bézier Curves by Pomax en-GB - Thu Feb 04 2021 00:46:16 +00:00 + Sun Feb 28 2021 12:18:43 +00:00 https://pomax.github.io/bezierinfo/images/og-image.png A Primer on Bézier Curves @@ -23,7 +23,7 @@ <p>— <a href="https://twitter.com/TheRealPomax">Pomax</a></p> - Sun Nov 22 2020 00:00:00 +00:00 + Sat Nov 21 2020 16:00:00 +00:00 2020-11-22.html Rewriting the tech stack @@ -119,7 +119,7 @@ draw() { <p>— <a href="https://twitter.com/TheRealPomax">Pomax</a></p> - Fri Sep 18 2020 00:00:00 +00:00 + Thu Sep 17 2020 17:00:00 +00:00 2020-09-18.html diff --git a/docs/ru-RU/index.html b/docs/ru-RU/index.html index 07790e10..fc0ddbe6 100644 --- a/docs/ru-RU/index.html +++ b/docs/ru-RU/index.html @@ -34,7 +34,7 @@ - + @@ -546,19 +546,19 @@ 80ти % до второй, вычислить результат можно следующим образом: