aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx')
-rw-r--r--src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx383
1 files changed, 193 insertions, 190 deletions
diff --git a/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx b/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx
index ae674d604..f88eb3bca 100644
--- a/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx
+++ b/src/client/views/nodes/PhysicsBox/PhysicsSimulationBox.tsx
@@ -1,3 +1,11 @@
+/* eslint-disable camelcase */
+/* eslint-disable jsx-a11y/control-has-associated-label */
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
+/* eslint-disable jsx-a11y/click-events-have-key-events */
+/* eslint-disable react/no-array-index-key */
+/* eslint-disable react/jsx-props-no-spreading */
+/* eslint-disable no-return-assign */
import ArrowLeftIcon from '@mui/icons-material/ArrowLeft';
import ArrowRightIcon from '@mui/icons-material/ArrowRight';
import PauseIcon from '@mui/icons-material/Pause';
@@ -13,13 +21,15 @@ import { NumListCast } from '../../../../fields/Doc';
import { List } from '../../../../fields/List';
import { BoolCast, NumCast, StrCast } from '../../../../fields/Types';
import { ViewBoxAnnotatableComponent } from '../../DocComponent';
-import { FieldView, FieldViewProps } from './../FieldView';
+import { FieldView, FieldViewProps } from '../FieldView';
import './PhysicsSimulationBox.scss';
import InputField from './PhysicsSimulationInputField';
import questions from './PhysicsSimulationQuestions.json';
import tutorials from './PhysicsSimulationTutorial.json';
import Wall from './PhysicsSimulationWall';
import Weight from './PhysicsSimulationWeight';
+import { Docs } from '../../../documents/Documents';
+import { DocumentType } from '../../../documents/DocumentTypes';
interface IWallProps {
length: number;
@@ -204,7 +214,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
componentDidUpdate(prevProps: Readonly<FieldViewProps>) {
super.componentDidUpdate(prevProps);
- if (this.xMax !== this._props.PanelWidth() * 0.6 || this.yMax != this._props.PanelHeight()) {
+ if (this.xMax !== this._props.PanelWidth() * 0.6 || this.yMax !== this._props.PanelHeight()) {
this.xMax = this._props.PanelWidth() * 0.6;
this.yMax = this._props.PanelHeight();
this.setupSimulation();
@@ -219,16 +229,16 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
@action
setupSimulation = () => {
- const simulationType = this.simulationType;
+ const { simulationType } = this;
const mode = this.simulationMode;
this.dataDoc.simulation_paused = true;
- if (simulationType != 'Circular Motion') {
+ if (simulationType !== 'Circular Motion') {
this.dataDoc.mass1_velocityXstart = 0;
this.dataDoc.mass1_velocityYstart = 0;
this.dataDoc.mass1_velocityX = 0;
this.dataDoc.mass1_velocityY = 0;
}
- if (mode == 'Freeform') {
+ if (mode === 'Freeform') {
this.dataDoc.simulation_showForceMagnitudes = true;
// prettier-ignore
switch (simulationType) {
@@ -247,9 +257,10 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
case 'Circular Motion': this.setupCircular(20); break;
case 'Pulley': this.setupPulley(); break;
case 'Suspension': this.setupSuspension();break;
+ default:
}
this._simReset++;
- } else if (mode == 'Review') {
+ } else if (mode === 'Review') {
this.dataDoc.simulation_showComponentForces = false;
this.dataDoc.simulation_showForceMagnitudes = true;
this.dataDoc.simulation_showAcceleration = false;
@@ -265,12 +276,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
case 'Circular Motion': this.setupCircular(0); break; // TODO - circular motion review problems
case 'Pulley': this.setupPulley(); break; // TODO - pulley tutorial review problems
case 'Suspension': this.setupSuspension(); break; // TODO - suspension tutorial review problems
+ default:
}
- } else if (mode == 'Tutorial') {
+ } else if (mode === 'Tutorial') {
this.dataDoc.simulation_showComponentForces = false;
this.dataDoc.tutorial_stepNumber = 0;
this.dataDoc.simulation_showAcceleration = false;
- if (this.simulationType != 'Circular Motion') {
+ if (this.simulationType !== 'Circular Motion') {
this.dataDoc.mass1_velocityX = 0;
this.dataDoc.mass1_velocityY = 0;
this.dataDoc.simulation_showVelocity = false;
@@ -333,6 +345,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.mass1_forcesStart = JSON.stringify(tutorials.suspension.steps[0].forces);
this.dataDoc.simulation_showForceMagnitudes = tutorials.suspension.steps[0].showMagnitude;
break;
+ default:
}
this._simReset++;
}
@@ -349,7 +362,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
magnitude: Math.abs(this.gravity) * Math.cos(Math.atan(height / width)) * this.mass1,
directionInDegrees: 180 - 90 - (Math.atan(height / width) * 180) / Math.PI,
};
- let frictionForce: IForce = {
+ const frictionForce: IForce = {
description: 'Static Friction Force',
magnitude: coefficient * Math.abs(this.gravity) * Math.cos(Math.atan(height / width)) * this.mass1,
directionInDegrees: 180 - (Math.atan(height / width) * 180) / Math.PI,
@@ -378,7 +391,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
directionInDegrees: 360 - (Math.atan(height / width) * 180) / Math.PI,
};
const gravityForce = this.gravityForce(this.mass1);
- if (coefficient != 0) {
+ if (coefficient !== 0) {
this.dataDoc.mass1_forcesStart = JSON.stringify([gravityForce, normalForce, frictionForce]);
this.dataDoc.mass1_forcesUpdated = JSON.stringify([gravityForce, normalForce, frictionForce]);
this.dataDoc.mass1_componentForces = JSON.stringify([frictionForce, normalForceComponent, gravityParallel, gravityPerpendicular]);
@@ -396,12 +409,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.wedge_height = Math.tan(radAng) * this.dataDoc.wedge_width;
// update weight position based on updated wedge width/height
- let yPos = this.yMax - this.dataDoc.wedge_height - this.mass1Radius * Math.cos(radAng) - this.mass1Radius;
- let xPos = this.xMax * 0.25 + this.mass1Radius * Math.sin(radAng) - this.mass1Radius;
+ const yPos = this.yMax - this.dataDoc.wedge_height - this.mass1Radius * Math.cos(radAng) - this.mass1Radius;
+ const xPos = this.xMax * 0.25 + this.mass1Radius * Math.sin(radAng) - this.mass1Radius;
this.dataDoc.mass1_positionXstart = xPos;
this.dataDoc.mass1_positionYstart = yPos;
- if (this.simulationMode == 'Freeform') {
+ if (this.simulationMode === 'Freeform') {
this.updateForcesWithFriction(NumCast(this.dataDoc.coefficientOfStaticFriction), this.dataDoc.wedge_width, Math.tan(radAng) * this.dataDoc.wedge_width);
}
};
@@ -409,7 +422,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
// In review mode, update forces when coefficient of static friction changed
updateReviewForcesBasedOnCoefficient = (coefficient: number) => {
let theta = this.wedgeAngle;
- let index = this.selectedQuestion.variablesForQuestionSetup.indexOf('theta - max 45');
+ const index = this.selectedQuestion.variablesForQuestionSetup.indexOf('theta - max 45');
if (index >= 0) {
theta = NumListCast(this.dataDoc.questionVariables)[index];
}
@@ -467,26 +480,26 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
const description = question.answerSolutionDescriptions[i];
if (!isNaN(NumCast(description))) {
solutions.push(NumCast(description));
- } else if (description == 'solve normal force angle from wedge angle') {
+ } else if (description === 'solve normal force angle from wedge angle') {
solutions.push(90 - theta);
- } else if (description == 'solve normal force magnitude from wedge angle') {
+ } else if (description === 'solve normal force magnitude from wedge angle') {
solutions.push(Math.abs(this.gravity) * Math.cos((theta / 180) * Math.PI));
- } else if (description == 'solve static force magnitude from wedge angle given equilibrium') {
- let normalForceMagnitude = Math.abs(this.gravity) * Math.cos((theta / 180) * Math.PI);
- let normalForceAngle = 90 - theta;
- let frictionForceAngle = 180 - theta;
- let frictionForceMagnitude = (-normalForceMagnitude * Math.sin((normalForceAngle * Math.PI) / 180) + Math.abs(this.gravity)) / Math.sin((frictionForceAngle * Math.PI) / 180);
+ } else if (description === 'solve static force magnitude from wedge angle given equilibrium') {
+ const normalForceMagnitude = Math.abs(this.gravity) * Math.cos((theta / 180) * Math.PI);
+ const normalForceAngle = 90 - theta;
+ const frictionForceAngle = 180 - theta;
+ const frictionForceMagnitude = (-normalForceMagnitude * Math.sin((normalForceAngle * Math.PI) / 180) + Math.abs(this.gravity)) / Math.sin((frictionForceAngle * Math.PI) / 180);
solutions.push(frictionForceMagnitude);
- } else if (description == 'solve static force angle from wedge angle given equilibrium') {
+ } else if (description === 'solve static force angle from wedge angle given equilibrium') {
solutions.push(180 - theta);
- } else if (description == 'solve minimum static coefficient from wedge angle given equilibrium') {
- let normalForceMagnitude = Math.abs(this.gravity) * Math.cos((theta / 180) * Math.PI);
- let normalForceAngle = 90 - theta;
- let frictionForceAngle = 180 - theta;
- let frictionForceMagnitude = (-normalForceMagnitude * Math.sin((normalForceAngle * Math.PI) / 180) + Math.abs(this.gravity)) / Math.sin((frictionForceAngle * Math.PI) / 180);
- let frictionCoefficient = frictionForceMagnitude / normalForceMagnitude;
+ } else if (description === 'solve minimum static coefficient from wedge angle given equilibrium') {
+ const normalForceMagnitude = Math.abs(this.gravity) * Math.cos((theta / 180) * Math.PI);
+ const normalForceAngle = 90 - theta;
+ const frictionForceAngle = 180 - theta;
+ const frictionForceMagnitude = (-normalForceMagnitude * Math.sin((normalForceAngle * Math.PI) / 180) + Math.abs(this.gravity)) / Math.sin((frictionForceAngle * Math.PI) / 180);
+ const frictionCoefficient = frictionForceMagnitude / normalForceMagnitude;
solutions.push(frictionCoefficient);
- } else if (description == 'solve maximum wedge angle from coefficient of static friction given equilibrium') {
+ } else if (description === 'solve maximum wedge angle from coefficient of static friction given equilibrium') {
solutions.push((Math.atan(muS) * 180) / Math.PI);
}
}
@@ -497,38 +510,38 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
// In review mode, check if input answers match correct answers and optionally generate alert
checkAnswers = (showAlert: boolean = true) => {
let error: boolean = false;
- let epsilon: number = 0.01;
+ const epsilon: number = 0.01;
if (this.selectedQuestion) {
for (let i = 0; i < this.selectedQuestion.answerParts.length; i++) {
- if (this.selectedQuestion.answerParts[i] == 'force of gravity') {
+ if (this.selectedQuestion.answerParts[i] === 'force of gravity') {
if (Math.abs(NumCast(this.dataDoc.review_GravityMagnitude) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'angle of gravity') {
+ } else if (this.selectedQuestion.answerParts[i] === 'angle of gravity') {
if (Math.abs(NumCast(this.dataDoc.review_GravityAngle) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'normal force') {
+ } else if (this.selectedQuestion.answerParts[i] === 'normal force') {
if (Math.abs(NumCast(this.dataDoc.review_NormalMagnitude) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'angle of normal force') {
+ } else if (this.selectedQuestion.answerParts[i] === 'angle of normal force') {
if (Math.abs(NumCast(this.dataDoc.review_NormalAngle) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'force of static friction') {
+ } else if (this.selectedQuestion.answerParts[i] === 'force of static friction') {
if (Math.abs(NumCast(this.dataDoc.review_StaticMagnitude) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'angle of static friction') {
+ } else if (this.selectedQuestion.answerParts[i] === 'angle of static friction') {
if (Math.abs(NumCast(this.dataDoc.review_StaticAngle) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'coefficient of static friction') {
+ } else if (this.selectedQuestion.answerParts[i] === 'coefficient of static friction') {
if (Math.abs(NumCast(this.dataDoc.coefficientOfStaticFriction) - this.selectedSolutions[i]) > epsilon) {
error = true;
}
- } else if (this.selectedQuestion.answerParts[i] == 'wedge angle') {
+ } else if (this.selectedQuestion.answerParts[i] === 'wedge angle') {
if (Math.abs(this.wedgeAngle - this.selectedSolutions[i]) > epsilon) {
error = true;
}
@@ -539,7 +552,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.simulation_paused = false;
setTimeout(() => (this.dataDoc.simulation_paused = true), 3000);
}
- if (this.selectedQuestion.goal == 'noMovement') {
+ if (this.selectedQuestion.goal === 'noMovement') {
this.dataDoc.noMovement = !error;
}
};
@@ -571,12 +584,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
let wedge_angle = 0;
for (let i = 0; i < question.variablesForQuestionSetup.length; i++) {
- if (question.variablesForQuestionSetup[i] == 'theta - max 45') {
- let randValue = Math.floor(Math.random() * 44 + 1);
+ if (question.variablesForQuestionSetup[i] === 'theta - max 45') {
+ const randValue = Math.floor(Math.random() * 44 + 1);
vars.push(randValue);
wedge_angle = randValue;
- } else if (question.variablesForQuestionSetup[i] == 'coefficient of static friction') {
- let randValue = Math.round(Math.random() * 1000) / 1000;
+ } else if (question.variablesForQuestionSetup[i] === 'coefficient of static friction') {
+ const randValue = Math.round(Math.random() * 1000) / 1000;
vars.push(randValue);
coefficient = randValue;
}
@@ -589,7 +602,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
let q = '';
for (let i = 0; i < question.questionSetup.length; i++) {
q += question.questionSetup[i];
- if (i != question.questionSetup.length - 1) {
+ if (i !== question.questionSetup.length - 1) {
q += vars[i];
if (question.variablesForQuestionSetup[i].includes('theta')) {
q += ' degree (≈' + Math.round((1000 * (vars[i] * Math.PI)) / 180) / 1000 + ' rad)';
@@ -601,7 +614,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.questionPartOne = q;
this.dataDoc.questionPartTwo = question.question;
this.dataDoc.answers = new List<number>(this.getAnswersToQuestion(question, vars));
- //this.dataDoc.simulation_reset = (!this.dataDoc.simulation_reset);
+ // this.dataDoc.simulation_reset = (!this.dataDoc.simulation_reset);
};
// Default setup for uniform circular motion simulation
@@ -610,8 +623,8 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.simulation_showComponentForces = false;
this.dataDoc.mass1_velocityYstart = 0;
this.dataDoc.mass1_velocityXstart = value;
- let xPos = (this.xMax + this.xMin) / 2 - this.mass1Radius;
- let yPos = (this.yMax + this.yMin) / 2 + this.circularMotionRadius - this.mass1Radius;
+ const xPos = (this.xMax + this.xMin) / 2 - this.mass1Radius;
+ const yPos = (this.yMax + this.yMin) / 2 + this.circularMotionRadius - this.mass1Radius;
this.dataDoc.mass1_positionYstart = yPos;
this.dataDoc.mass1_positionXstart = xPos;
const tensionForce: IForce = {
@@ -680,13 +693,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
// Default setup for suspension simulation
@action
setupSuspension = () => {
- let xPos = (this.xMax + this.xMin) / 2 - this.mass1Radius;
- let yPos = this.yMin + 200;
+ const xPos = (this.xMax + this.xMin) / 2 - this.mass1Radius;
+ const yPos = this.yMin + 200;
this.dataDoc.mass1_positionYstart = yPos;
this.dataDoc.mass1_positionXstart = xPos;
this.dataDoc.mass1_positionY = this.getDisplayYPos(yPos);
this.dataDoc.mass1_positionX = xPos;
- let tensionMag = (this.mass1 * Math.abs(this.gravity)) / (2 * Math.sin(Math.PI / 4));
+ const tensionMag = (this.mass1 * Math.abs(this.gravity)) / (2 * Math.sin(Math.PI / 4));
const tensionForce1: IForce = {
description: 'Tension',
magnitude: tensionMag,
@@ -891,7 +904,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
setVelocity={this.setVelocity1}
setAcceleration={this.setAcceleration1}
/>
- {this.simulationType == 'Pulley' && (
+ {this.simulationType === 'Pulley' && (
<Weight
{...commonWeightProps}
color="green"
@@ -916,7 +929,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
)}
</div>
<div style={{ position: 'absolute', transformOrigin: 'top left', top: 0, left: 0, width: '100%', height: '100%' }}>
- {(this.simulationType == 'One Weight' || this.simulationType == 'Inclined Plane') &&
+ {(this.simulationType === 'One Weight' || this.simulationType === 'Inclined Plane') &&
this.wallPositions?.map((element, index) => <Wall key={index} length={element.length} xPos={element.xPos} yPos={element.yPos} angleInDegrees={element.angleInDegrees} />)}
</div>
</div>
@@ -927,17 +940,17 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
style={{ overflow: 'auto', height: `${Math.max(1, 800 / this._props.PanelWidth()) * 100}%`, transform: `scale(${Math.min(1, this._props.PanelWidth() / 850)})` }}>
<div className="mechanicsSimulationControls">
<Stack direction="row" spacing={1}>
- {this.dataDoc.simulation_paused && this.simulationMode != 'Tutorial' && (
+ {this.dataDoc.simulation_paused && this.simulationMode !== 'Tutorial' && (
<IconButton onClick={() => (this.dataDoc.simulation_paused = false)}>
<PlayArrowIcon />
</IconButton>
)}
- {!this.dataDoc.simulation_paused && this.simulationMode != 'Tutorial' && (
+ {!this.dataDoc.simulation_paused && this.simulationMode !== 'Tutorial' && (
<IconButton onClick={() => (this.dataDoc.simulation_paused = true)}>
<PauseIcon />
</IconButton>
)}
- {this.dataDoc.simulation_paused && this.simulationMode != 'Tutorial' && (
+ {this.dataDoc.simulation_paused && this.simulationMode !== 'Tutorial' && (
<IconButton onClick={action(() => this._simReset++)}>
<ReplayIcon />
</IconButton>
@@ -974,15 +987,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</select>
</div>
</div>
- {this.simulationMode == 'Review' && this.simulationType != 'Inclined Plane' && (
+ {this.simulationMode === 'Review' && this.simulationType !== 'Inclined Plane' && (
<div className="wordProblemBox">
- <p>
- <>{this.simulationType} review problems in progress!</>
- </p>
+ <p>{this.simulationType} review problems in progress!</p>
<hr />
</div>
)}
- {this.simulationMode == 'Review' && this.simulationType == 'Inclined Plane' && (
+ {this.simulationMode === 'Review' && this.simulationType === 'Inclined Plane' && (
<div>
{!this.dataDoc.hintDialogueOpen && (
<IconButton
@@ -995,7 +1006,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
<QuestionMarkIcon />
</IconButton>
)}
- <Dialog maxWidth={'sm'} fullWidth={true} open={BoolCast(this.dataDoc.hintDialogueOpen)} onClose={() => (this.dataDoc.hintDialogueOpen = false)}>
+ <Dialog maxWidth="sm" fullWidth open={BoolCast(this.dataDoc.hintDialogueOpen)} onClose={() => (this.dataDoc.hintDialogueOpen = false)}>
<DialogTitle>Hints</DialogTitle>
<DialogContent>
{this.selectedQuestion.hints?.map((hint: any, index: number) => (
@@ -1030,12 +1041,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_GravityMagnitude"
step={0.1}
- unit={'N'}
+ unit="N"
upperBound={50}
value={NumCast(this.dataDoc.review_GravityMagnitude)}
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('force of gravity')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('angle of gravity') && (
@@ -1045,13 +1056,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_GravityAngle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={360}
value={NumCast(this.dataDoc.review_GravityAngle)}
- radianEquivalent={true}
+ radianEquivalent
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('angle of gravity')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('normal force') && (
@@ -1061,12 +1072,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_NormalMagnitude"
step={0.1}
- unit={'N'}
+ unit="N"
upperBound={50}
value={NumCast(this.dataDoc.review_NormalMagnitude)}
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('normal force')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('angle of normal force') && (
@@ -1076,13 +1087,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_NormalAngle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={360}
value={NumCast(this.dataDoc.review_NormalAngle)}
- radianEquivalent={true}
+ radianEquivalent
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('angle of normal force')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('force of static friction') && (
@@ -1092,12 +1103,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_StaticMagnitude"
step={0.1}
- unit={'N'}
+ unit="N"
upperBound={50}
value={NumCast(this.dataDoc.review_StaticMagnitude)}
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('force of static friction')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('angle of static friction') && (
@@ -1107,13 +1118,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="review_StaticAngle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={360}
value={NumCast(this.dataDoc.review_StaticAngle)}
- radianEquivalent={true}
+ radianEquivalent
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('angle of static friction')]}
- labelWidth={'7em'}
+ labelWidth="7em"
/>
)}
{this.selectedQuestion.answerParts.includes('coefficient of static friction') && (
@@ -1127,7 +1138,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="coefficientOfStaticFriction"
step={0.1}
- unit={''}
+ unit=""
upperBound={1}
value={NumCast(this.dataDoc.coefficientOfStaticFriction)}
effect={this.updateReviewForcesBasedOnCoefficient}
@@ -1142,14 +1153,14 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="wedge_angle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={49}
value={this.wedgeAngle}
effect={(val: number) => {
this.changeWedgeBasedOnNewAngle(val);
this.updateReviewForcesBasedOnAngle(val);
}}
- radianEquivalent={true}
+ radianEquivalent
showIcon={BoolCast(this.dataDoc.simulation_showIcon)}
correctValue={NumListCast(this.dataDoc.answers)[this.selectedQuestion.answerParts.indexOf('wedge angle')]}
/>
@@ -1158,7 +1169,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</div>
</div>
)}
- {this.simulationMode == 'Tutorial' && (
+ {this.simulationMode === 'Tutorial' && (
<div className="wordProblemBox">
<div className="question">
<h2>Problem</h2>
@@ -1180,7 +1191,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.mass1_forcesUpdated = JSON.stringify(this.tutorial.steps[step].forces);
this.dataDoc.simulation_showForceMagnitudes = this.tutorial.steps[step].showMagnitude;
}}
- disabled={this.dataDoc.tutorial_stepNumber == 0}>
+ disabled={this.dataDoc.tutorial_stepNumber === 0}>
<ArrowLeftIcon />
</IconButton>
<div>
@@ -1204,8 +1215,8 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</IconButton>
</div>
<div>
- {(this.simulationType == 'One Weight' || this.simulationType == 'Inclined Plane' || this.simulationType == 'Pendulum') && <p>Resources</p>}
- {this.simulationType == 'One Weight' && (
+ {(this.simulationType === 'One Weight' || this.simulationType === 'Inclined Plane' || this.simulationType === 'Pendulum') && <p>Resources</p>}
+ {this.simulationType === 'One Weight' && (
<ul>
<li>
<a
@@ -1233,7 +1244,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</li>
</ul>
)}
- {this.simulationType == 'Inclined Plane' && (
+ {this.simulationType === 'Inclined Plane' && (
<ul>
<li>
<a
@@ -1261,7 +1272,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</li>
</ul>
)}
- {this.simulationType == 'Pendulum' && (
+ {this.simulationType === 'Pendulum' && (
<ul>
<li>
<a
@@ -1280,7 +1291,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</div>
</div>
)}
- {this.simulationMode == 'Review' && this.simulationType == 'Inclined Plane' && (
+ {this.simulationMode === 'Review' && this.simulationType === 'Inclined Plane' && (
<div
style={{
display: 'flex',
@@ -1318,11 +1329,11 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</div>
</div>
)}
- {this.simulationMode == 'Freeform' && (
+ {this.simulationMode === 'Freeform' && (
<div className="vars">
<FormControl component="fieldset">
<FormGroup>
- {this.simulationType == 'One Weight' && (
+ {this.simulationType === 'One Weight' && (
<FormControlLabel
control={<Checkbox checked={BoolCast(this.dataDoc.elasticCollisions)} onChange={() => (this.dataDoc.elasticCollisions = !this.dataDoc.elasticCollisions)} />}
label="Make collisions elastic"
@@ -1334,7 +1345,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
label="Show force vectors"
labelPlacement="start"
/>
- {(this.simulationType == 'Inclined Plane' || this.simulationType == 'Pendulum') && (
+ {(this.simulationType === 'Inclined Plane' || this.simulationType === 'Pendulum') && (
<FormControlLabel
control={<Checkbox checked={BoolCast(this.dataDoc.simulation_showComponentForces)} onChange={() => (this.dataDoc.simulation_showComponentForces = !this.dataDoc.simulation_showComponentForces)} />}
label="Show component force vectors"
@@ -1351,80 +1362,80 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
label="Show velocity vector"
labelPlacement="start"
/>
- <InputField label={<Box>Speed</Box>} lowerBound={1} dataDoc={this.dataDoc} prop="simulation_speed" step={1} unit={'x'} upperBound={10} value={NumCast(this.dataDoc.simulation_speed, 2)} labelWidth={'5em'} />
- {this.dataDoc.simulation_paused && this.simulationType != 'Circular Motion' && (
+ <InputField label={<Box>Speed</Box>} lowerBound={1} dataDoc={this.dataDoc} prop="simulation_speed" step={1} unit="x" upperBound={10} value={NumCast(this.dataDoc.simulation_speed, 2)} labelWidth="5em" />
+ {this.dataDoc.simulation_paused && this.simulationType !== 'Circular Motion' && (
<InputField
label={<Box>Gravity</Box>}
lowerBound={-30}
dataDoc={this.dataDoc}
prop="gravity"
step={0.01}
- unit={'m/s2'}
+ unit="m/s2"
upperBound={0}
value={NumCast(this.dataDoc.simulation_gravity, -9.81)}
effect={(val: number) => this.setupSimulation()}
- labelWidth={'5em'}
+ labelWidth="5em"
/>
)}
- {this.dataDoc.simulation_paused && this.simulationType != 'Pulley' && (
+ {this.dataDoc.simulation_paused && this.simulationType !== 'Pulley' && (
<InputField
label={<Box>Mass</Box>}
lowerBound={1}
dataDoc={this.dataDoc}
prop="mass1"
step={0.1}
- unit={'kg'}
+ unit="kg"
upperBound={5}
value={this.mass1 ?? 1}
effect={(val: number) => this.setupSimulation()}
- labelWidth={'5em'}
+ labelWidth="5em"
/>
)}
- {this.dataDoc.simulation_paused && this.simulationType == 'Pulley' && (
+ {this.dataDoc.simulation_paused && this.simulationType === 'Pulley' && (
<InputField
label={<Box>Red mass</Box>}
lowerBound={1}
dataDoc={this.dataDoc}
prop="mass1"
step={0.1}
- unit={'kg'}
+ unit="kg"
upperBound={5}
value={this.mass1 ?? 1}
effect={(val: number) => this.setupSimulation()}
- labelWidth={'5em'}
+ labelWidth="5em"
/>
)}
- {this.dataDoc.simulation_paused && this.simulationType == 'Pulley' && (
+ {this.dataDoc.simulation_paused && this.simulationType === 'Pulley' && (
<InputField
label={<Box>Blue mass</Box>}
lowerBound={1}
dataDoc={this.dataDoc}
prop="mass2"
step={0.1}
- unit={'kg'}
+ unit="kg"
upperBound={5}
value={this.mass2 ?? 1}
effect={(val: number) => this.setupSimulation()}
- labelWidth={'5em'}
+ labelWidth="5em"
/>
)}
- {this.dataDoc.simulation_paused && this.simulationType == 'Circular Motion' && (
+ {this.dataDoc.simulation_paused && this.simulationType === 'Circular Motion' && (
<InputField
label={<Box>Rod length</Box>}
lowerBound={100}
dataDoc={this.dataDoc}
prop="circularMotionRadius"
step={5}
- unit={'m'}
+ unit="m"
upperBound={250}
value={this.circularMotionRadius}
effect={(val: number) => this.setupSimulation()}
- labelWidth={'5em'}
+ labelWidth="5em"
/>
)}
</FormGroup>
</FormControl>
- {this.simulationType == 'Spring' && this.dataDoc.simulation_paused && (
+ {this.simulationType === 'Spring' && this.dataDoc.simulation_paused && (
<div>
<InputField
label={<Typography color="inherit">Spring stiffness</Typography>}
@@ -1432,13 +1443,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="spring_constant"
step={1}
- unit={'N/m'}
+ unit="N/m"
upperBound={500}
value={this.springConstant}
effect={action(() => this._simReset++)}
radianEquivalent={false}
- mode={'Freeform'}
- labelWidth={'7em'}
+ mode="Freeform"
+ labelWidth="7em"
/>
<InputField
label={<Typography color="inherit">Rest length</Typography>}
@@ -1452,7 +1463,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
effect={action(() => this._simReset++)}
radianEquivalent={false}
mode="Freeform"
- labelWidth={'7em'}
+ labelWidth="7em"
/>
<InputField
label={<Typography color="inherit">Starting displacement</Typography>}
@@ -1470,11 +1481,11 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
})}
radianEquivalent={false}
mode="Freeform"
- labelWidth={'7em'}
+ labelWidth="7em"
/>
</div>
)}
- {this.simulationType == 'Inclined Plane' && this.dataDoc.simulation_paused && (
+ {this.simulationType === 'Inclined Plane' && this.dataDoc.simulation_paused && (
<div>
<InputField
label={<Box>&theta;</Box>}
@@ -1482,16 +1493,16 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="wedge_angle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={49}
value={this.wedgeAngle}
effect={action((val: number) => {
this.changeWedgeBasedOnNewAngle(val);
this._simReset++;
})}
- radianEquivalent={true}
- mode={'Freeform'}
- labelWidth={'2em'}
+ radianEquivalent
+ mode="Freeform"
+ labelWidth="2em"
/>
<InputField
label={
@@ -1503,7 +1514,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="coefficientOfStaticFriction"
step={0.1}
- unit={''}
+ unit=""
upperBound={1}
value={NumCast(this.dataDoc.coefficientOfStaticFriction) ?? 0}
effect={action((val: number) => {
@@ -1513,8 +1524,8 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
}
this._simReset++;
})}
- mode={'Freeform'}
- labelWidth={'2em'}
+ mode="Freeform"
+ labelWidth="2em"
/>
<InputField
label={
@@ -1526,16 +1537,16 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="coefficientOfKineticFriction"
step={0.1}
- unit={''}
+ unit=""
upperBound={NumCast(this.dataDoc.coefficientOfStaticFriction)}
value={NumCast(this.dataDoc.coefficientOfKineticFriction) ?? 0}
effect={action(() => this._simReset++)}
- mode={'Freeform'}
- labelWidth={'2em'}
+ mode="Freeform"
+ labelWidth="2em"
/>
</div>
)}
- {this.simulationType == 'Inclined Plane' && !this.dataDoc.simulation_paused && (
+ {this.simulationType === 'Inclined Plane' && !this.dataDoc.simulation_paused && (
<Typography>
<>
&theta;: {Math.round(this.wedgeAngle * 100) / 100}° ≈ {Math.round(((this.wedgeAngle * Math.PI) / 180) * 100) / 100} rad
@@ -1546,12 +1557,12 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</>
</Typography>
)}
- {this.simulationType == 'Pendulum' && !this.dataDoc.simulation_paused && (
+ {this.simulationType === 'Pendulum' && !this.dataDoc.simulation_paused && (
<Typography>
&theta;: {Math.round(this.pendulumAngle * 100) / 100}° ≈ {Math.round(((this.pendulumAngle * Math.PI) / 180) * 100) / 100} rad
</Typography>
)}
- {this.simulationType == 'Pendulum' && this.dataDoc.simulation_paused && (
+ {this.simulationType === 'Pendulum' && this.dataDoc.simulation_paused && (
<div>
<InputField
label={<Box>Angle</Box>}
@@ -1559,13 +1570,13 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="pendulum_angle"
step={1}
- unit={'°'}
+ unit="°"
upperBound={59}
value={NumCast(this.dataDoc.pendulum_angle, 30)}
effect={action(value => {
this.dataDoc.pendulum_angleStart = value;
this.dataDoc.pendulum_lengthStart = this.dataDoc.pendulum_length;
- if (this.simulationType == 'Pendulum') {
+ if (this.simulationType === 'Pendulum') {
const mag = this.mass1 * Math.abs(this.gravity) * Math.cos((value * Math.PI) / 180);
const forceOfTension: IForce = {
@@ -1598,7 +1609,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this._simReset++;
}
})}
- radianEquivalent={true}
+ radianEquivalent
mode="Freeform"
labelWidth="5em"
/>
@@ -1612,7 +1623,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
upperBound={400}
value={Math.round(this.pendulumLength)}
effect={action(value => {
- if (this.simulationType == 'Pendulum') {
+ if (this.simulationType === 'Pendulum') {
this.dataDoc.pendulum_angleStart = this.pendulumAngle;
this.dataDoc.pendulum_lengthStart = value;
this._simReset++;
@@ -1627,11 +1638,11 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</div>
)}
<div className="mechanicsSimulationEquation">
- {this.simulationMode == 'Freeform' && (
+ {this.simulationMode === 'Freeform' && (
<table>
<tbody>
<tr>
- <td>{this.simulationType == 'Pulley' ? 'Red Weight' : ''}</td>
+ <td>{this.simulationType === 'Pulley' ? 'Red Weight' : ''}</td>
<td>X</td>
<td>Y</td>
</tr>
@@ -1646,36 +1657,34 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
>
<Box>Position</Box>
</td>
- {(!this.dataDoc.simulation_paused || this.simulationType == 'Inclined Plane' || this.simulationType == 'Circular Motion' || this.simulationType == 'Pulley') && (
- <td style={{ cursor: 'default' }}>
- <>{this.dataDoc.mass1_positionX} m</>
- </td>
+ {(!this.dataDoc.simulation_paused || this.simulationType === 'Inclined Plane' || this.simulationType === 'Circular Motion' || this.simulationType === 'Pulley') && (
+ <td style={{ cursor: 'default' }}>{this.dataDoc.mass1_positionX + ''} m</td>
)}{' '}
- {this.dataDoc.simulation_paused && this.simulationType != 'Inclined Plane' && this.simulationType != 'Circular Motion' && this.simulationType != 'Pulley' && (
+ {this.dataDoc.simulation_paused && this.simulationType !== 'Inclined Plane' && this.simulationType !== 'Circular Motion' && this.simulationType !== 'Pulley' && (
<td
style={{
cursor: 'default',
}}>
<InputField
- lowerBound={this.simulationType == 'Projectile' ? 1 : (this.xMax + this.xMin) / 4 - this.radius - 15}
+ lowerBound={this.simulationType === 'Projectile' ? 1 : (this.xMax + this.xMin) / 4 - this.radius - 15}
dataDoc={this.dataDoc}
prop="mass1_positionX"
step={1}
- unit={'m'}
- upperBound={this.simulationType == 'Projectile' ? this.xMax - 110 : (3 * (this.xMax + this.xMin)) / 4 - this.radius / 2 - 15}
+ unit="m"
+ upperBound={this.simulationType === 'Projectile' ? this.xMax - 110 : (3 * (this.xMax + this.xMin)) / 4 - this.radius / 2 - 15}
value={NumCast(this.dataDoc.mass1_positionX)}
effect={value => {
this.dataDoc.mass1_xChange = value;
- if (this.simulationType == 'Suspension') {
- let x1rod = (this.xMax + this.xMin) / 2 - this.radius - this.yMin - 200;
- let x2rod = (this.xMax + this.xMin) / 2 + this.yMin + 200 + this.radius;
- let deltaX1 = value + this.radius - x1rod;
- let deltaX2 = x2rod - (value + this.radius);
- let deltaY = this.getYPosFromDisplay(NumCast(this.dataDoc.mass1_positionY)) + this.radius;
+ if (this.simulationType === 'Suspension') {
+ const x1rod = (this.xMax + this.xMin) / 2 - this.radius - this.yMin - 200;
+ const x2rod = (this.xMax + this.xMin) / 2 + this.yMin + 200 + this.radius;
+ const deltaX1 = value + this.radius - x1rod;
+ const deltaX2 = x2rod - (value + this.radius);
+ const deltaY = this.getYPosFromDisplay(NumCast(this.dataDoc.mass1_positionY)) + this.radius;
let dir1T = Math.PI - Math.atan(deltaY / deltaX1);
let dir2T = Math.atan(deltaY / deltaX2);
- let tensionMag2 = (this.mass1 * Math.abs(this.gravity)) / ((-Math.cos(dir2T) / Math.cos(dir1T)) * Math.sin(dir1T) + Math.sin(dir2T));
- let tensionMag1 = (-tensionMag2 * Math.cos(dir2T)) / Math.cos(dir1T);
+ const tensionMag2 = (this.mass1 * Math.abs(this.gravity)) / ((-Math.cos(dir2T) / Math.cos(dir1T)) * Math.sin(dir1T) + Math.sin(dir2T));
+ const tensionMag1 = (-tensionMag2 * Math.cos(dir2T)) / Math.cos(dir1T);
dir1T = (dir1T * 180) / Math.PI;
dir2T = (dir2T * 180) / Math.PI;
const tensionForce1: IForce = {
@@ -1692,15 +1701,15 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.mass1_forcesUpdated = JSON.stringify([tensionForce1, tensionForce2, gravity]);
}
}}
- small={true}
+ small
mode="Freeform"
/>
</td>
)}{' '}
- {(!this.dataDoc.simulation_paused || this.simulationType == 'Inclined Plane' || this.simulationType == 'Circular Motion' || this.simulationType == 'Pulley') && (
+ {(!this.dataDoc.simulation_paused || this.simulationType === 'Inclined Plane' || this.simulationType === 'Circular Motion' || this.simulationType === 'Pulley') && (
<td style={{ cursor: 'default' }}>{`${NumCast(this.dataDoc.mass1_positionY)} m`}</td>
)}{' '}
- {this.dataDoc.simulation_paused && this.simulationType != 'Inclined Plane' && this.simulationType != 'Circular Motion' && this.simulationType != 'Pulley' && (
+ {this.dataDoc.simulation_paused && this.simulationType !== 'Inclined Plane' && this.simulationType !== 'Circular Motion' && this.simulationType !== 'Pulley' && (
<td
style={{
cursor: 'default',
@@ -1715,16 +1724,16 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
value={NumCast(this.dataDoc.mass1_positionY)}
effect={value => {
this.dataDoc.mass1_yChange = value;
- if (this.simulationType == 'Suspension') {
- let x1rod = (this.xMax + this.xMin) / 2 - this.radius - this.yMin - 200;
- let x2rod = (this.xMax + this.xMin) / 2 + this.yMin + 200 + this.radius;
- let deltaX1 = NumCast(this.dataDoc.mass1_positionX) + this.radius - x1rod;
- let deltaX2 = x2rod - (NumCast(this.dataDoc.mass1_positionX) + this.radius);
- let deltaY = this.getYPosFromDisplay(value) + this.radius;
+ if (this.simulationType === 'Suspension') {
+ const x1rod = (this.xMax + this.xMin) / 2 - this.radius - this.yMin - 200;
+ const x2rod = (this.xMax + this.xMin) / 2 + this.yMin + 200 + this.radius;
+ const deltaX1 = NumCast(this.dataDoc.mass1_positionX) + this.radius - x1rod;
+ const deltaX2 = x2rod - (NumCast(this.dataDoc.mass1_positionX) + this.radius);
+ const deltaY = this.getYPosFromDisplay(value) + this.radius;
let dir1T = Math.PI - Math.atan(deltaY / deltaX1);
let dir2T = Math.atan(deltaY / deltaX2);
- let tensionMag2 = (this.mass1 * Math.abs(this.gravity)) / ((-Math.cos(dir2T) / Math.cos(dir1T)) * Math.sin(dir1T) + Math.sin(dir2T));
- let tensionMag1 = (-tensionMag2 * Math.cos(dir2T)) / Math.cos(dir1T);
+ const tensionMag2 = (this.mass1 * Math.abs(this.gravity)) / ((-Math.cos(dir2T) / Math.cos(dir1T)) * Math.sin(dir1T) + Math.sin(dir2T));
+ const tensionMag1 = (-tensionMag2 * Math.cos(dir2T)) / Math.cos(dir1T);
dir1T = (dir1T * 180) / Math.PI;
dir2T = (dir2T * 180) / Math.PI;
const tensionForce1: IForce = {
@@ -1741,7 +1750,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
this.dataDoc.mass1_forcesUpdated = JSON.stringify([tensionForce1, tensionForce2, gravity]);
}
}}
- small={true}
+ small
mode="Freeform"
/>
</td>
@@ -1758,10 +1767,10 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
>
<Box>Velocity</Box>
</td>
- {(!this.dataDoc.simulation_paused || (this.simulationType != 'One Weight' && this.simulationType != 'Circular Motion')) && (
+ {(!this.dataDoc.simulation_paused || (this.simulationType !== 'One Weight' && this.simulationType !== 'Circular Motion')) && (
<td style={{ cursor: 'default' }}>{`${NumCast(this.dataDoc.mass1_velocityX)} m/s`}</td>
)}{' '}
- {this.dataDoc.simulation_paused && (this.simulationType == 'One Weight' || this.simulationType == 'Circular Motion') && (
+ {this.dataDoc.simulation_paused && (this.simulationType === 'One Weight' || this.simulationType === 'Circular Motion') && (
<td
style={{
cursor: 'default',
@@ -1771,24 +1780,20 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
dataDoc={this.dataDoc}
prop="mass1_velocityX"
step={1}
- unit={'m/s'}
+ unit="m/s"
upperBound={50}
value={NumCast(this.dataDoc.mass1_velocityX)}
effect={action(value => {
this.dataDoc.mass1_velocityXstart = value;
this._simReset++;
})}
- small={true}
+ small
mode="Freeform"
/>
</td>
)}{' '}
- {(!this.dataDoc.simulation_paused || this.simulationType != 'One Weight') && (
- <td style={{ cursor: 'default' }}>
- <>{this.dataDoc.mass1_velocityY} m/s</>
- </td>
- )}{' '}
- {this.dataDoc.simulation_paused && this.simulationType == 'One Weight' && (
+ {(!this.dataDoc.simulation_paused || this.simulationType !== 'One Weight') && <td style={{ cursor: 'default' }}>{this.dataDoc.mass1_velocityY + ''} m/s</td>}{' '}
+ {this.dataDoc.simulation_paused && this.simulationType === 'One Weight' && (
<td
style={{
cursor: 'default',
@@ -1804,7 +1809,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
effect={value => {
this.dataDoc.mass1_velocityYstart = -value;
}}
- small={true}
+ small
mode="Freeform"
/>
</td>
@@ -1822,14 +1827,10 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
<Box>Acceleration</Box>
</td>
<td style={{ cursor: 'default' }}>
- <>
- {this.dataDoc.mass1_accelerationX} m/s<sup>2</sup>
- </>
+ {this.dataDoc.mass1_accelerationX + ''} m/s<sup>2</sup>
</td>
<td style={{ cursor: 'default' }}>
- <>
- {this.dataDoc.mass1_accelerationY} m/s<sup>2</sup>
- </>
+ {this.dataDoc.mass1_accelerationY + ''} m/s<sup>2</sup>
</td>
</tr>
<tr>
@@ -1842,7 +1843,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</tbody>
</table>
)}
- {this.simulationMode == 'Freeform' && this.simulationType == 'Pulley' && (
+ {this.simulationMode === 'Freeform' && this.simulationType === 'Pulley' && (
<table>
<tbody>
<tr>
@@ -1869,14 +1870,10 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
<Box>Acceleration</Box>
</td>
<td style={{ cursor: 'default' }}>
- <>
- {this.dataDoc.mass2_accelerationX} m/s<sup>2</sup>
- </>
+ {this.dataDoc.mass2_accelerationX + ''} m/s<sup>2</sup>
</td>
<td style={{ cursor: 'default' }}>
- <>
- {this.dataDoc.mass2_accelerationY} m/s<sup>2</sup>
- </>
+ {this.dataDoc.mass2_accelerationY + ''} m/s<sup>2</sup>
</td>
</tr>
<tr>
@@ -1890,7 +1887,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</table>
)}
</div>
- {this.simulationType != 'Pendulum' && this.simulationType != 'Spring' && (
+ {this.simulationType !== 'Pendulum' && this.simulationType !== 'Spring' && (
<div>
<p>Kinematic Equations</p>
<ul>
@@ -1907,7 +1904,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</ul>
</div>
)}
- {this.simulationType == 'Spring' && (
+ {this.simulationType === 'Spring' && (
<div>
<p>Harmonic Motion Equations: Spring</p>
<ul>
@@ -1936,7 +1933,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
</ul>
</div>
)}
- {this.simulationType == 'Pendulum' && (
+ {this.simulationType === 'Pendulum' && (
<div>
<p>Harmonic Motion Equations: Pendulum</p>
<ul>
@@ -1959,11 +1956,11 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
<svg width={100 + 'px'} height={100 + 'px'}>
<defs>
<marker id="miniArrow" markerWidth="20" markerHeight="20" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">
- <path d="M0,0 L0,6 L9,3 z" fill={'#000000'} />
+ <path d="M0,0 L0,6 L9,3 z" fill="#000000" />
</marker>
</defs>
- <line x1={20} y1={70} x2={70} y2={70} stroke={'#000000'} strokeWidth="2" markerEnd="url(#miniArrow)" />
- <line x1={20} y1={70} x2={20} y2={20} stroke={'#000000'} strokeWidth="2" markerEnd="url(#miniArrow)" />
+ <line x1={20} y1={70} x2={70} y2={70} stroke="#000000" strokeWidth="2" markerEnd="url(#miniArrow)" />
+ <line x1={20} y1={70} x2={20} y2={20} stroke="#000000" strokeWidth="2" markerEnd="url(#miniArrow)" />
</svg>
<p
style={{
@@ -1971,7 +1968,7 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
top: this.yMax - 120 + 40 + 'px',
left: this.xMin + 90 - 80 + 'px',
}}>
- {this.simulationType == 'Circular Motion' ? 'Z' : 'Y'}
+ {this.simulationType === 'Circular Motion' ? 'Z' : 'Y'}
</p>
<p
style={{
@@ -1986,3 +1983,9 @@ export class PhysicsSimulationBox extends ViewBoxAnnotatableComponent<FieldViewP
);
}
}
+
+Docs.Prototypes.TemplateMap.set(DocumentType.SIMULATION, {
+ data: '',
+ layout: { view: PhysicsSimulationBox, dataField: 'data' },
+ options: { acl: '', _width: 1000, _height: 800, mass1: '', mass2: '', layout_nativeDimEditable: true, position: '', acceleration: '', pendulum: '', spring: '', wedge: '', simulation: '', review: '', systemIcon: 'BsShareFill' },
+});