58 lines
1.1 KiB
Typst
58 lines
1.1 KiB
Typst
|
#import "@preview/cetz:0.3.1": canvas, draw
|
||
|
|
||
|
#let draw-algo(places, min: 0, max: 199, width: 10) = canvas({
|
||
|
let m = min
|
||
|
let M = max
|
||
|
let s = M - m
|
||
|
let w = width / s
|
||
|
|
||
|
draw.line((0, 0), (width, 0))
|
||
|
let draw-tick(v) = {
|
||
|
draw.line((v*w, 0), (v*w, 0.2))
|
||
|
draw.content(
|
||
|
(v*w, 0.2),
|
||
|
str(v),
|
||
|
anchor: "south",
|
||
|
padding: 3pt
|
||
|
)
|
||
|
}
|
||
|
|
||
|
let drawn = (m, M)
|
||
|
draw-tick(m)
|
||
|
draw-tick(M)
|
||
|
|
||
|
let pos = ()
|
||
|
for (i, place) in places.enumerate() {
|
||
|
if place not in drawn {
|
||
|
draw-tick(place)
|
||
|
drawn.push(place)
|
||
|
}
|
||
|
|
||
|
let p = (place * w, -i * 0.5)
|
||
|
if pos.len() != 0 {
|
||
|
draw.line(pos.last(), p, mark: (end: "straight"))
|
||
|
}
|
||
|
pos.push(p)
|
||
|
}
|
||
|
|
||
|
let bottom-y = -(places.len() - 1) * 0.5
|
||
|
draw.line((m*w, 0), (m*w, bottom-y))
|
||
|
draw.line((M*w, 0), (M*w, bottom-y))
|
||
|
})
|
||
|
|
||
|
#let compute-total(places, wrap: false, min: 0, max: 199) = {
|
||
|
let total = 0
|
||
|
for i in range(places.len() - 1) {
|
||
|
let p0 = places.at(i)
|
||
|
let p1 = places.at(i + 1)
|
||
|
let d = calc.abs(p0 - p1)
|
||
|
if wrap {
|
||
|
if p1 < p0 {
|
||
|
d = (max - p0) + (p1 - min)
|
||
|
// d = 0
|
||
|
}
|
||
|
}
|
||
|
total += d
|
||
|
}
|
||
|
return total
|
||
|
}
|