From 4412b983cd928bff78ecf49ced13492c60f96fae Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 14 Aug 2022 16:17:27 -0700 Subject: [PATCH] Move bezier-rs into libraries folder and deploy its interactive docs --- .vscode/settings.json | 2 +- Cargo.lock | 2 +- Cargo.toml | 4 +- bezier-rs/docs/interactive-docs/.gitignore | 24 - .../docs/interactive-docs/public/index.html | 16 - bezier-rs/docs/interactive-docs/tsconfig.json | 39 -- bezier-rs/lib/Cargo.toml | 14 - bezier-rs/lib/README.md | 1 - libraries/bezier-rs/Cargo.toml | 14 + libraries/bezier-rs/LICENSE-APACHE | 201 ++++++++ libraries/bezier-rs/LICENSE-MIT | 17 + libraries/bezier-rs/README.md | 3 + .../lib => libraries/bezier-rs}/src/consts.rs | 0 .../lib => libraries/bezier-rs}/src/lib.rs | 467 ++---------------- .../bezier-rs}/src/structs.rs | 0 .../bezier-rs}/src/subpath/core.rs | 0 .../bezier-rs}/src/subpath/lookup.rs | 0 .../bezier-rs}/src/subpath/mod.rs | 0 .../bezier-rs}/src/subpath/structs.rs | 0 .../lib => libraries/bezier-rs}/src/utils.rs | 4 +- libraries/dyn-any/Cargo.toml | 9 +- .../other/bezier-rs-demos}/.eslintrc.js | 0 website/other/bezier-rs-demos/.gitignore | 5 + .../other/bezier-rs-demos}/README.md | 4 +- .../other/bezier-rs-demos}/package-lock.json | 4 +- .../other/bezier-rs-demos}/package.json | 2 +- .../other/bezier-rs-demos}/src/App.vue | 0 .../src/components/BezierDrawing.ts | 0 .../src/components/Example.vue | 0 .../src/components/ExamplePane.vue | 0 .../src/components/SliderExample.vue | 0 .../src/components/SubpathExample.vue | 0 .../src/components/SubpathExamplePane.vue | 0 .../other/bezier-rs-demos}/src/main.ts | 0 .../other/bezier-rs-demos}/src/shims-vue.d.ts | 0 .../bezier-rs-demos}/src/utils/drawing.ts | 0 .../other/bezier-rs-demos}/src/utils/types.ts | 2 +- website/other/bezier-rs-demos/tsconfig.json | 39 ++ .../other/bezier-rs-demos}/vue.config.js | 1 + .../other/bezier-rs-demos}/wasm/Cargo.toml | 2 +- .../other/bezier-rs-demos}/wasm/src/lib.rs | 0 .../bezier-rs-demos}/wasm/src/subpath.rs | 0 .../bezier-rs-demos}/wasm/src/svg_drawing.rs | 0 website/other/build.sh | 20 + 44 files changed, 352 insertions(+), 544 deletions(-) delete mode 100644 bezier-rs/docs/interactive-docs/.gitignore delete mode 100644 bezier-rs/docs/interactive-docs/public/index.html delete mode 100644 bezier-rs/docs/interactive-docs/tsconfig.json delete mode 100644 bezier-rs/lib/Cargo.toml delete mode 100644 bezier-rs/lib/README.md create mode 100644 libraries/bezier-rs/Cargo.toml create mode 100644 libraries/bezier-rs/LICENSE-APACHE create mode 100644 libraries/bezier-rs/LICENSE-MIT create mode 100644 libraries/bezier-rs/README.md rename {bezier-rs/lib => libraries/bezier-rs}/src/consts.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/lib.rs (78%) rename {bezier-rs/lib => libraries/bezier-rs}/src/structs.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/subpath/core.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/subpath/lookup.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/subpath/mod.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/subpath/structs.rs (100%) rename {bezier-rs/lib => libraries/bezier-rs}/src/utils.rs (99%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/.eslintrc.js (100%) create mode 100644 website/other/bezier-rs-demos/.gitignore rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/README.md (88%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/package-lock.json (99%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/package.json (97%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/App.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/BezierDrawing.ts (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/Example.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/ExamplePane.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/SliderExample.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/SubpathExample.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/components/SubpathExamplePane.vue (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/main.ts (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/shims-vue.d.ts (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/utils/drawing.ts (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/src/utils/types.ts (95%) create mode 100644 website/other/bezier-rs-demos/tsconfig.json rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/vue.config.js (98%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/wasm/Cargo.toml (92%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/wasm/src/lib.rs (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/wasm/src/subpath.rs (100%) rename {bezier-rs/docs/interactive-docs => website/other/bezier-rs-demos}/wasm/src/svg_drawing.rs (100%) create mode 100644 website/other/build.sh diff --git a/.vscode/settings.json b/.vscode/settings.json index 236f9618..6a983d88 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,7 +33,7 @@ "eslint.format.enable": true, "eslint.workingDirectories": [ "./frontend", - "./bezier-rs/docs/interactive-docs", + "./website/other/bezier-rs-demos", "./website", ], "eslint.validate": [ diff --git a/Cargo.lock b/Cargo.lock index f9b8ea94..3f581160 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -53,7 +53,7 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bezier-rs" -version = "0.0.0" +version = "0.1.0" dependencies = [ "glam", ] diff --git a/Cargo.toml b/Cargo.toml index 0d9898a5..a7903fd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,12 +4,12 @@ members = [ "graphene", "proc-macros", "frontend/wasm", - "bezier-rs/lib", - "bezier-rs/docs/interactive-docs/wasm", "node-graph/gcore", "node-graph/gstd", "node-graph/borrow_stack", "libraries/dyn-any", + "libraries/bezier-rs", + "website/other/bezier-rs-demos/wasm", ] [profile.release.package.graphite-wasm] diff --git a/bezier-rs/docs/interactive-docs/.gitignore b/bezier-rs/docs/interactive-docs/.gitignore deleted file mode 100644 index 6c989bbb..00000000 --- a/bezier-rs/docs/interactive-docs/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -.DS_Store -node_modules -/dist -/wasm/pkg - - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/bezier-rs/docs/interactive-docs/public/index.html b/bezier-rs/docs/interactive-docs/public/index.html deleted file mode 100644 index 00999673..00000000 --- a/bezier-rs/docs/interactive-docs/public/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Bezier-rs Interactive Docs - - - - -
- - - diff --git a/bezier-rs/docs/interactive-docs/tsconfig.json b/bezier-rs/docs/interactive-docs/tsconfig.json deleted file mode 100644 index 79747f7e..00000000 --- a/bezier-rs/docs/interactive-docs/tsconfig.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "esnext", - "strict": true, - "jsx": "preserve", - "importHelpers": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "sourceMap": true, - "baseUrl": ".", - "types": [ - "node" - ], - "paths": { - "@/*": [ - "src/*" - ] - }, - "lib": [ - "esnext", - "dom", - "dom.iterable", - "scripthost" - ] - }, - "include": [ - "src/**/*.ts", - "src/**/*.d.ts", - "src/**/*.vue", - "tests/**/*.ts", - ], - "exclude": [ - "node_modules" - ] -} diff --git a/bezier-rs/lib/Cargo.toml b/bezier-rs/lib/Cargo.toml deleted file mode 100644 index a3389d9c..00000000 --- a/bezier-rs/lib/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "bezier-rs" -publish = false -version = "0.0.0" -rust-version = "1.62.0" -authors = ["Graphite Authors "] -edition = "2021" -readme = "./README.md" -homepage = "https://graphite.rs" -repository = "https://github.com/GraphiteEditor/Graphite" -license = "Apache-2.0" - -[dependencies] -glam = { version = "0.17", features = ["serde"] } diff --git a/bezier-rs/lib/README.md b/bezier-rs/lib/README.md deleted file mode 100644 index 0a32ad76..00000000 --- a/bezier-rs/lib/README.md +++ /dev/null @@ -1 +0,0 @@ -# Bezier-rs: Bezier Math Library diff --git a/libraries/bezier-rs/Cargo.toml b/libraries/bezier-rs/Cargo.toml new file mode 100644 index 00000000..23de1f4b --- /dev/null +++ b/libraries/bezier-rs/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "bezier-rs" +version = "0.1.0" +rust-version = "1.62.0" +edition = "2021" +authors = ["Graphite Authors "] +description = "A wide assortment of useful math functions for Bezier segments and shapes." +license = "MIT OR Apache-2.0" +readme = "./README.md" +homepage = "https://graphite.rs/libraries/bezier-rs" +repository = "https://github.com/GraphiteEditor/Graphite/libraries/bezier-rs" + +[dependencies] +glam = { version = "0.17", features = ["serde"] } diff --git a/libraries/bezier-rs/LICENSE-APACHE b/libraries/bezier-rs/LICENSE-APACHE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/libraries/bezier-rs/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/libraries/bezier-rs/LICENSE-MIT b/libraries/bezier-rs/LICENSE-MIT new file mode 100644 index 00000000..969d061e --- /dev/null +++ b/libraries/bezier-rs/LICENSE-MIT @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/libraries/bezier-rs/README.md b/libraries/bezier-rs/README.md new file mode 100644 index 00000000..c27dfb1d --- /dev/null +++ b/libraries/bezier-rs/README.md @@ -0,0 +1,3 @@ +# Bezier-rs + +A wide assortment of useful math functions for Bezier segments and shapes. diff --git a/bezier-rs/lib/src/consts.rs b/libraries/bezier-rs/src/consts.rs similarity index 100% rename from bezier-rs/lib/src/consts.rs rename to libraries/bezier-rs/src/consts.rs diff --git a/bezier-rs/lib/src/lib.rs b/libraries/bezier-rs/src/lib.rs similarity index 78% rename from bezier-rs/lib/src/lib.rs rename to libraries/bezier-rs/src/lib.rs index 5e8b13d5..f0908c7f 100644 --- a/bezier-rs/lib/src/lib.rs +++ b/libraries/bezier-rs/src/lib.rs @@ -1170,9 +1170,9 @@ mod tests { p1.abs_diff_eq(p2, MAX_ABSOLUTE_DIFFERENCE) } - // Compare vecs of points by allowing some maximum absolute difference to account for floating point errors - fn compare_vec_of_points(a: Vec, b: Vec, max_absolute_difference: f64) -> bool { - a.len() == b.len() && a.into_iter().zip(b.into_iter()).all(|(p1, p2)| p1.abs_diff_eq(p2, max_absolute_difference)) + // Compare vectors of points by allowing some maximum absolute difference to account for floating point errors + fn compare_vector_of_points(a: Vec, b: Vec) -> bool { + a.len() == b.len() && a.into_iter().zip(b.into_iter()).all(|(p1, p2)| p1.abs_diff_eq(p2, MAX_ABSOLUTE_DIFFERENCE)) } // Compare vectors of beziers by allowing some maximum absolute difference between points to account for floating point errors @@ -1180,7 +1180,7 @@ mod tests { beziers .iter() .zip(expected_bezier_points.iter()) - .all(|(&a, b)| compare_vec_of_points(a.get_points().collect::>(), b.to_vec(), MAX_ABSOLUTE_DIFFERENCE)) + .all(|(&a, b)| compare_vector_of_points(a.get_points().collect::>(), b.to_vec())) } // Compare circle arcs by allowing some maximum absolute difference between values to account for floating point errors @@ -1191,8 +1191,13 @@ mod tests { && utils::f64_compare(arc1.end_angle, arc2.end_angle, MAX_ABSOLUTE_DIFFERENCE) } + // Compare vectors of points with some maximum allowed absolute difference between the values + fn compare_vec_of_points(vec1: Vec, vec2: Vec, max_absolute_difference: f64) -> bool { + vec1.into_iter().zip(vec2).all(|(p1, p2)| p1.abs_diff_eq(p2, max_absolute_difference)) + } + #[test] - fn test_quadratic_through_points() { + fn test_quadratic_from_points() { let p1 = DVec2::new(30., 50.); let p2 = DVec2::new(140., 30.); let p3 = DVec2::new(160., 170.); @@ -1223,382 +1228,16 @@ mod tests { assert!(compare_points(bezier3.evaluate(0.), p2)); } - #[test] - fn test_evaluate() { - let p1 = DVec2::new(3., 5.); - let p2 = DVec2::new(14., 3.); - let p3 = DVec2::new(19., 14.); - let p4 = DVec2::new(30., 21.); - - let bezier1 = Bezier::from_quadratic_dvec2(p1, p2, p3); - assert_eq!(bezier1.evaluate(0.5), DVec2::new(12.5, 6.25)); - - let bezier2 = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - assert_eq!(bezier2.evaluate(0.5), DVec2::new(16.5, 9.625)); - } - - #[test] - fn test_compute_lookup_table() { - let bezier1 = Bezier::from_quadratic_coordinates(10., 10., 30., 30., 50., 10.); - let lookup_table1 = bezier1.compute_lookup_table(Some(2)); - assert_eq!(lookup_table1, vec![bezier1.start(), bezier1.evaluate(0.5), bezier1.end()]); - - let bezier2 = Bezier::from_cubic_coordinates(10., 10., 30., 30., 70., 70., 90., 10.); - let lookup_table2 = bezier2.compute_lookup_table(Some(4)); - assert_eq!( - lookup_table2, - vec![bezier2.start(), bezier2.evaluate(0.25), bezier2.evaluate(0.5), bezier2.evaluate(0.75), bezier2.end()] - ); - } - - #[test] - fn test_length() { - let p1 = DVec2::new(30., 50.); - let p2 = DVec2::new(140., 30.); - let p3 = DVec2::new(160., 170.); - let p4 = DVec2::new(77., 129.); - - let bezier_linear = Bezier::from_linear_dvec2(p1, p2); - assert!(utils::f64_compare(bezier_linear.length(None), p1.distance(p2), MAX_ABSOLUTE_DIFFERENCE)); - - let bezier_quadratic = Bezier::from_quadratic_dvec2(p1, p2, p3); - assert!(utils::f64_compare(bezier_quadratic.length(None), 204., 1e-2)); - - let bezier_cubic = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - assert!(utils::f64_compare(bezier_cubic.length(None), 199., 1e-2)); - } - - #[test] - fn test_derivative() { - // Test derivatives of each Bezier curve type - let p1 = DVec2::new(10., 10.); - let p2 = DVec2::new(40., 30.); - let p3 = DVec2::new(60., 60.); - let p4 = DVec2::new(70., 100.); - - let linear = Bezier::from_linear_dvec2(p1, p2); - assert!(linear.derivative().is_none()); - - let quadratic = Bezier::from_quadratic_dvec2(p1, p2, p3); - let derivative_quadratic = quadratic.derivative().unwrap(); - assert_eq!(derivative_quadratic, Bezier::from_linear_coordinates(60., 40., 40., 60.)); - - let cubic = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - let derivative_cubic = cubic.derivative().unwrap(); - assert_eq!(derivative_cubic, Bezier::from_quadratic_coordinates(90., 60., 60., 90., 30., 120.)); - - // Cases where the all manipulator points are the same - let quadratic_point = Bezier::from_quadratic_dvec2(p1, p1, p1); - assert_eq!(quadratic_point.derivative().unwrap(), Bezier::from_linear_dvec2(DVec2::ZERO, DVec2::ZERO)); - - let cubic_point = Bezier::from_cubic_dvec2(p1, p1, p1, p1); - assert_eq!(cubic_point.derivative().unwrap(), Bezier::from_quadratic_dvec2(DVec2::ZERO, DVec2::ZERO, DVec2::ZERO)); - } - - #[test] - fn test_tangent() { - // Test tangents at start and end points of each Bezier curve type - let p1 = DVec2::new(10., 10.); - let p2 = DVec2::new(40., 30.); - let p3 = DVec2::new(60., 60.); - let p4 = DVec2::new(70., 100.); - - let linear = Bezier::from_linear_dvec2(p1, p2); - let unit_slope = DVec2::new(30., 20.).normalize(); - assert_eq!(linear.tangent(0.), unit_slope); - assert_eq!(linear.tangent(1.), unit_slope); - - let quadratic = Bezier::from_quadratic_dvec2(p1, p2, p3); - assert_eq!(quadratic.tangent(0.), DVec2::new(60., 40.).normalize()); - assert_eq!(quadratic.tangent(1.), DVec2::new(40., 60.).normalize()); - - let cubic = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - assert_eq!(cubic.tangent(0.), DVec2::new(90., 60.).normalize()); - assert_eq!(cubic.tangent(1.), DVec2::new(30., 120.).normalize()); - } - - #[test] - fn test_normal() { - // Test normals at start and end points of each Bezier curve type - let p1 = DVec2::new(10., 10.); - let p2 = DVec2::new(40., 30.); - let p3 = DVec2::new(60., 60.); - let p4 = DVec2::new(70., 100.); - - let linear = Bezier::from_linear_dvec2(p1, p2); - let unit_slope = DVec2::new(-20., 30.).normalize(); - assert_eq!(linear.normal(0.), unit_slope); - assert_eq!(linear.normal(1.), unit_slope); - - let quadratic = Bezier::from_quadratic_dvec2(p1, p2, p3); - assert_eq!(quadratic.normal(0.), DVec2::new(-40., 60.).normalize()); - assert_eq!(quadratic.normal(1.), DVec2::new(-60., 40.).normalize()); - - let cubic = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - assert_eq!(cubic.normal(0.), DVec2::new(-60., 90.).normalize()); - assert_eq!(cubic.normal(1.), DVec2::new(-120., 30.).normalize()); - } - - #[test] - fn test_curvature() { - let p1 = DVec2::new(10., 10.); - let p2 = DVec2::new(50., 10.); - let p3 = DVec2::new(50., 50.); - let p4 = DVec2::new(50., 10.); - - let linear = Bezier::from_linear_dvec2(p1, p2); - assert_eq!(linear.curvature(0.), 0.); - assert_eq!(linear.curvature(0.5), 0.); - assert_eq!(linear.curvature(1.), 0.); - - let quadratic = Bezier::from_quadratic_dvec2(p1, p2, p3); - assert_eq!(quadratic.curvature(0.), 0.0125); - assert_eq!(quadratic.curvature(0.5), 0.035355339059327376); - assert_eq!(quadratic.curvature(1.), 0.0125); - - let cubic = Bezier::from_cubic_dvec2(p1, p2, p3, p4); - assert_eq!(cubic.curvature(0.), 0.016666666666666666); - assert_eq!(cubic.curvature(0.5), 0.); - assert_eq!(cubic.curvature(1.), 0.); - - // The curvature at an inflection point is zero - let inflection_curve = Bezier::from_cubic_coordinates(30., 30., 30., 150., 150., 30., 150., 150.); - let inflections = inflection_curve.inflections(); - assert_eq!(inflection_curve.curvature(inflections[0]), 0.); - } - - #[test] - fn test_split() { - let line = Bezier::from_linear_coordinates(25., 25., 75., 75.); - let [part1, part2] = line.split(0.5); - - assert_eq!(part1.start(), line.start()); - assert_eq!(part1.end(), line.evaluate(0.5)); - assert_eq!(part1.evaluate(0.5), line.evaluate(0.25)); - - assert_eq!(part2.start(), line.evaluate(0.5)); - assert_eq!(part2.end(), line.end()); - assert_eq!(part2.evaluate(0.5), line.evaluate(0.75)); - - let quad_bezier = Bezier::from_quadratic_coordinates(10., 10., 50., 50., 90., 10.); - let [part3, part4] = quad_bezier.split(0.5); - - assert_eq!(part3.start(), quad_bezier.start()); - assert_eq!(part3.end(), quad_bezier.evaluate(0.5)); - assert_eq!(part3.evaluate(0.5), quad_bezier.evaluate(0.25)); - - assert_eq!(part4.start(), quad_bezier.evaluate(0.5)); - assert_eq!(part4.end(), quad_bezier.end()); - assert_eq!(part4.evaluate(0.5), quad_bezier.evaluate(0.75)); - - let cubic_bezier = Bezier::from_cubic_coordinates(10., 10., 50., 50., 90., 10., 40., 50.); - let [part5, part6] = cubic_bezier.split(0.5); - - assert_eq!(part5.start(), cubic_bezier.start()); - assert_eq!(part5.end(), cubic_bezier.evaluate(0.5)); - assert_eq!(part5.evaluate(0.5), cubic_bezier.evaluate(0.25)); - - assert_eq!(part6.start(), cubic_bezier.evaluate(0.5)); - assert_eq!(part6.end(), cubic_bezier.end()); - assert_eq!(part6.evaluate(0.5), cubic_bezier.evaluate(0.75)); - } - - #[test] - fn test_split_at_anchors() { - let start = DVec2::new(30., 50.); - let end = DVec2::new(160., 170.); - - let bezier_quadratic = Bezier::from_quadratic_dvec2(start, DVec2::new(140., 30.), end); - - // Test splitting a quadratic bezier at the startpoint - let [point_bezier1, remainder1] = bezier_quadratic.split(0.); - assert_eq!(point_bezier1, Bezier::from_quadratic_dvec2(start, start, start)); - assert!(remainder1.abs_diff_eq(&bezier_quadratic, MAX_ABSOLUTE_DIFFERENCE)); - - // Test splitting a quadratic bezier at the endpoint - let [remainder2, point_bezier2] = bezier_quadratic.split(1.); - assert_eq!(point_bezier2, Bezier::from_quadratic_dvec2(end, end, end)); - assert!(remainder2.abs_diff_eq(&bezier_quadratic, MAX_ABSOLUTE_DIFFERENCE)); - - let bezier_cubic = Bezier::from_cubic_dvec2(start, DVec2::new(60., 140.), DVec2::new(150., 30.), end); - - // Test splitting a cubic bezier at the startpoint - let [point_bezier3, remainder3] = bezier_cubic.split(0.); - assert_eq!(point_bezier3, Bezier::from_cubic_dvec2(start, start, start, start)); - assert!(remainder3.abs_diff_eq(&bezier_cubic, MAX_ABSOLUTE_DIFFERENCE)); - - // Test splitting a cubic bezier at the endpoint - let [remainder4, point_bezier4] = bezier_cubic.split(1.); - assert_eq!(point_bezier4, Bezier::from_cubic_dvec2(end, end, end, end)); - assert!(remainder4.abs_diff_eq(&bezier_cubic, MAX_ABSOLUTE_DIFFERENCE)); - } - - #[test] - fn test_trim() { - let line = Bezier::from_linear_coordinates(80., 80., 40., 40.); - let trimmed1 = line.trim(0.25, 0.75); - - assert_eq!(trimmed1.start(), line.evaluate(0.25)); - assert_eq!(trimmed1.end(), line.evaluate(0.75)); - assert_eq!(trimmed1.evaluate(0.5), line.evaluate(0.5)); - - let quadratic_bezier = Bezier::from_quadratic_coordinates(80., 80., 40., 40., 70., 70.); - let trimmed2 = quadratic_bezier.trim(0.25, 0.75); - - assert_eq!(trimmed2.start(), quadratic_bezier.evaluate(0.25)); - assert_eq!(trimmed2.end(), quadratic_bezier.evaluate(0.75)); - assert_eq!(trimmed2.evaluate(0.5), quadratic_bezier.evaluate(0.5)); - - let cubic_bezier = Bezier::from_cubic_coordinates(80., 80., 40., 40., 70., 70., 150., 150.); - let trimmed3 = cubic_bezier.trim(0.25, 0.75); - - assert_eq!(trimmed3.start(), cubic_bezier.evaluate(0.25)); - assert_eq!(trimmed3.end(), cubic_bezier.evaluate(0.75)); - assert_eq!(trimmed3.evaluate(0.5), cubic_bezier.evaluate(0.5)); - } - - #[test] - fn test_trim_t2_greater_than_t1() { - // Test trimming quadratic curve when t2 > t1 - let bezier_quadratic = Bezier::from_quadratic_coordinates(30., 50., 140., 30., 160., 170.); - let trim1 = bezier_quadratic.trim(0.25, 0.75); - let trim2 = bezier_quadratic.trim(0.75, 0.25); - assert!(trim1.abs_diff_eq(&trim2, MAX_ABSOLUTE_DIFFERENCE)); - - // Test trimming cubic curve when t2 > t1 - let bezier_cubic = Bezier::from_cubic_coordinates(30., 30., 60., 140., 150., 30., 160., 160.); - let trim3 = bezier_cubic.trim(0.25, 0.75); - let trim4 = bezier_cubic.trim(0.75, 0.25); - assert!(trim3.abs_diff_eq(&trim4, MAX_ABSOLUTE_DIFFERENCE)); - } - #[test] fn test_project() { let project_options = ProjectionOptions::default(); let bezier1 = Bezier::from_cubic_coordinates(4., 4., 23., 45., 10., 30., 56., 90.); - assert_eq!(bezier1.project(DVec2::new(100., 100.), project_options), 1.); - assert_eq!(bezier1.project(DVec2::ZERO, project_options), 0.); + assert!(bezier1.evaluate(bezier1.project(DVec2::new(100., 100.), project_options)) == DVec2::new(56., 90.)); + assert!(bezier1.evaluate(bezier1.project(DVec2::new(0., 0.), project_options)) == DVec2::new(4., 4.)); let bezier2 = Bezier::from_quadratic_coordinates(0., 0., 0., 100., 100., 100.); - assert_eq!(bezier2.project(DVec2::new(100., 0.), project_options), 0.); - } - - #[test] - fn test_extrema_linear() { - // Linear bezier cannot have extrema - let line = Bezier::from_linear_dvec2(DVec2::new(10., 10.), DVec2::new(50., 50.)); - let [x_extrema, y_extrema] = line.local_extrema(); - assert!(x_extrema.is_empty()); - assert!(y_extrema.is_empty()); - } - - #[test] - fn test_extrema_quadratic() { - // Test with no x-extrema, no y-extrema - let bezier1 = Bezier::from_quadratic_coordinates(40., 35., 149., 54., 155., 170.); - let [x_extrema1, y_extrema1] = bezier1.local_extrema(); - assert!(x_extrema1.is_empty()); - assert!(y_extrema1.is_empty()); - - // Test with 1 x-extrema, no y-extrema - let bezier2 = Bezier::from_quadratic_coordinates(45., 30., 170., 90., 45., 150.); - let [x_extrema2, y_extrema2] = bezier2.local_extrema(); - assert_eq!(x_extrema2.len(), 1); - assert!(y_extrema2.is_empty()); - - // Test with no x-extrema, 1 y-extrema - let bezier3 = Bezier::from_quadratic_coordinates(30., 130., 100., 25., 150., 130.); - let [x_extrema3, y_extrema3] = bezier3.local_extrema(); - assert!(x_extrema3.is_empty()); - assert_eq!(y_extrema3.len(), 1); - - // Test with 1 x-extrema, 1 y-extrema - let bezier4 = Bezier::from_quadratic_coordinates(50., 70., 170., 35., 60., 150.); - let [x_extrema4, y_extrema4] = bezier4.local_extrema(); - assert_eq!(x_extrema4.len(), 1); - assert_eq!(y_extrema4.len(), 1); - } - - #[test] - fn test_extrema_cubic() { - // 0 x-extrema, 0 y-extrema - let bezier1 = Bezier::from_cubic_coordinates(100., 105., 250., 250., 110., 150., 260., 260.); - let [x_extrema1, y_extrema1] = bezier1.local_extrema(); - assert!(x_extrema1.is_empty()); - assert!(y_extrema1.is_empty()); - - // 1 x-extrema, 0 y-extrema - let bezier2 = Bezier::from_cubic_coordinates(55., 145., 40., 40., 110., 110., 180., 40.); - let [x_extrema2, y_extrema2] = bezier2.local_extrema(); - assert_eq!(x_extrema2.len(), 1); - assert!(y_extrema2.is_empty()); - - // 1 x-extrema, 1 y-extrema - let bezier3 = Bezier::from_cubic_coordinates(100., 105., 170., 10., 25., 20., 20., 120.); - let [x_extrema3, y_extrema3] = bezier3.local_extrema(); - assert_eq!(x_extrema3.len(), 1); - assert_eq!(y_extrema3.len(), 1); - - // 1 x-extrema, 2 y-extrema - let bezier4 = Bezier::from_cubic_coordinates(50., 90., 120., 16., 150., 190., 45., 150.); - let [x_extrema4, y_extrema4] = bezier4.local_extrema(); - assert_eq!(x_extrema4.len(), 1); - assert_eq!(y_extrema4.len(), 2); - - // 2 x-extrema, 0 y-extrema - let bezier5 = Bezier::from_cubic_coordinates(40., 170., 150., 160., 10., 10., 170., 10.); - let [x_extrema5, y_extrema5] = bezier5.local_extrema(); - assert_eq!(x_extrema5.len(), 2); - assert!(y_extrema5.is_empty()); - - // 2 x-extrema, 1 y-extrema - let bezier6 = Bezier::from_cubic_coordinates(40., 170., 150., 160., 10., 10., 160., 45.); - let [x_extrema6, y_extrema6] = bezier6.local_extrema(); - assert_eq!(x_extrema6.len(), 2); - assert_eq!(y_extrema6.len(), 1); - - // 2 x-extrema, 2 y-extrema - let bezier7 = Bezier::from_cubic_coordinates(46., 60., 140., 10., 50., 160., 120., 120.); - let [x_extrema7, y_extrema7] = bezier7.local_extrema(); - assert_eq!(x_extrema7.len(), 2); - assert_eq!(y_extrema7.len(), 2); - } - - #[test] - fn test_rotate() { - let bezier_linear = Bezier::from_linear_coordinates(30., 60., 140., 120.); - let rotated_bezier_linear = bezier_linear.rotate(-PI / 2.); - let expected_bezier_linear = Bezier::from_linear_coordinates(60., -30., 120., -140.); - assert!(rotated_bezier_linear.abs_diff_eq(&expected_bezier_linear, MAX_ABSOLUTE_DIFFERENCE)); - - let bezier_quadratic = Bezier::from_quadratic_coordinates(30., 50., 140., 30., 160., 170.); - let rotated_bezier_quadratic = bezier_quadratic.rotate(PI); - let expected_bezier_quadratic = Bezier::from_quadratic_coordinates(-30., -50., -140., -30., -160., -170.); - assert!(rotated_bezier_quadratic.abs_diff_eq(&expected_bezier_quadratic, MAX_ABSOLUTE_DIFFERENCE)); - - let bezier = Bezier::from_cubic_coordinates(30., 30., 60., 140., 150., 30., 160., 160.); - let rotated_bezier = bezier.rotate(PI / 2.); - let expected_bezier = Bezier::from_cubic_coordinates(-30., 30., -140., 60., -30., 150., -160., 160.); - assert!(rotated_bezier.abs_diff_eq(&expected_bezier, MAX_ABSOLUTE_DIFFERENCE)); - } - - #[test] - fn test_translate() { - let bezier_linear = Bezier::from_linear_coordinates(30., 60., 140., 120.); - let rotated_bezier_linear = bezier_linear.translate(DVec2::new(10., 10.)); - let expected_bezier_linear = Bezier::from_linear_coordinates(40., 70., 150., 130.); - assert!(rotated_bezier_linear.abs_diff_eq(&expected_bezier_linear, MAX_ABSOLUTE_DIFFERENCE)); - - let bezier_quadratic = Bezier::from_quadratic_coordinates(30., 50., 140., 30., 160., 170.); - let rotated_bezier_quadratic = bezier_quadratic.translate(DVec2::new(-10., 10.)); - let expected_bezier_quadratic = Bezier::from_quadratic_coordinates(20., 60., 130., 40., 150., 180.); - assert!(rotated_bezier_quadratic.abs_diff_eq(&expected_bezier_quadratic, MAX_ABSOLUTE_DIFFERENCE)); - - let bezier = Bezier::from_cubic_coordinates(30., 30., 60., 140., 150., 30., 160., 160.); - let translated_bezier = bezier.translate(DVec2::new(10., -10.)); - let expected_bezier = Bezier::from_cubic_coordinates(40., 20., 70., 130., 160., 20., 170., 150.); - assert!(translated_bezier.abs_diff_eq(&expected_bezier, MAX_ABSOLUTE_DIFFERENCE)); + assert!(bezier2.evaluate(bezier2.project(DVec2::new(100., 0.), project_options)) == DVec2::new(0., 0.)); } #[test] @@ -1688,18 +1327,29 @@ mod tests { } #[test] - fn test_de_casteljau_points() { - let bezier = Bezier::from_cubic_coordinates(0., 0., 0., 100., 100., 100., 100., 0.); - let de_casteljau_points = bezier.de_casteljau_points(0.5); - let expected_de_casteljau_points = vec![ - vec![DVec2::new(0., 0.), DVec2::new(0., 100.), DVec2::new(100., 100.), DVec2::new(100., 0.)], - vec![DVec2::new(0., 50.), DVec2::new(50., 100.), DVec2::new(100., 50.)], - vec![DVec2::new(25., 75.), DVec2::new(75., 75.)], - vec![DVec2::new(50., 75.)], + fn test_offset() { + let p1 = DVec2::new(30., 50.); + let p2 = DVec2::new(140., 30.); + let p3 = DVec2::new(160., 170.); + let bezier1 = Bezier::from_quadratic_dvec2(p1, p2, p3); + let expected_bezier_points1 = vec![ + vec![DVec2::new(31.7888, 59.8387), DVec2::new(44.5924, 57.46446), DVec2::new(56.09375, 57.5)], + vec![DVec2::new(56.09375, 57.5), DVec2::new(94.94197, 56.5019), DVec2::new(117.6473, 84.5936)], + vec![DVec2::new(117.6473, 84.5936), DVec2::new(142.3985, 113.403), DVec2::new(150.1005, 171.4142)], ]; - assert_eq!(&de_casteljau_points, &expected_de_casteljau_points); + assert!(compare_vector_of_beziers(&bezier1.offset(10.), expected_bezier_points1)); - assert_eq!(expected_de_casteljau_points[3][0], bezier.evaluate(0.5)) + let p4 = DVec2::new(32., 77.); + let p5 = DVec2::new(169., 25.); + let p6 = DVec2::new(164., 157.); + let bezier2 = Bezier::from_quadratic_dvec2(p4, p5, p6); + let expected_bezier_points2 = vec![ + vec![DVec2::new(42.6458, 105.04758), DVec2::new(75.0218, 91.9939), DVec2::new(98.09357, 92.3043)], + vec![DVec2::new(98.09357, 92.3043), DVec2::new(116.5995, 88.5479), DVec2::new(123.9055, 102.0401)], + vec![DVec2::new(123.9055, 102.0401), DVec2::new(136.6087, 116.9522), DVec2::new(134.1761, 147.9324)], + vec![DVec2::new(134.1761, 147.9324), DVec2::new(134.1812, 151.7987), DVec2::new(134.0215, 155.86445)], + ]; + assert!(compare_vector_of_beziers(&bezier2.offset(30.), expected_bezier_points2)); } #[test] @@ -1794,53 +1444,4 @@ mod tests { // The remaining results (index 2 onwards) should match the results where MaximizeArcs::Off from the next extrema point onwards (after index 2). assert!(auto_arcs.iter().skip(2).zip(extrema_arcs.iter().skip(2)).all(|(arc1, arc2)| compare_arcs(*arc1, *arc2))); } - - #[test] - fn test_bounding_box() { - // Case where the start and end points dictate the bounding box - let bezier_simple = Bezier::from_linear_coordinates(0., 0., 10., 10.); - assert_eq!(bezier_simple.bounding_box(), [DVec2::new(0., 0.), DVec2::new(10., 10.)]); - - // Case where the curve's extrema dictate the bounding box - let bezier_complex = Bezier::from_cubic_coordinates(90., 70., 25., 25., 175., 175., 110., 130.); - assert!(compare_vec_of_points( - bezier_complex.bounding_box().to_vec(), - vec![DVec2::new(73.2774, 61.4755), DVec2::new(126.7226, 138.5245)], - 1e-3 - )); - } - - #[test] - fn test_inflections() { - let bezier = Bezier::from_cubic_coordinates(30., 30., 30., 150., 150., 30., 150., 150.); - let inflections = bezier.inflections(); - assert_eq!(inflections.len(), 1); - assert_eq!(inflections[0], 0.5); - } - - #[test] - fn test_offset() { - let p1 = DVec2::new(30., 50.); - let p2 = DVec2::new(140., 30.); - let p3 = DVec2::new(160., 170.); - let bezier1 = Bezier::from_quadratic_dvec2(p1, p2, p3); - let expected_bezier_points1 = vec![ - vec![DVec2::new(31.7888, 59.8387), DVec2::new(44.5924, 57.46446), DVec2::new(56.09375, 57.5)], - vec![DVec2::new(56.09375, 57.5), DVec2::new(94.94197, 56.5019), DVec2::new(117.6473, 84.5936)], - vec![DVec2::new(117.6473, 84.5936), DVec2::new(142.3985, 113.403), DVec2::new(150.1005, 171.4142)], - ]; - assert!(compare_vector_of_beziers(&bezier1.offset(10.), expected_bezier_points1)); - - let p4 = DVec2::new(32., 77.); - let p5 = DVec2::new(169., 25.); - let p6 = DVec2::new(164., 157.); - let bezier2 = Bezier::from_quadratic_dvec2(p4, p5, p6); - let expected_bezier_points2 = vec![ - vec![DVec2::new(42.6458, 105.04758), DVec2::new(75.0218, 91.9939), DVec2::new(98.09357, 92.3043)], - vec![DVec2::new(98.09357, 92.3043), DVec2::new(116.5995, 88.5479), DVec2::new(123.9055, 102.0401)], - vec![DVec2::new(123.9055, 102.0401), DVec2::new(136.6087, 116.9522), DVec2::new(134.1761, 147.9324)], - vec![DVec2::new(134.1761, 147.9324), DVec2::new(134.1812, 151.7987), DVec2::new(134.0215, 155.86445)], - ]; - assert!(compare_vector_of_beziers(&bezier2.offset(30.), expected_bezier_points2)); - } } diff --git a/bezier-rs/lib/src/structs.rs b/libraries/bezier-rs/src/structs.rs similarity index 100% rename from bezier-rs/lib/src/structs.rs rename to libraries/bezier-rs/src/structs.rs diff --git a/bezier-rs/lib/src/subpath/core.rs b/libraries/bezier-rs/src/subpath/core.rs similarity index 100% rename from bezier-rs/lib/src/subpath/core.rs rename to libraries/bezier-rs/src/subpath/core.rs diff --git a/bezier-rs/lib/src/subpath/lookup.rs b/libraries/bezier-rs/src/subpath/lookup.rs similarity index 100% rename from bezier-rs/lib/src/subpath/lookup.rs rename to libraries/bezier-rs/src/subpath/lookup.rs diff --git a/bezier-rs/lib/src/subpath/mod.rs b/libraries/bezier-rs/src/subpath/mod.rs similarity index 100% rename from bezier-rs/lib/src/subpath/mod.rs rename to libraries/bezier-rs/src/subpath/mod.rs diff --git a/bezier-rs/lib/src/subpath/structs.rs b/libraries/bezier-rs/src/subpath/structs.rs similarity index 100% rename from bezier-rs/lib/src/subpath/structs.rs rename to libraries/bezier-rs/src/subpath/structs.rs diff --git a/bezier-rs/lib/src/utils.rs b/libraries/bezier-rs/src/utils.rs similarity index 99% rename from bezier-rs/lib/src/utils.rs rename to libraries/bezier-rs/src/utils.rs index 2c45228a..2b57e2f0 100644 --- a/bezier-rs/lib/src/utils.rs +++ b/libraries/bezier-rs/src/utils.rs @@ -58,12 +58,12 @@ pub fn solve_linear(a: f64, b: f64) -> Vec { /// Precompute the `discriminant` (`b^2 - 4ac`) and `two_times_a` arguments prior to calling this function for efficiency purposes. pub fn solve_quadratic(discriminant: f64, two_times_a: f64, b: f64, c: f64) -> Vec { let mut roots = Vec::new(); - if two_times_a.abs() > MAX_ABSOLUTE_DIFFERENCE { + if two_times_a != 0. { if discriminant > 0. { let root_discriminant = discriminant.sqrt(); roots.push((-b + root_discriminant) / (two_times_a)); roots.push((-b - root_discriminant) / (two_times_a)); - } else if discriminant.abs() < MAX_ABSOLUTE_DIFFERENCE { + } else if discriminant == 0. { roots.push(-b / (two_times_a)); } } else { diff --git a/libraries/dyn-any/Cargo.toml b/libraries/dyn-any/Cargo.toml index 6ca98dfa..9e687292 100644 --- a/libraries/dyn-any/Cargo.toml +++ b/libraries/dyn-any/Cargo.toml @@ -1,14 +1,15 @@ [package] name = "dyn-any" version = "0.2.1" +rust-version = "1.62.0" edition = "2021" authors = ["Graphite Authors "] - - description = "An Any trait that works for arbitrary lifetimes" -documentation = "https://docs.rs/dyn-any" license = "MIT OR Apache-2.0" -readme = "README.md" +readme = "./README.md" +homepage = "https://graphite.rs/libraries/dyn-any" +repository = "https://github.com/GraphiteEditor/Graphite/libraries/dyn-any" +documentation = "https://docs.rs/dyn-any" [dependencies] dyn-any-derive = { path = "derive", version = "0.2.0", optional = true } diff --git a/bezier-rs/docs/interactive-docs/.eslintrc.js b/website/other/bezier-rs-demos/.eslintrc.js similarity index 100% rename from bezier-rs/docs/interactive-docs/.eslintrc.js rename to website/other/bezier-rs-demos/.eslintrc.js diff --git a/website/other/bezier-rs-demos/.gitignore b/website/other/bezier-rs-demos/.gitignore new file mode 100644 index 00000000..e1a7c6a5 --- /dev/null +++ b/website/other/bezier-rs-demos/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +/node_modules +/public +/dist +/wasm/pkg diff --git a/bezier-rs/docs/interactive-docs/README.md b/website/other/bezier-rs-demos/README.md similarity index 88% rename from bezier-rs/docs/interactive-docs/README.md rename to website/other/bezier-rs-demos/README.md index 0cd378b5..9690125f 100644 --- a/bezier-rs/docs/interactive-docs/README.md +++ b/website/other/bezier-rs-demos/README.md @@ -1,4 +1,4 @@ -# interactive-docs +# Bezier-rs interactive docs ## Project setup ``` @@ -7,7 +7,7 @@ npm install ### Compiles and hot-reloads for development ``` -npm run serve +npm start ``` ### Compiles and minifies for production diff --git a/bezier-rs/docs/interactive-docs/package-lock.json b/website/other/bezier-rs-demos/package-lock.json similarity index 99% rename from bezier-rs/docs/interactive-docs/package-lock.json rename to website/other/bezier-rs-demos/package-lock.json index fc5afa54..73240e08 100644 --- a/bezier-rs/docs/interactive-docs/package-lock.json +++ b/website/other/bezier-rs-demos/package-lock.json @@ -1,11 +1,11 @@ { - "name": "interactive-docs", + "name": "bezier-rs-demos", "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "interactive-docs", + "name": "bezier-rs-demos", "version": "0.1.0", "dependencies": { "core-js": "^3.8.3", diff --git a/bezier-rs/docs/interactive-docs/package.json b/website/other/bezier-rs-demos/package.json similarity index 97% rename from bezier-rs/docs/interactive-docs/package.json rename to website/other/bezier-rs-demos/package.json index 383dc1c0..d3b8fe10 100644 --- a/bezier-rs/docs/interactive-docs/package.json +++ b/website/other/bezier-rs-demos/package.json @@ -1,5 +1,5 @@ { - "name": "interactive-docs", + "name": "bezier-rs-demos", "version": "0.1.0", "private": true, "scripts": { diff --git a/bezier-rs/docs/interactive-docs/src/App.vue b/website/other/bezier-rs-demos/src/App.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/App.vue rename to website/other/bezier-rs-demos/src/App.vue diff --git a/bezier-rs/docs/interactive-docs/src/components/BezierDrawing.ts b/website/other/bezier-rs-demos/src/components/BezierDrawing.ts similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/BezierDrawing.ts rename to website/other/bezier-rs-demos/src/components/BezierDrawing.ts diff --git a/bezier-rs/docs/interactive-docs/src/components/Example.vue b/website/other/bezier-rs-demos/src/components/Example.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/Example.vue rename to website/other/bezier-rs-demos/src/components/Example.vue diff --git a/bezier-rs/docs/interactive-docs/src/components/ExamplePane.vue b/website/other/bezier-rs-demos/src/components/ExamplePane.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/ExamplePane.vue rename to website/other/bezier-rs-demos/src/components/ExamplePane.vue diff --git a/bezier-rs/docs/interactive-docs/src/components/SliderExample.vue b/website/other/bezier-rs-demos/src/components/SliderExample.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/SliderExample.vue rename to website/other/bezier-rs-demos/src/components/SliderExample.vue diff --git a/bezier-rs/docs/interactive-docs/src/components/SubpathExample.vue b/website/other/bezier-rs-demos/src/components/SubpathExample.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/SubpathExample.vue rename to website/other/bezier-rs-demos/src/components/SubpathExample.vue diff --git a/bezier-rs/docs/interactive-docs/src/components/SubpathExamplePane.vue b/website/other/bezier-rs-demos/src/components/SubpathExamplePane.vue similarity index 100% rename from bezier-rs/docs/interactive-docs/src/components/SubpathExamplePane.vue rename to website/other/bezier-rs-demos/src/components/SubpathExamplePane.vue diff --git a/bezier-rs/docs/interactive-docs/src/main.ts b/website/other/bezier-rs-demos/src/main.ts similarity index 100% rename from bezier-rs/docs/interactive-docs/src/main.ts rename to website/other/bezier-rs-demos/src/main.ts diff --git a/bezier-rs/docs/interactive-docs/src/shims-vue.d.ts b/website/other/bezier-rs-demos/src/shims-vue.d.ts similarity index 100% rename from bezier-rs/docs/interactive-docs/src/shims-vue.d.ts rename to website/other/bezier-rs-demos/src/shims-vue.d.ts diff --git a/bezier-rs/docs/interactive-docs/src/utils/drawing.ts b/website/other/bezier-rs-demos/src/utils/drawing.ts similarity index 100% rename from bezier-rs/docs/interactive-docs/src/utils/drawing.ts rename to website/other/bezier-rs-demos/src/utils/drawing.ts diff --git a/bezier-rs/docs/interactive-docs/src/utils/types.ts b/website/other/bezier-rs-demos/src/utils/types.ts similarity index 95% rename from bezier-rs/docs/interactive-docs/src/utils/types.ts rename to website/other/bezier-rs-demos/src/utils/types.ts index 79a71cdc..e06ceb23 100644 --- a/bezier-rs/docs/interactive-docs/src/utils/types.ts +++ b/website/other/bezier-rs-demos/src/utils/types.ts @@ -1,4 +1,4 @@ -export type WasmRawInstance = typeof import("../../wasm/pkg"); +export type WasmRawInstance = typeof import("@/../wasm/pkg"); export type WasmBezierInstance = InstanceType; export type WasmBezierKey = keyof WasmBezierInstance; diff --git a/website/other/bezier-rs-demos/tsconfig.json b/website/other/bezier-rs-demos/tsconfig.json new file mode 100644 index 00000000..4f94c0a8 --- /dev/null +++ b/website/other/bezier-rs-demos/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "baseUrl": ".", + "types": [ + "node" + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.vue", + "tests/**/*.ts", + ], + "exclude": [ + "node_modules" + ] +} diff --git a/bezier-rs/docs/interactive-docs/vue.config.js b/website/other/bezier-rs-demos/vue.config.js similarity index 98% rename from bezier-rs/docs/interactive-docs/vue.config.js rename to website/other/bezier-rs-demos/vue.config.js index 98db2f64..a29ed969 100644 --- a/bezier-rs/docs/interactive-docs/vue.config.js +++ b/website/other/bezier-rs-demos/vue.config.js @@ -5,6 +5,7 @@ const { defineConfig } = require("@vue/cli-service"); const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); module.exports = defineConfig({ + publicPath: ".", transpileDependencies: true, // https://cli.vuejs.org/guide/webpack.html chainWebpack: (config) => { diff --git a/bezier-rs/docs/interactive-docs/wasm/Cargo.toml b/website/other/bezier-rs-demos/wasm/Cargo.toml similarity index 92% rename from bezier-rs/docs/interactive-docs/wasm/Cargo.toml rename to website/other/bezier-rs-demos/wasm/Cargo.toml index 18e83b68..28032bfb 100644 --- a/bezier-rs/docs/interactive-docs/wasm/Cargo.toml +++ b/website/other/bezier-rs-demos/wasm/Cargo.toml @@ -14,7 +14,7 @@ license = "Apache-2.0" crate-type = ["cdylib", "rlib"] [dependencies] -bezier-rs = { path = "../../../lib", package = "bezier-rs" } +bezier-rs = { path = "../../../../libraries/bezier-rs", package = "bezier-rs" } log = "0.4" serde = { version = "1.0", features = ["derive"] } wasm-bindgen = { version = "0.2.73", features = ["serde-serialize"] } diff --git a/bezier-rs/docs/interactive-docs/wasm/src/lib.rs b/website/other/bezier-rs-demos/wasm/src/lib.rs similarity index 100% rename from bezier-rs/docs/interactive-docs/wasm/src/lib.rs rename to website/other/bezier-rs-demos/wasm/src/lib.rs diff --git a/bezier-rs/docs/interactive-docs/wasm/src/subpath.rs b/website/other/bezier-rs-demos/wasm/src/subpath.rs similarity index 100% rename from bezier-rs/docs/interactive-docs/wasm/src/subpath.rs rename to website/other/bezier-rs-demos/wasm/src/subpath.rs diff --git a/bezier-rs/docs/interactive-docs/wasm/src/svg_drawing.rs b/website/other/bezier-rs-demos/wasm/src/svg_drawing.rs similarity index 100% rename from bezier-rs/docs/interactive-docs/wasm/src/svg_drawing.rs rename to website/other/bezier-rs-demos/wasm/src/svg_drawing.rs diff --git a/website/other/build.sh b/website/other/build.sh new file mode 100644 index 00000000..fbb2af9f --- /dev/null +++ b/website/other/build.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +echo 🔧 Install Rust +curl https://sh.rustup.rs -sSf | sh -s -- -y +export PATH=$PATH:/opt/buildhome/.cargo/bin +echo rustc version: +rustc --version + +echo 🚧 Install Node dependencies +echo node version: +node --version +echo npm version: +npm --version +cd bezier-rs-demos +npm ci + +echo 👷 Build Bezier-rs Demos +export NODE_ENV=production +npm run build +mv dist ../../public/bezier-rs-demos