diff --git a/package-lock.json b/package-lock.json index 5b33f7d..eb6da22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "lindsvg-pwa", - "version": "2.3.7", + "version": "2.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lindsvg-pwa", - "version": "2.3.7", + "version": "2.4.0", "dependencies": { "@vueuse/core": "^10.7.1", - "lindsvg": "^1.3.3", + "lindsvg": "^1.5.0", "normalize.css": "^8.0.1", "pinia": "^2.1.7", - "vue": "^3.4.1" + "vue": "^3.4.5" }, "devDependencies": { - "@stylistic/eslint-plugin-js": "^1.5.1", - "@vitejs/plugin-vue": "^5.0.1", + "@stylistic/eslint-plugin-js": "^1.5.3", + "@vitejs/plugin-vue": "^5.0.2", "eslint": "^8.56.0", "eslint-plugin-vue": "^9.19.2", "vite": "^5.0.10" @@ -709,12 +709,12 @@ ] }, "node_modules/@stylistic/eslint-plugin-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.5.1.tgz", - "integrity": "sha512-iZF0rF+uOhAmOJYOJx1Yvmm3CZ1uz9n0SRd9dpBYHA3QAvfABUORh9LADWwZCigjHJkp2QbCZelGFJGwGz7Siw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.5.3.tgz", + "integrity": "sha512-XlKnm82fD7Sw9kQ6FFigE0tobvptNBXZWsdfoKmUyK7bNxHsAHOFT8zJGY3j3MjZ0Fe7rLTu86hX/vOl0bRRdQ==", "dev": true, "dependencies": { - "acorn": "^8.11.2", + "acorn": "^8.11.3", "escape-string-regexp": "^4.0.0", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1" @@ -738,9 +738,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.1.tgz", - "integrity": "sha512-lwvZX5tDhJpRJEKsjoUSWgaD26Lk9X4aDYGAPpr/Q6cLTT3PC8LPu2dsnYEweAZiNgHsbyKL2Svc/CDrFOsbtw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.2.tgz", + "integrity": "sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -751,36 +751,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.1.tgz", - "integrity": "sha512-FBiJi88C2L+REhqhbSRe0ifLSOMFTbB8hj2xkx8gHozVWLnjVFOanibivUaobkNyKem9vJINFXjazYkX2uIjFQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.5.tgz", + "integrity": "sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.1", + "@vue/shared": "3.4.5", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.1.tgz", - "integrity": "sha512-cftveaDBvtKTcpHDqN+V8b6enBMEOtqJPt/bVZ0gS0+fsyjEP/jIJa1sRXP1IwuOcVgcIXr/9kGMP1qzC0tQiQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.5.tgz", + "integrity": "sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==", "dependencies": { - "@vue/compiler-core": "3.4.1", - "@vue/shared": "3.4.1" + "@vue/compiler-core": "3.4.5", + "@vue/shared": "3.4.5" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.1.tgz", - "integrity": "sha512-h0aWCVSm0uRtGhdM88Gua6lL+wGhiUdHj6BwwBgIaAsms7HK25DzlpnfnCcx4voHDeN9pHmG9jjLBNys/u2Jug==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.5.tgz", + "integrity": "sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.1", - "@vue/compiler-dom": "3.4.1", - "@vue/compiler-ssr": "3.4.1", - "@vue/shared": "3.4.1", + "@vue/compiler-core": "3.4.5", + "@vue/compiler-dom": "3.4.5", + "@vue/compiler-ssr": "3.4.5", + "@vue/shared": "3.4.5", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.32", @@ -788,12 +788,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.1.tgz", - "integrity": "sha512-Zjvjc+u7uXS/mmTPxL5bNup7Om9vni4I++JNMDKCeWKHtHN/6G9LmhXU9vGbrdUH9YFVvewk2pjTtzK9CJCoog==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.5.tgz", + "integrity": "sha512-DDdEcDzj2lWTMfUMMtEpLDhURai9LhM0zSZ219jCt7b2Vyl0/jy3keFgCPMitG0V1S1YG4Cmws3lWHWdxHQOpg==", "dependencies": { - "@vue/compiler-dom": "3.4.1", - "@vue/shared": "3.4.1" + "@vue/compiler-dom": "3.4.5", + "@vue/shared": "3.4.5" } }, "node_modules/@vue/devtools-api": { @@ -802,48 +802,48 @@ "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.1.tgz", - "integrity": "sha512-3nr59s8lojuXL/ucX+V0GDI70kpA3LC7hT963lN7A+gf33MtQB1ncf6lLxO3GzM+HxfAJjkw/1PR1J6BPpBb1w==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.5.tgz", + "integrity": "sha512-BcWkKvjdvqJwb7BhhFkXPLDCecX4d4a6GATvCduJQDLv21PkPowAE5GKuIE5p6RC07/Lp9FMkkq4AYCTVF5KlQ==", "dependencies": { - "@vue/shared": "3.4.1" + "@vue/shared": "3.4.5" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.1.tgz", - "integrity": "sha512-YRS5pNU7htWa1B7mPIcEHvSG0VjopVMV3BUWwW3/ZYkpgSWTDOpSXoF7AZ/P/uKd0gweCosxcy7Wuw//0uDtyg==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.5.tgz", + "integrity": "sha512-wh9ELIOQKeWT9SaUPdLrsxRkZv14jp+SJm9aiQGWio+/MWNM3Lib0wE6CoKEqQ9+SCYyGjDBhTOTtO47kCgbkg==", "dependencies": { - "@vue/reactivity": "3.4.1", - "@vue/shared": "3.4.1" + "@vue/reactivity": "3.4.5", + "@vue/shared": "3.4.5" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.1.tgz", - "integrity": "sha512-GNSlwBglxscrviChkCYxTYNY6GzAFLP80CPQL3X6u9wI0c8Vc3QUzMAVlBs14+3wgSFZc/xANPPpZVTKSoUg2A==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.5.tgz", + "integrity": "sha512-n5ewvOjyG3IEpqGBahdPXODFSpVlSz3H4LF76Sx0XAqpIOqyJ5bIb2PrdYuH2ogBMAQPh+o5tnoH4nJpBr8U0Q==", "dependencies": { - "@vue/runtime-core": "3.4.1", - "@vue/shared": "3.4.1", + "@vue/runtime-core": "3.4.5", + "@vue/shared": "3.4.5", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.1.tgz", - "integrity": "sha512-ba67d4rO1nL2TUevvp4nXtqXsVpesxrjA1N0dKWEKYwQS+G3xYZx7NpkHchAanlsUPI3EYk2bhTtPHHulIqKig==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.5.tgz", + "integrity": "sha512-jOFc/VE87yvifQpNju12VcqimH8pBLxdcT+t3xMeiED1K6DfH9SORyhFEoZlW5TG2Vwfn3Ul5KE+1aC99xnSBg==", "dependencies": { - "@vue/compiler-ssr": "3.4.1", - "@vue/shared": "3.4.1" + "@vue/compiler-ssr": "3.4.5", + "@vue/shared": "3.4.5" }, "peerDependencies": { - "vue": "3.4.1" + "vue": "3.4.5" } }, "node_modules/@vue/shared": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.1.tgz", - "integrity": "sha512-ObCj3oQ6nH3otfEz15xsbQhq0oU2gUvOP9aVbzRewcbI6s+cmV78lZ9dlwvsdcTCn50AiRjijdCAfpJonXSbNw==" + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.5.tgz", + "integrity": "sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==" }, "node_modules/@vueuse/core": { "version": "10.7.1", @@ -1657,9 +1657,9 @@ } }, "node_modules/lindsvg": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/lindsvg/-/lindsvg-1.3.3.tgz", - "integrity": "sha512-Ksn6SrEGIjqxaaOgN/A1rBp/p5rGBD0FqHT+HT8r+y7R5augy2mUS/XMX52mvgxeJQTGxrZDY0Kee68W5LmrWg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lindsvg/-/lindsvg-1.5.0.tgz", + "integrity": "sha512-JbB9J43ON4CtiVw0axPnl6SLEX585iZ2jPTzH7LzlJVaID5RHA1pPTREUy42Q3ToW0i2ZtWaYwScR0p3frsRkg==", "engines": { "node": ">=8.3.0" } @@ -2267,15 +2267,15 @@ } }, "node_modules/vue": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.1.tgz", - "integrity": "sha512-KWFPZC8TW+g/Gg4ALIVZixwhzqdRKjyfN3NdH9jiYGhWlOX8vT2d9wZhsShTjS9wkKyohtDhPFYiwV255TdANA==", - "dependencies": { - "@vue/compiler-dom": "3.4.1", - "@vue/compiler-sfc": "3.4.1", - "@vue/runtime-dom": "3.4.1", - "@vue/server-renderer": "3.4.1", - "@vue/shared": "3.4.1" + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.5.tgz", + "integrity": "sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==", + "dependencies": { + "@vue/compiler-dom": "3.4.5", + "@vue/compiler-sfc": "3.4.5", + "@vue/runtime-dom": "3.4.5", + "@vue/server-renderer": "3.4.5", + "@vue/shared": "3.4.5" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index ad9dfdb..9624754 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lindsvg-pwa", "private": true, - "version": "2.3.7", + "version": "2.4.0", "type": "module", "scripts": { "lint": "eslint \"src/**/*.{mjs,vue}\"", @@ -11,14 +11,14 @@ }, "dependencies": { "@vueuse/core": "^10.7.1", - "lindsvg": "^1.3.3", + "lindsvg": "^1.5.0", "normalize.css": "^8.0.1", "pinia": "^2.1.7", - "vue": "^3.4.1" + "vue": "^3.4.5" }, "devDependencies": { - "@stylistic/eslint-plugin-js": "^1.5.1", - "@vitejs/plugin-vue": "^5.0.1", + "@stylistic/eslint-plugin-js": "^1.5.3", + "@vitejs/plugin-vue": "^5.0.2", "eslint": "^8.56.0", "eslint-plugin-vue": "^9.19.2", "vite": "^5.0.10" diff --git a/src/stores/bank.mjs b/src/stores/bank.mjs index e9ab8bb..8bd2f94 100644 --- a/src/stores/bank.mjs +++ b/src/stores/bank.mjs @@ -1,17 +1,18 @@ /* -L-system author index: +L-system author/source index: -* [AH] — Anthony Hanmer -* [AK] — A.V. Kalmykov -* [AM] — Adrian Mariano -* [HS] — Herb Savage -* [GT] — Gary Teachout -* [KP] — Ken Philip -* [MR] — Michael A. Rouse -* [PB] — Paul Bourke -* [PP] — from P. Prusinkiewicz & J. Hanan, 1989 -* [SE] — SirEdvin -* [WM] — William McWorter +* [AH] - Anthony Hanmer +* [AK] - A.V. Kalmykov +* [AM] - Adrian Mariano +* [HS] - Herb Savage +* [GT] - Gary Teachout +* [KP] - Ken Philip +* [MR] - Michael A. Rouse +* [PB] - Paul Bourke +* [PP] - from P. Prusinkiewicz & J. Hanan, 1989 +* [SE] - SirEdvin +* [SF] - Spanky Fractal Database (https://web.archive.org/web/20160903112517/http://www.nahee.com/spanky/pub/fractals/lsystems/) +* [WM] - William McWorter An asterisk (*) near the reference means that the original L-system parameters were modified for optimisation purposes @@ -62,6 +63,22 @@ export default [ iterations: 5, step: 10, }, + { // [WM] + lid: "border", + axiom: "XYXYXYX+XYXYXYX+XYXYXYX+XYXYXYX", + attributes: { + stroke: "sienna", + "stroke-width": "1.5", + }, + alpha: 0, + theta: 90, + step: 5, + iterations: 3, + rules: { + X: "FX+FX+FXFY-FY-", + Y: "+FX+FXFY-FY-FY", + }, + }, { lid: "chain", axiom: "F+F+F+F", @@ -78,7 +95,7 @@ export default [ "stroke-width": "1.5", }, }, - { + { // [WM] lid: "cross", axiom: "X", rules: { @@ -101,6 +118,32 @@ export default [ iterations: 4, step: 3.5, }, + { // [AM] + lid: "fass 1", + axiom: "-L", + rules: { + F: "F", + L: "LF+RFR+FL-F-LFLFL-FRFR+", + R: "-LFLF+RFRFR+F+RF-LFL-FR", + }, + alpha: 0, + theta: 90, + step: 6, + iterations: 4, + }, + { // [AM] + lid: "fass 2", + axiom: "-L", + alpha: 0, + theta: 90, + step: 7, + iterations: 3, + rules: { + F: "F", + L: "LFLF+RFR+FLFL-FRF-LFL-FR+F+RF-LFL-FRFRFR+", + R: "-LFLFLF+RFR+FL-F-LF+RFR+FLF+RFRF-LFL-FRFR", + }, + }, { // [WM] lid: "frame", axiom: "YXY-YXY-YXY-YXY", @@ -127,7 +170,7 @@ export default [ step: 8, }, { // [GT*] - lid: "Hex-7-b", + lid: "hex-7-b", axiom: "X", rules: { X: "-F++F-X-F--F+Y---F--F+Y+F++F-X+++F++F-X-F++F-X+++F--F+Y--", @@ -263,7 +306,7 @@ export default [ iterations: 4, step: 3.5, }, - { + { // [AM] lid: "Peano curve", axiom: "F", rules: { @@ -303,6 +346,20 @@ export default [ iterations: 7, step: 15, }, + { // [AM] + lid: "quartet", + axiom: "FG", + rules: { + A: "FGFA+HFA+FG-FA", + G: "FG+FA-FG-JFGFA", + H: "-", + J: "+", + }, + alpha: 0, + theta: 90, + step: 7, + iterations: 5, + }, { lid: "Sierpinski arrowhead", axiom: "A", @@ -340,6 +397,20 @@ export default [ iterations: 10, step: 5, }, + { // [GT] + lid: "tri-9-a", + axiom: "X", + rules: { + X: "FFFFWWPP+FP+FW+FP+FX-FP-FX-FP-FY+FP+FX-FP-FX-FP-FY+FP+FX-FP-FY+FP+FX", + Y: "FFFFWWPP-FP-FW-FP-FY+FP+FY+FP+FX-FP-FY+FP+FY+FP+FX-FP-FY+FP+FX-FP-FY", + P: "FP", + W: "FFFFFFFPPPPWWW", + }, + alpha: 180, + theta: 60, + step: 8, + iterations: 3, + }, ], }, @@ -372,7 +443,7 @@ export default [ iterations: 12, step: 3, }, - { + { // [WM] lid: "terdragon", axiom: "F", rules: { @@ -384,6 +455,17 @@ export default [ step: 6, }, { + lid: "terdragon tiling", + axiom: "X", + rules: { + X: "F-F-F+F+FX++F-F-F+F+FX--F-F-F+F+FX", + }, + alpha: 30, + theta: 60, + step: 5, + iterations: 7, + }, + { // [SF] (Maze01) lid: "tridragon", axiom: "F+F+F", rules: { @@ -394,6 +476,28 @@ export default [ step: 6, iterations: 6, }, + { // [WM] + lid: "twindragon boundary", + axiom: "OTUZ", + alpha: 0, + theta: 90, + step: 5, + iterations: 12, + rules: { + O: "FO+F-T", + P: "++F--U+F-X", + Q: "-F+V++F--Q", + R: "-F+ZFS", + S: "FW", + T: "++F--U", + U: "++F--Y", + V: "FS", + W: "FO+F-P", + X: "++F--Y+F-X", + Y: "-F+R++F--Q", + Z: "-F+ZFW", + }, + }, ], }, @@ -415,7 +519,7 @@ export default [ lid: "Cesaro 2", axiom: "AAAA", rules: { - A: "F+++++++++F------------------", + A: "F+++++++++F|", F: "F++++++++F----------------F++++++++F", }, alpha: 0, @@ -883,7 +987,7 @@ export default [ }, { lid: "tree 2", - axiom: "FFF+FFFF-FF+FF-[-Y][+Y][Z][+Z]", + axiom: "FFF+FFFF-FF+FF-[-Y][+Y][Z][+!Z!]", rules: { F: "F", Y: "FF+F-F-F[FFFZ][+Z]-F-FZ", @@ -950,7 +1054,7 @@ export default [ "stroke-width": "2", }, }, - { + { // [SF] lid: "Dekking’s church", axiom: "WXYZ", rules: { @@ -968,6 +1072,21 @@ export default [ "stroke-width": "1.5", }, }, + { // [SF] + lid: "doily", + axiom: "F--F--F--F--F--F", + rules: { + F: "-F[--F--F]++F[++F--F]--F+", + }, + alpha: 0, + theta: 30, + step: 5, + iterations: 4, + attributes: { + stroke: ["cornflowerblue", "cornflowerblue", "gold", "cornflowerblue"], + "stroke-width": "1.5", + }, + }, { lid: "double Penrose", axiom: "[X][Y]++[X][Y]++[X][Y]++[X][Y]++[X][Y]", @@ -1010,6 +1129,22 @@ export default [ iterations: 5, step: 4.75, }, + { // [SF] + lid: "hex", + axiom: "F", + rules: { + F: "-F+F+G[+F+F]-", + G: "GG", + }, + alpha: -30, + theta: 60, + step: 10, + iterations: 7, + attributes: { + stroke: "dodgerblue", + "stroke-width": "1.5", + }, + }, { // [MR] lid: "HexGasket", axiom: "F+F+F+F+F+F--", @@ -1023,14 +1158,14 @@ export default [ }, { // [AH] lid: "horizons", - axiom: "+F++++F", + axiom: "+F|F", rules: { - F: "F+F+F++++F+F+F", + F: "F+F+F|F+F+F", }, alpha: 0, theta: 45, iterations: 5, - step: 1.3, + step: 1.5, }, { lid: "Levi’s carpet", @@ -1038,10 +1173,10 @@ export default [ rules: { F: "+F--F+", }, - alpha: 180, + alpha: 0, theta: 45, iterations: 14, - step: 1.8, + step: 2, }, { lid: "Levi’s fractal", @@ -1052,7 +1187,7 @@ export default [ alpha: 180, theta: 45, iterations: 14, - step: 1.9, + step: 2, }, { lid: "mosaic", @@ -1075,9 +1210,10 @@ export default [ alpha: 0, theta: 30, iterations: 4, - step: 4.5, + step: 5, attributes: { - stroke: "cornflowerblue", + stroke: ["cornflowerblue", "mediumorchid"], + "stroke-width": ["2", "1"], }, }, { // [HS*] @@ -1118,6 +1254,18 @@ export default [ "stroke-linejoin": "round", }, }, + { // [WM] + lid: "pentant", + axiom: "X-X-X-X-X", + rules: { + X: "FX-FX-FX+FY+FY+FX-FX", + Y: "FY+FY-FX-FX-FY+FY+FY", + }, + alpha: 0, + theta: 72, + step: 3, + iterations: 4, + }, { // [WM] lid: "pentigree", axiom: "F-F-F-F-F", @@ -1190,6 +1338,25 @@ export default [ stroke: "deepskyblue", }, }, + { // [HS] + lid: "sphinx", + axiom: "X", + rules: { + F: "BB", + B: "BB", + X: "+FF-YFF+FF--FFF|X|F--YFFFYFFF|", + Y: "-FF+XFF-FF++FFF|Y|F++XFFFXFFF|", + }, + alpha: 180, + theta: 60, + step: 10, + iterations: 5, + attributes: { + stroke: "sandybrown", + "stroke-linejoin": "round", + "stroke-width": "2.5", + }, + }, { // [PP] lid: "spiral tiling", axiom: "AAAA", @@ -1243,6 +1410,26 @@ export default [ step: 25, iterations: 5, }, + { // [WM] + lid: "Xmas tree", + axiom: "W", + rules: { + W: "++FX--FW--FY++", + X: "-FZ++FY-", + Y: "--FZ++FY++FW--", + Z: "+FX--FW+", + }, + alpha: 180, + theta: 36, + step: 8, + iterations: 8, + attributes: { + stroke: "darkgreen", + "stroke-width": "6", + "stroke-dasharray": "5 2", + fill: "limegreen", + }, + }, ], }, ];