-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathemmodel004.html
103 lines (80 loc) · 2.05 KB
/
emmodel004.html
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<body style="margin:0px">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.6.1/gl-matrix-min.js"></script>
<script src="https://dglittle.github.io/cdn/utils001.js"></script>
<script>
var tau = Math.PI * 2
var n = 64
var zoom = 4
var c = document.createElement('canvas')
c.width = n
c.height = n
c.style.imageRendering = 'pixelated'
c.style.width = n * zoom
c.style.height = n * zoom
c.style.margin = '4px'
document.body.append(c)
var g = c.getContext('2d')
var P = []
var V = []
for (var x = 0; x < n; x++) {
P.push(Math.sin(x / n * tau))
V.push(Math.cos(x / n * tau))
}
function step_physics() {
var dt = 0.05
for (var x = 0; x < n; x++) {
P[x] += V[x] * dt
}
for (var x = 0; x < n; x++) {
V[x] -= P[x] * dt
}
// function curl_effects_other_field(F1, F2, factor) {
// for (var x = 0; x < n; x++) {
// var left = F1[fmod(x - 1, n)]
// var middle = F1[fmod(x, n)]
// var right = F1[fmod(x + 1, n)]
// var d1 = middle - left
// var d2 = right - middle
// var curl = d2 - d1
// F2[x] += curl * factor
// }
// }
// curl_effects_other_field(E, M, 0.5)
// curl_effects_other_field(M, E, -0.5)
}
function draw_everything() {
g.clearRect(0, 0, n, n)
g.beginPath()
g.moveTo(0, lerp(1, 0, -1, n, P[0]))
for (var i = 1; i < n; i++) {
g.lineTo(i, lerp(1, 0, -1, n, P[i]))
}
g.strokeStyle = 'red'
g.stroke()
g.beginPath()
g.moveTo(0, lerp(1, 0, -1, n, V[0]))
for (var i = 1; i < n; i++) {
g.lineTo(i, lerp(1, 0, -1, n, V[i]))
}
g.strokeStyle = 'blue'
g.stroke()
}
var stop = false
function loop() {
if (stop) { return }
step_physics()
draw_everything()
setTimeout(loop, 30)
}
loop()
document.addEventListener('keydown', function (e) {
console.log('stop!')
stop = true
})
function fmod(a, b) {
var m = a % b
if (m < 0) return m + b
return m
}
</script>
</body>