You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.3 KiB
Plaintext
93 lines
2.3 KiB
Plaintext
#import "@preview/cetz:0.3.4"
|
|
|
|
#let draw-strand(polyline, style: (:)) = {
|
|
import cetz.draw: *
|
|
|
|
set-style(
|
|
..cetz.styles.resolve(
|
|
(stroke: (paint: white, thickness: 0.75pt * 8, cap: "butt")),
|
|
base: style,
|
|
),
|
|
)
|
|
polyline
|
|
set-style(
|
|
..cetz.styles.resolve(
|
|
style,
|
|
base: (stroke: (paint: black, thickness: 0.75pt, cap: "round")),
|
|
),
|
|
)
|
|
polyline
|
|
|
|
set-style(stroke: (paint: black, thickness: 0.75pt, cap: "round"))
|
|
}
|
|
|
|
#let skein-canvas = body => cetz.canvas(
|
|
length: 0.25cm,
|
|
padding: 0.25,
|
|
{
|
|
import cetz.draw: *
|
|
rect((-1, -1), (1, 1), fill: white, stroke: none)
|
|
|
|
body
|
|
},
|
|
)
|
|
|
|
#let arrow-size = 0.35
|
|
|
|
#let draw-arrow((x, y), angle: 0, ..style) = {
|
|
import cetz.draw: *
|
|
|
|
{
|
|
let len = arrow-size / calc.sqrt(2)
|
|
set-style(..style)
|
|
|
|
translate(x: x, y: y)
|
|
rotate(z: angle)
|
|
line((0, 0), (-len, +len), ..style)
|
|
line((0, 0), (-len, -len), ..style)
|
|
}
|
|
}
|
|
|
|
#let skein = (
|
|
unit: skein-canvas({
|
|
import cetz.draw: *
|
|
|
|
circle((0, 0), radius: 1, stroke: (paint: black, thickness: 0.75pt))
|
|
}),
|
|
over: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ line((-1, -1), (1, 1)) })
|
|
draw-strand({ line((-1, 1), (1, -1)) })
|
|
}),
|
|
under: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ line((-1, 1), (1, -1)) })
|
|
draw-strand({ line((-1, -1), (1, 1)) })
|
|
}),
|
|
h: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ hobby((-1, -1), (0, -0.61), (1, -1), omega: 1) })
|
|
draw-strand({ hobby((-1, 1), (0, +0.61), (1, 1), omega: 1) })
|
|
}),
|
|
v: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ hobby((-1, -1), (-0.61, 0), (-1, 1), omega: 1) })
|
|
draw-strand({ hobby((1, -1), (+0.61, 0), (1, 1), omega: 1) })
|
|
}),
|
|
strand: skein-canvas({
|
|
import cetz.draw: *
|
|
rect((-1, -1), (1, 1), fill: white, stroke: none)
|
|
draw-strand({ hobby((-1, 0), (0, 0.25), (1, 0), omega: 1) })
|
|
}),
|
|
over-twist: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) })
|
|
draw-strand({ hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) })
|
|
}),
|
|
under-twist: skein-canvas({
|
|
import cetz.draw: *
|
|
draw-strand({ hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) })
|
|
draw-strand({ hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) })
|
|
}),
|
|
)
|