/
SingleSpringApp.ts
105 lines (89 loc) · 3.73 KB
/
SingleSpringApp.ts
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
// Copyright 2016 Erik Neumann. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { AbstractApp } from '../common/AbstractApp.js';
import { DisplayShape } from '../../lab/view/DisplayShape.js';
import { DisplaySpring } from '../../lab/view/DisplaySpring.js';
import { DoubleRect } from '../../lab/util/DoubleRect.js';
import { ElementIDs } from '../common/Layout.js';
import { FunctionVariable } from '../../lab/model/FunctionVariable.js';
import { NumericControl } from '../../lab/controls/NumericControl.js';
import { ParameterNumber, Subject, SubjectList } from '../../lab/util/Observe.js';
import { PointMass } from '../../lab/model/PointMass.js';
import { SimpleAdvance } from '../../lab/model/SimpleAdvance.js';
import { SingleSpringSim } from './SingleSpringSim.js';
import { Spring } from '../../lab/model/Spring.js';
import { Util } from '../../lab/util/Util.js';
/** Displays the {@link SingleSpringSim} simulation.
*/
export class SingleSpringApp extends AbstractApp<SingleSpringSim> implements Subject, SubjectList {
block: DisplayShape;
spring: DisplaySpring;
/**
* @param elem_ids specifies the names of the HTML
* elementId's to look for in the HTML document; these elements are where the user
* interface of the simulation is created.
* @param opt_name name of this as a Subject
*/
constructor(elem_ids: ElementIDs, opt_name?: string) {
Util.setErrorHandler();
const simRect = new DoubleRect(-3, -2, 3, 2);
const sim = new SingleSpringSim();
const advance = new SimpleAdvance(sim);
super(elem_ids, simRect, sim, advance, /*eventHandler=*/sim,
/*energySystem=*/sim, opt_name);
this.block = new DisplayShape(this.simList.getPointMass('block'));
this.block.setFillStyle('blue');
this.displayList.add(this.block);
this.spring = new DisplaySpring(this.simList.getSpring('spring'));
this.spring.setWidth(0.4);
this.spring.setThickness(6);
this.displayList.add(this.spring);
// Demo of adding an FunctionVariable.
const va = sim.getVarsList();
va.addVariable(new FunctionVariable(va, 'sin_time', 'sin(time)',
() => Math.sin(sim.getTime()) ));
this.addPlaybackControls();
let pn = sim.getParameterNumber(SingleSpringSim.en.MASS);
this.addControl(new NumericControl(pn));
pn = sim.getParameterNumber(SingleSpringSim.en.DAMPING);
this.addControl(new NumericControl(pn));
pn = sim.getParameterNumber(SingleSpringSim.en.SPRING_STIFFNESS);
this.addControl(new NumericControl(pn));
pn = sim.getParameterNumber(SingleSpringSim.en.SPRING_LENGTH);
this.addControl(new NumericControl(pn));
pn = sim.getParameterNumber(SingleSpringSim.en.FIXED_POINT);
this.addControl(new NumericControl(pn));
this.addStandardControls();
this.makeEasyScript();
this.addURLScriptButton();
};
/** @inheritDoc */
override toString() {
return this.toStringShort().slice(0, -1)
+', block: '+this.block.toStringShort()
+', spring: '+this.spring.toStringShort()
+ super.toString();
};
/** @inheritDoc */
getClassName() {
return 'SingleSpringApp';
};
/** @inheritDoc */
override defineNames(myName: string): void {
super.defineNames(myName);
this.terminal.addRegex('block|spring',
myName+'.');
};
} // end class
Util.defineGlobal('sims$springs$SingleSpringApp', SingleSpringApp);