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.
tesi-triennale/src/skein.typ

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)) })
}),
)