1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#import "@preview/cetz:0.4.2"
#import cetz.draw: *
#show text: it => smallcaps(it)
#set page(width: auto, height: auto)
#let domain = {
let tolerance = 0.05
set-style(stroke: color.blue)
line((tolerance, tolerance), (1.0 - tolerance, 1.0 - tolerance), stroke: 2pt)
set-style(stroke: color.red)
line((0.5, 0.8), (1.0 - tolerance, 1.0 - tolerance))
set-style(stroke: color.black)
line((0.8, 0.5), (1.0 - tolerance, 1.0 - tolerance))
}
#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 angles = (0deg, 180deg)
let transform = if mode == "hop" {
ang => ()
} else if mode == "sidle" {
ang => (rotate(y: ang, origin: (0.5, 0.5)))
} else if mode == "step" {
ang => (rotate(x: ang, origin: (0.5, 0.5)))
} else if mode == "spinning sidle" {
ang => (rotate(y: ang, origin: (0.5, 0.5)))
} else if mode == "spinning hop" {
ang => (rotate(z: ang, origin: (0.5, 0.5)))
// ang => {
// if ang == 180deg {
// translate(x: -1)
// rotate(z: ang, origin: (0.5, 0.0))
// } else {
// // translate(x: -0.5)
// rotate(z: ang, origin: (0.5, 0.0))
// }
// }
}
while i < n {
let ang = calc.rem(i, angles.len())
transform(angles.at(ang))
domain
transform(angles.at(-ang))
translate(x: x-step)
i += 1
}
})
}
hop
#frieze(8, (0, 0), "hop")
spinning hop
// #frieze(16, (0, 4), "spinning hop", x-step: 0.5)
#frieze(8, (0, 4), "spinning hop")
step
#frieze(8, (0, 10), "step")
sidle
#frieze(8, (0, 2), "sidle")
spinning sidle
#frieze(8, (0, 2), "spinning sidle")
|