-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathlight.typ
55 lines (47 loc) · 1.65 KB
/
light.typ
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
// adapted from https://github.com/cetz-package/cetz/blob/a082e02a/gallery/waves.typ
#import "@preview/cetz:0.3.1": canvas, draw, vector, matrix
#set page(width: auto, height: auto, margin: .5cm)
#canvas({
import draw: set-transform, scale, content, line, grid, group, rotate
// Set up the transformation matrix
set-transform(matrix.transform-rotate-dir((1, 1, -1.3), (0, 1, .4)))
scale(x: 1.5, z: -1)
let arrow-style = (mark: (end: "stealth", fill: black, scale: 0.5))
// Coordinate axes labels and arrows
draw.line((0, -2, 0), (0, 2.5, 0), ..arrow-style)
draw.line((-0.5, 0, 0), (8.5, 0, 0), ..arrow-style)
draw.line((0, 0, -1.5), (0, 0, 2), ..arrow-style)
content((0, 0, 2.3), [$arrow(E)$])
content((0, 3, 0), [$arrow(B)$])
content((8.7, 0, 0), [$arrow(v)$])
grid((0, -2), (8, 2), stroke: gray + .5pt)
// Draw a sine wave on the xy plane
let wave(amplitude: 1, fill: none, phases: 2, scale: 8, samples: 100) = {
line(
..(
for x in range(0, samples + 1) {
let x = x / samples
let p = (2 * phases * calc.pi) * x
((x * scale, calc.sin(p) * amplitude),)
}
),
fill: fill,
)
let subdivs = 8
for phase in range(0, phases) {
let x = phase / phases
for div in range(1, subdivs + 1) {
let p = 2 * calc.pi * (div / subdivs)
let y = calc.sin(p) * amplitude
let x = x * scale + div / subdivs * scale / phases
line((x, 0), (x, y), stroke: rgb(0, 0, 0, 150) + .5pt)
}
}
}
// Draw waves
group({
rotate(x: 90deg)
wave(amplitude: 1.6, fill: rgb(0, 0, 255, 50))
})
wave(amplitude: 1, fill: rgb(255, 0, 0, 50))
})