summaryrefslogtreecommitdiff
path: root/trees/blog/figures/frieze.typ
diff options
context:
space:
mode:
Diffstat (limited to 'trees/blog/figures/frieze.typ')
-rw-r--r--trees/blog/figures/frieze.typ189
1 files changed, 189 insertions, 0 deletions
diff --git a/trees/blog/figures/frieze.typ b/trees/blog/figures/frieze.typ
new file mode 100644
index 0000000..de0a603
--- /dev/null
+++ b/trees/blog/figures/frieze.typ
@@ -0,0 +1,189 @@
+#import "@preview/cetz:0.4.2"
+#import cetz.draw: *
+
+#show text: it => smallcaps(it)
+#set page(width: auto, height: auto)
+
+#let fish = {
+ let tolerance = 0.0
+ set-style(stroke: color.red)
+ line(
+ (tolerance, tolerance),
+ (1.0 - tolerance, 1.0 - tolerance),
+ (0.75, 1.),
+ (0.5, 0.9),
+ fill: color.red,
+ close: true,
+ )
+ set-style(stroke: color.blue)
+
+ line(
+ (tolerance, tolerance),
+ (1.0 - tolerance, 1.0 - tolerance),
+ (0.9, 0.5),
+ stroke: 1pt,
+ fill: color.blue,
+ close: true,
+ )
+ circle(
+ (.0 - tolerance, .0 - tolerance),
+ radius: 0.05,
+ fill: color.black,
+ stroke: color.black,
+ )
+}
+
+#let trig = {
+ line((0.0, 0.2), (0.5, 1.0), (1.0, 0.2))
+ line((0.0, 0.5), (0.5, 0.0), (1.0, 0.5), stroke: 2pt)
+ circle((0.85, 0.0), radius: 0.12, stroke: 1.5pt + color.black)
+}
+
+#let domain = {
+ set-style(stroke: color.rgb(180, 190, 254))
+ line(
+ // (0.0, 0.75),
+ (0.0, 0.1),
+ (0.25, 0.1),
+ (0.25, 0.75),
+ (0.75, 0.75),
+ (0.75, 0.40),
+ (0.55, 0.40),
+ (0.55, 0.60),
+ (0.35, 0.60),
+ (0.35, 0.1),
+ (0.35, 0.1),
+ (1.0, 0.1),
+ // (1.0, 0.75),
+ stroke: 1.2pt,
+ )
+ circle(
+ (0, 0.5),
+ radius: 0.1,
+ fill: color.rgb(235, 160, 172),
+ stroke: color.rgb(235, 160, 172),
+ )
+ circle((1.0, 0.0), radius: 0.2, fill: color.rgb(180, 190, 254))
+}
+
+#let frieze(n, start, mode, draw-grid: false, x-step: 1) = {
+ cetz.canvas({
+ set-style(stroke: color.blue)
+ translate(start)
+ if draw-grid {
+ grid(
+ (0, 0),
+ (n, 1),
+ stroke: red.transparentize(80%),
+ )
+ }
+
+ let i = 0
+ let c = (0.5, 0.5)
+ let transforms = (
+ "hop": (i => (translate(x: x-step)),),
+ "spinning hop": (
+ i => {
+ translate(x: x-step)
+ rotate(z: i * 180deg, origin: c)
+ },
+ i => {
+ translate(x: -x-step)
+ rotate(z: i * 180deg, origin: c)
+ },
+ ),
+ "step": (
+ i => {
+ rotate(x: i * 180deg, origin: c)
+ translate(x: x-step)
+ },
+ ),
+ "sidle": (
+ i => {
+ translate(x: x-step)
+ rotate(y: i * 180deg, origin: c)
+ },
+ i => {
+ translate(x: -x-step)
+ rotate(y: i * 180deg, origin: c)
+ },
+ ),
+ "spinning sidle": (
+ i => {
+ translate(x: x-step)
+ rotate(y: i * 180deg, origin: c)
+ },
+ i => {
+ translate(x: -x-step)
+ rotate(z: i * 180deg, origin: c)
+ },
+ i => {
+ translate(x: x-step)
+ rotate(y: i * 180deg, origin: c)
+ },
+ i => {
+ translate(x: -x-step)
+ rotate(z: i * 180deg, origin: c)
+ },
+ // i => {
+ // translate(x: x-step)
+ // rotate(z: i * 180deg, origin: c)
+ // },
+ // i => {
+ // translate(x: x-step)
+ // rotate(x: i * 180deg, origin: c)
+ // },
+ ),
+ "jump": (
+ i => {
+ translate(y: -x-step)
+ rotate(x: i * 180deg, origin: c)
+ translate(x: x-step)
+ },
+ i => {
+ rotate(x: i * 180deg, origin: c)
+ translate(y: x-step)
+ },
+ ),
+ "spinning jump": (
+ i => {
+ translate(x: -x-step)
+ rotate(y: i * 180deg, origin: c)
+ },
+ i => {
+ rotate(x: i * 180deg, origin: c)
+ translate(y: x-step)
+ },
+ i => {
+ translate(y: -x-step)
+ rotate(z: i * 180deg, origin: c)
+ translate(x: -x-step)
+ },
+ i => {
+ rotate(x: i * 180deg, origin: c)
+ translate(y: x-step)
+ },
+ ),
+ )
+
+ while i < n {
+ let it = calc.rem(i, transforms.at(mode).len())
+
+ transforms.at(mode).at(it)(1)
+ domain
+ // translate(x: x-step)
+
+ i += 1
+ }
+ })
+}
+
+#let n = 40
+
+#frieze(n, (0, 0), "hop")
+#frieze(n * 2, (0, 14), "spinning jump")
+#frieze(n, (0, 4), "spinning hop")
+#frieze(n, (0, 10), "step")
+#frieze(n, (0, 2), "sidle")
+#frieze(n * 2, (0, 12), "jump")
+#frieze(n, (0, 2), "spinning sidle")