forked from physicshub/physicshub.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDoublePendulum.js
More file actions
118 lines (114 loc) · 2.14 KB
/
Copy pathDoublePendulum.js
File metadata and controls
118 lines (114 loc) · 2.14 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// app/(core)/data/configs/DoublePendulum.js
export const INITIAL_INPUTS = {
length1: 2,
length2: 2,
mass1: 1,
mass2: 1,
gravity: 9.81,
damping: 0,
initialAngle1: 90,
initialAngle2: 90,
trailEnabled: true,
bob1Color: "#3b82f6",
bob2Color: "#ef4444",
ropeColor: "#9ca3af",
};
export const INPUT_FIELDS = [
{
name: "length1",
label: "Length 1 (m)",
type: "number",
min: 0.5,
max: 4,
step: 0.1,
},
{
name: "length2",
label: "Length 2 (m)",
type: "number",
min: 0.5,
max: 4,
step: 0.1,
},
{
name: "mass1",
label: "Mass 1 (kg)",
type: "number",
min: 0.1,
max: 5,
step: 0.1,
},
{
name: "mass2",
label: "Mass 2 (kg)",
type: "number",
min: 0.1,
max: 5,
step: 0.1,
},
{
name: "gravity",
label: "Gravity (m/s²)",
type: "number",
min: 1,
max: 20,
step: 0.1,
},
{
name: "damping",
label: "Damping",
type: "number",
min: 0,
max: 1,
step: 0.01,
},
{
name: "initialAngle1",
label: "Initial Angle 1 (°)",
type: "number",
min: -180,
max: 180,
step: 1,
},
{
name: "initialAngle2",
label: "Initial Angle 2 (°)",
type: "number",
min: -180,
max: 180,
step: 1,
},
{
name: "trailEnabled",
label: "Show Trail",
type: "checkbox",
},
{
name: "bob1Color",
label: "Bob 1 Color",
type: "color",
},
{
name: "bob2Color",
label: "Bob 2 Color",
type: "color",
},
{
name: "ropeColor",
label: "Rope Color",
type: "color",
},
];
export const SimInfoMapper = (bodyState) => {
const angle1 = (bodyState.angle1 * 180) / Math.PI;
const angle2 = (bodyState.angle2 * 180) / Math.PI;
return {
"Angle 1": `${angle1.toFixed(1)}°`,
"Angle 2": `${angle2.toFixed(1)}°`,
"Angular Vel 1": `${bodyState.angularVel1.toFixed(2)} rad/s`,
"Angular Vel 2": `${bodyState.angularVel2.toFixed(2)} rad/s`,
KE: `${bodyState.kineticEnergy.toFixed(2)} J`,
PE: `${bodyState.potentialEnergy.toFixed(2)} J`,
"Total E": `${(bodyState.kineticEnergy + bodyState.potentialEnergy).toFixed(2)} J`,
};
};