@teachinglab/omd 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -251
- package/README.old.md +137 -137
- package/canvas/core/canvasConfig.js +202 -202
- package/canvas/drawing/segment.js +167 -167
- package/canvas/drawing/stroke.js +385 -385
- package/canvas/events/eventManager.js +444 -444
- package/canvas/events/pointerEventHandler.js +262 -262
- package/canvas/index.js +48 -48
- package/canvas/tools/PointerTool.js +71 -71
- package/canvas/tools/tool.js +222 -222
- package/canvas/utils/boundingBox.js +377 -377
- package/canvas/utils/mathUtils.js +258 -258
- package/docs/api/configuration-options.md +198 -198
- package/docs/api/eventManager.md +82 -82
- package/docs/api/focusFrameManager.md +144 -144
- package/docs/api/index.md +105 -105
- package/docs/api/main.md +62 -62
- package/docs/api/omdBinaryExpressionNode.md +86 -86
- package/docs/api/omdCanvas.md +83 -83
- package/docs/api/omdConfigManager.md +112 -112
- package/docs/api/omdConstantNode.md +52 -52
- package/docs/api/omdDisplay.md +87 -87
- package/docs/api/omdEquationNode.md +174 -174
- package/docs/api/omdEquationSequenceNode.md +258 -258
- package/docs/api/omdEquationStack.md +192 -192
- package/docs/api/omdFunctionNode.md +82 -82
- package/docs/api/omdGroupNode.md +78 -78
- package/docs/api/omdHelpers.md +87 -87
- package/docs/api/omdLeafNode.md +85 -85
- package/docs/api/omdNode.md +201 -201
- package/docs/api/omdOperationDisplayNode.md +117 -117
- package/docs/api/omdOperatorNode.md +91 -91
- package/docs/api/omdParenthesisNode.md +133 -133
- package/docs/api/omdPopup.md +191 -191
- package/docs/api/omdPowerNode.md +131 -131
- package/docs/api/omdRationalNode.md +144 -144
- package/docs/api/omdSequenceNode.md +128 -128
- package/docs/api/omdSimplification.md +78 -78
- package/docs/api/omdSqrtNode.md +144 -144
- package/docs/api/omdStepVisualizer.md +146 -146
- package/docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/docs/api/omdStepVisualizerLayout.md +70 -70
- package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/docs/api/omdToolbar.md +130 -130
- package/docs/api/omdTranscriptionService.md +95 -95
- package/docs/api/omdTreeDiff.md +169 -169
- package/docs/api/omdUnaryExpressionNode.md +137 -137
- package/docs/api/omdUtilities.md +82 -82
- package/docs/api/omdVariableNode.md +123 -123
- package/docs/api/selectTool.md +74 -74
- package/docs/api/simplificationEngine.md +97 -97
- package/docs/api/simplificationRules.md +76 -76
- package/docs/api/simplificationUtils.md +64 -64
- package/docs/api/transcribe.md +43 -43
- package/docs/api-reference.md +85 -85
- package/docs/index.html +453 -453
- package/docs/index.md +38 -38
- package/docs/omd-objects.md +258 -258
- package/index.js +79 -79
- package/jsvg/index.js +3 -0
- package/jsvg/jsvg.js +898 -898
- package/jsvg/jsvgComponents.js +357 -358
- package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
- package/npm-docs/README.md +251 -251
- package/npm-docs/api/api-reference.md +85 -85
- package/npm-docs/api/configuration-options.md +198 -198
- package/npm-docs/api/eventManager.md +82 -82
- package/npm-docs/api/expression-nodes.md +561 -561
- package/npm-docs/api/focusFrameManager.md +144 -144
- package/npm-docs/api/index.md +105 -105
- package/npm-docs/api/main.md +62 -62
- package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
- package/npm-docs/api/omdCanvas.md +83 -83
- package/npm-docs/api/omdConfigManager.md +112 -112
- package/npm-docs/api/omdConstantNode.md +52 -52
- package/npm-docs/api/omdDisplay.md +87 -87
- package/npm-docs/api/omdEquationNode.md +174 -174
- package/npm-docs/api/omdEquationSequenceNode.md +258 -258
- package/npm-docs/api/omdEquationStack.md +192 -192
- package/npm-docs/api/omdFunctionNode.md +82 -82
- package/npm-docs/api/omdGroupNode.md +78 -78
- package/npm-docs/api/omdHelpers.md +87 -87
- package/npm-docs/api/omdLeafNode.md +85 -85
- package/npm-docs/api/omdNode.md +201 -201
- package/npm-docs/api/omdOperationDisplayNode.md +117 -117
- package/npm-docs/api/omdOperatorNode.md +91 -91
- package/npm-docs/api/omdParenthesisNode.md +133 -133
- package/npm-docs/api/omdPopup.md +191 -191
- package/npm-docs/api/omdPowerNode.md +131 -131
- package/npm-docs/api/omdRationalNode.md +144 -144
- package/npm-docs/api/omdSequenceNode.md +128 -128
- package/npm-docs/api/omdSimplification.md +78 -78
- package/npm-docs/api/omdSqrtNode.md +144 -144
- package/npm-docs/api/omdStepVisualizer.md +146 -146
- package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
- package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/npm-docs/api/omdToolbar.md +130 -130
- package/npm-docs/api/omdTranscriptionService.md +95 -95
- package/npm-docs/api/omdTreeDiff.md +169 -169
- package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
- package/npm-docs/api/omdUtilities.md +82 -82
- package/npm-docs/api/omdVariableNode.md +123 -123
- package/npm-docs/api/selectTool.md +74 -74
- package/npm-docs/api/simplificationEngine.md +97 -97
- package/npm-docs/api/simplificationRules.md +76 -76
- package/npm-docs/api/simplificationUtils.md +64 -64
- package/npm-docs/api/transcribe.md +43 -43
- package/npm-docs/guides/equations.md +854 -854
- package/npm-docs/guides/factory-functions.md +354 -354
- package/npm-docs/guides/getting-started.md +318 -318
- package/npm-docs/guides/quick-examples.md +525 -525
- package/npm-docs/guides/visualizations.md +682 -682
- package/npm-docs/index.html +12 -0
- package/npm-docs/json-schemas.md +826 -826
- package/omd/config/omdConfigManager.js +279 -267
- package/omd/core/index.js +158 -158
- package/omd/core/omdEquationStack.js +546 -546
- package/omd/core/omdUtilities.js +113 -113
- package/omd/display/omdDisplay.js +969 -962
- package/omd/display/omdToolbar.js +501 -501
- package/omd/nodes/omdBinaryExpressionNode.js +459 -459
- package/omd/nodes/omdConstantNode.js +141 -141
- package/omd/nodes/omdEquationNode.js +1327 -1327
- package/omd/nodes/omdFunctionNode.js +351 -351
- package/omd/nodes/omdGroupNode.js +67 -67
- package/omd/nodes/omdLeafNode.js +76 -76
- package/omd/nodes/omdNode.js +556 -556
- package/omd/nodes/omdOperationDisplayNode.js +321 -321
- package/omd/nodes/omdOperatorNode.js +108 -108
- package/omd/nodes/omdParenthesisNode.js +292 -292
- package/omd/nodes/omdPowerNode.js +235 -235
- package/omd/nodes/omdRationalNode.js +295 -295
- package/omd/nodes/omdSqrtNode.js +307 -307
- package/omd/nodes/omdUnaryExpressionNode.js +227 -227
- package/omd/nodes/omdVariableNode.js +122 -122
- package/omd/simplification/omdSimplification.js +140 -140
- package/omd/simplification/omdSimplificationEngine.js +887 -887
- package/omd/simplification/package.json +5 -5
- package/omd/simplification/rules/binaryRules.js +1037 -1037
- package/omd/simplification/rules/functionRules.js +111 -111
- package/omd/simplification/rules/index.js +48 -48
- package/omd/simplification/rules/parenthesisRules.js +19 -19
- package/omd/simplification/rules/powerRules.js +143 -143
- package/omd/simplification/rules/rationalRules.js +725 -725
- package/omd/simplification/rules/sqrtRules.js +48 -48
- package/omd/simplification/rules/unaryRules.js +37 -37
- package/omd/simplification/simplificationRules.js +31 -31
- package/omd/simplification/simplificationUtils.js +1055 -1055
- package/omd/step-visualizer/omdStepVisualizer.js +947 -947
- package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
- package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
- package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
- package/omd/utils/aiNextEquationStep.js +106 -106
- package/omd/utils/omdNodeOverlay.js +638 -638
- package/omd/utils/omdPopup.js +1203 -1203
- package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
- package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
- package/omd/utils/omdTranscriptionService.js +123 -123
- package/omd/utils/omdTreeDiff.js +733 -733
- package/package.json +59 -57
- package/readme.html +184 -120
- package/src/index.js +74 -74
- package/src/json-schemas.md +576 -576
- package/src/omd-json-samples.js +147 -147
- package/src/omdApp.js +391 -391
- package/src/omdAppCanvas.js +335 -335
- package/src/omdBalanceHanger.js +199 -199
- package/src/omdColor.js +13 -13
- package/src/omdCoordinatePlane.js +541 -541
- package/src/omdExpression.js +115 -115
- package/src/omdFactory.js +150 -150
- package/src/omdFunction.js +114 -114
- package/src/omdMetaExpression.js +290 -290
- package/src/omdNaturalExpression.js +563 -563
- package/src/omdNode.js +383 -383
- package/src/omdNumber.js +52 -52
- package/src/omdNumberLine.js +114 -112
- package/src/omdNumberTile.js +118 -118
- package/src/omdOperator.js +72 -72
- package/src/omdPowerExpression.js +91 -91
- package/src/omdProblem.js +259 -259
- package/src/omdRatioChart.js +251 -251
- package/src/omdRationalExpression.js +114 -114
- package/src/omdSampleData.js +215 -215
- package/src/omdShapes.js +512 -512
- package/src/omdSpinner.js +151 -151
- package/src/omdString.js +49 -49
- package/src/omdTable.js +498 -498
- package/src/omdTapeDiagram.js +244 -244
- package/src/omdTerm.js +91 -91
- package/src/omdTileEquation.js +349 -349
- package/src/omdUtils.js +84 -84
- package/src/omdVariable.js +51 -51
|
@@ -1,561 +1,561 @@
|
|
|
1
|
-
# Expression Nodes
|
|
2
|
-
|
|
3
|
-
Expression nodes are the building blocks of mathematical expressions and equations in OMD. They form a tree structure that represents the mathematical content.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
OMD uses a node-based system where every mathematical element is represented as a node in an expression tree. This allows for powerful manipulation, simplification, and visualization of mathematical expressions.
|
|
8
|
-
|
|
9
|
-
## Core Node Classes
|
|
10
|
-
|
|
11
|
-
### omdNode
|
|
12
|
-
|
|
13
|
-
The abstract base class for all nodes in the expression tree.
|
|
14
|
-
|
|
15
|
-
**See**: [omdNode API Documentation](./omdNode.md)
|
|
16
|
-
|
|
17
|
-
### omdEquationNode
|
|
18
|
-
|
|
19
|
-
Represents a complete mathematical equation with left side, right side, and equals sign.
|
|
20
|
-
|
|
21
|
-
**Class**: `omdEquationNode extends omdNode`
|
|
22
|
-
|
|
23
|
-
#### Static Methods
|
|
24
|
-
|
|
25
|
-
**`fromString(equationString)`**
|
|
26
|
-
|
|
27
|
-
Creates an equation node from a string representation.
|
|
28
|
-
|
|
29
|
-
```javascript
|
|
30
|
-
import { omdEquationNode } from '@teachinglab/omd';
|
|
31
|
-
|
|
32
|
-
const equation = omdEquationNode.fromString('2x + 3 = 11');
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
- **Parameters**:
|
|
36
|
-
- `equationString` (string): The equation string (e.g., `"2x + 4 = 10"`)
|
|
37
|
-
- **Returns**: `omdEquationNode`
|
|
38
|
-
- **Throws**: Error if string is not a valid equation
|
|
39
|
-
|
|
40
|
-
#### Properties
|
|
41
|
-
|
|
42
|
-
- **`left`** (omdNode): The left side of the equation
|
|
43
|
-
- **`right`** (omdNode): The right side of the equation
|
|
44
|
-
- **`equalsSign`** (omdOperatorNode): The equals sign operator
|
|
45
|
-
|
|
46
|
-
#### Manipulation Methods
|
|
47
|
-
|
|
48
|
-
**`addToBothSides(value)`**
|
|
49
|
-
|
|
50
|
-
Returns a new equation with a value added to both sides.
|
|
51
|
-
|
|
52
|
-
```javascript
|
|
53
|
-
const newEq = equation.addToBothSides(5);
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
- **Parameters**:
|
|
57
|
-
- `value` (number | object): Value to add
|
|
58
|
-
- **Returns**: `omdEquationNode`
|
|
59
|
-
|
|
60
|
-
**`subtractFromBothSides(value)`**
|
|
61
|
-
|
|
62
|
-
Returns a new equation with a value subtracted from both sides.
|
|
63
|
-
|
|
64
|
-
```javascript
|
|
65
|
-
const newEq = equation.subtractFromBothSides(3);
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
- **Parameters**:
|
|
69
|
-
- `value` (number | object): Value to subtract
|
|
70
|
-
- **Returns**: `omdEquationNode`
|
|
71
|
-
|
|
72
|
-
**`multiplyBothSides(value)`**
|
|
73
|
-
|
|
74
|
-
Returns a new equation with both sides multiplied by a value.
|
|
75
|
-
|
|
76
|
-
```javascript
|
|
77
|
-
const newEq = equation.multiplyBothSides(2);
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
- **Parameters**:
|
|
81
|
-
- `value` (number | object): Value to multiply by
|
|
82
|
-
- **Returns**: `omdEquationNode`
|
|
83
|
-
|
|
84
|
-
**`divideBothSides(value)`**
|
|
85
|
-
|
|
86
|
-
Returns a new equation with both sides divided by a value.
|
|
87
|
-
|
|
88
|
-
```javascript
|
|
89
|
-
const newEq = equation.divideBothSides(2);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
- **Parameters**:
|
|
93
|
-
- `value` (number | object): Value to divide by
|
|
94
|
-
- **Returns**: `omdEquationNode`
|
|
95
|
-
|
|
96
|
-
**`applyFunction(functionName)`**
|
|
97
|
-
|
|
98
|
-
Applies a function (e.g., sqrt, log) to both sides.
|
|
99
|
-
|
|
100
|
-
```javascript
|
|
101
|
-
const newEq = equation.applyFunction('sqrt');
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
- **Parameters**:
|
|
105
|
-
- `functionName` (string): Name of function to apply
|
|
106
|
-
- **Returns**: `omdEquationNode`
|
|
107
|
-
|
|
108
|
-
**`applyOperation(value, operation, side = 'both')`**
|
|
109
|
-
|
|
110
|
-
Applies an arithmetic operation to one or both sides.
|
|
111
|
-
|
|
112
|
-
```javascript
|
|
113
|
-
const newEq = equation.applyOperation(5, 'add', 'left');
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
- **Parameters**:
|
|
117
|
-
- `value` (number | omdNode): Value to apply
|
|
118
|
-
- `operation` (string): Operation type: `'add'`, `'subtract'`, `'multiply'`, or `'divide'`
|
|
119
|
-
- `side` (string): Side to apply to: `'left'`, `'right'`, or `'both'` (default: `'both'`)
|
|
120
|
-
- **Returns**: `omdEquationNode`
|
|
121
|
-
|
|
122
|
-
**`swapSides()`**
|
|
123
|
-
|
|
124
|
-
Swaps the left and right sides of the equation.
|
|
125
|
-
|
|
126
|
-
```javascript
|
|
127
|
-
const swapped = equation.swapSides();
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
- **Returns**: `omdEquationNode`
|
|
131
|
-
|
|
132
|
-
**`simplify()`**
|
|
133
|
-
|
|
134
|
-
Simplifies both sides using the simplification engine.
|
|
135
|
-
|
|
136
|
-
```javascript
|
|
137
|
-
const result = equation.simplify();
|
|
138
|
-
// Returns: { success: boolean, newRoot: omdEquationNode, message: string }
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
- **Returns**: Object with `success`, `newRoot`, and `message` properties
|
|
142
|
-
|
|
143
|
-
#### Utility Methods
|
|
144
|
-
|
|
145
|
-
**`clone()`**
|
|
146
|
-
|
|
147
|
-
Creates a deep clone of the equation node.
|
|
148
|
-
|
|
149
|
-
```javascript
|
|
150
|
-
const copy = equation.clone();
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
- **Returns**: `omdEquationNode`
|
|
154
|
-
|
|
155
|
-
**`toString()`**
|
|
156
|
-
|
|
157
|
-
Converts the equation to its string representation.
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
const str = equation.toString();
|
|
161
|
-
// Returns: "2x + 3 = 11"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
- **Returns**: `string`
|
|
165
|
-
|
|
166
|
-
**`evaluate(variables)`**
|
|
167
|
-
|
|
168
|
-
Evaluates both sides with given variable values.
|
|
169
|
-
|
|
170
|
-
```javascript
|
|
171
|
-
const result = equation.evaluate({ x: 4 });
|
|
172
|
-
// Returns: { left: 11, right: 11 }
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
- **Parameters**:
|
|
176
|
-
- `variables` (object): Map of variable names to values
|
|
177
|
-
- **Returns**: Object with `left` and `right` evaluated values
|
|
178
|
-
|
|
179
|
-
**`getLeft()`**
|
|
180
|
-
|
|
181
|
-
Returns the node representing the left side.
|
|
182
|
-
|
|
183
|
-
```javascript
|
|
184
|
-
const leftSide = equation.getLeft();
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
- **Returns**: `omdNode`
|
|
188
|
-
|
|
189
|
-
**`getRight()`**
|
|
190
|
-
|
|
191
|
-
Returns the node representing the right side.
|
|
192
|
-
|
|
193
|
-
```javascript
|
|
194
|
-
const rightSide = equation.getRight();
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
- **Returns**: `omdNode`
|
|
198
|
-
|
|
199
|
-
#### Styling Methods
|
|
200
|
-
|
|
201
|
-
**`setBackgroundStyle(style)`**
|
|
202
|
-
|
|
203
|
-
Configures background styling for the equation node.
|
|
204
|
-
|
|
205
|
-
```javascript
|
|
206
|
-
equation.setBackgroundStyle({
|
|
207
|
-
backgroundColor: '#E3F2FD',
|
|
208
|
-
cornerRadius: 8,
|
|
209
|
-
pill: true
|
|
210
|
-
});
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
- **Parameters**:
|
|
214
|
-
- `style` (object): Style properties (`backgroundColor`, `cornerRadius`, `pill`)
|
|
215
|
-
|
|
216
|
-
**`getEqualsAnchorX()`**
|
|
217
|
-
|
|
218
|
-
Returns the X-coordinate of the equals sign center (for alignment).
|
|
219
|
-
|
|
220
|
-
```javascript
|
|
221
|
-
const anchorX = equation.getEqualsAnchorX();
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
- **Returns**: `number`
|
|
225
|
-
|
|
226
|
-
**`getBackgroundPaddingX()`**
|
|
227
|
-
|
|
228
|
-
Returns the horizontal padding applied by background style.
|
|
229
|
-
|
|
230
|
-
```javascript
|
|
231
|
-
const padding = equation.getBackgroundPaddingX();
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
- **Returns**: `number`
|
|
235
|
-
|
|
236
|
-
#### Visualization Methods
|
|
237
|
-
|
|
238
|
-
**`renderTo(visualizationType, options)`**
|
|
239
|
-
|
|
240
|
-
Renders the equation to different visualization formats.
|
|
241
|
-
|
|
242
|
-
```javascript
|
|
243
|
-
// Render to coordinate plane
|
|
244
|
-
const graphJSON = equation.renderTo('graph', {
|
|
245
|
-
xMin: -10,
|
|
246
|
-
xMax: 10,
|
|
247
|
-
yMin: -10,
|
|
248
|
-
yMax: 10
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// Render to table
|
|
252
|
-
const tableJSON = equation.renderTo('table', {
|
|
253
|
-
xMin: -5,
|
|
254
|
-
xMax: 5,
|
|
255
|
-
stepSize: 1
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
// Render to balance hanger
|
|
259
|
-
const hangerJSON = equation.renderTo('hanger');
|
|
260
|
-
|
|
261
|
-
// Render to tile equation
|
|
262
|
-
const tileJSON = equation.renderTo('tileequation');
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
- **Parameters**:
|
|
266
|
-
- `visualizationType` (string): Type of visualization: `'graph'`, `'table'`, `'hanger'`, or `'tileequation'`
|
|
267
|
-
- `options` (object): Configuration options specific to visualization type
|
|
268
|
-
- **Returns**: JSON object for the visualization
|
|
269
|
-
|
|
270
|
-
**See**: [omdEquationNode Full API Documentation](./omdEquationNode.md)
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
### Expression Component Nodes
|
|
275
|
-
|
|
276
|
-
#### omdConstantNode
|
|
277
|
-
|
|
278
|
-
Represents numeric constants.
|
|
279
|
-
|
|
280
|
-
```javascript
|
|
281
|
-
import { omdConstantNode } from '@teachinglab/omd';
|
|
282
|
-
|
|
283
|
-
const constant = new omdConstantNode(ast);
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
**See**: [omdConstantNode API Documentation](./omdConstantNode.md)
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
#### omdVariableNode
|
|
291
|
-
|
|
292
|
-
Represents algebraic variables.
|
|
293
|
-
|
|
294
|
-
```javascript
|
|
295
|
-
import { omdVariableNode } from '@teachinglab/omd';
|
|
296
|
-
|
|
297
|
-
const variable = new omdVariableNode(ast);
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
**See**: [omdVariableNode API Documentation](./omdVariableNode.md)
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
#### omdOperatorNode
|
|
305
|
-
|
|
306
|
-
Represents mathematical operators (+, -, ×, ÷, =).
|
|
307
|
-
|
|
308
|
-
```javascript
|
|
309
|
-
import { omdOperatorNode } from '@teachinglab/omd';
|
|
310
|
-
|
|
311
|
-
const operator = new omdOperatorNode(ast);
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
**See**: [omdOperatorNode API Documentation](./omdOperatorNode.md)
|
|
315
|
-
|
|
316
|
-
---
|
|
317
|
-
|
|
318
|
-
#### omdBinaryExpressionNode
|
|
319
|
-
|
|
320
|
-
Represents binary operations (addition, subtraction, multiplication, division).
|
|
321
|
-
|
|
322
|
-
```javascript
|
|
323
|
-
import { omdBinaryExpressionNode } from '@teachinglab/omd';
|
|
324
|
-
|
|
325
|
-
const binaryExpr = new omdBinaryExpressionNode(ast);
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
**See**: [omdBinaryExpressionNode API Documentation](./omdBinaryExpressionNode.md)
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
#### omdUnaryExpressionNode
|
|
333
|
-
|
|
334
|
-
Represents unary operations (negation).
|
|
335
|
-
|
|
336
|
-
```javascript
|
|
337
|
-
import { omdUnaryExpressionNode } from '@teachinglab/omd';
|
|
338
|
-
|
|
339
|
-
const unaryExpr = new omdUnaryExpressionNode(ast);
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
**See**: [omdUnaryExpressionNode API Documentation](./omdUnaryExpressionNode.md)
|
|
343
|
-
|
|
344
|
-
---
|
|
345
|
-
|
|
346
|
-
#### omdPowerNode
|
|
347
|
-
|
|
348
|
-
Represents exponentiation (x²).
|
|
349
|
-
|
|
350
|
-
```javascript
|
|
351
|
-
import { omdPowerNode } from '@teachinglab/omd';
|
|
352
|
-
|
|
353
|
-
const power = new omdPowerNode(ast);
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
**See**: [omdPowerNode API Documentation](./omdPowerNode.md)
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
#### omdRationalNode
|
|
361
|
-
|
|
362
|
-
Represents fractions and rational numbers.
|
|
363
|
-
|
|
364
|
-
```javascript
|
|
365
|
-
import { omdRationalNode } from '@teachinglab/omd';
|
|
366
|
-
|
|
367
|
-
const rational = new omdRationalNode(ast);
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
**See**: [omdRationalNode API Documentation](./omdRationalNode.md)
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
#### omdSqrtNode
|
|
375
|
-
|
|
376
|
-
Represents square root expressions.
|
|
377
|
-
|
|
378
|
-
```javascript
|
|
379
|
-
import { omdSqrtNode } from '@teachinglab/omd';
|
|
380
|
-
|
|
381
|
-
const sqrt = new omdSqrtNode(ast);
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
**See**: [omdSqrtNode API Documentation](./omdSqrtNode.md)
|
|
385
|
-
|
|
386
|
-
---
|
|
387
|
-
|
|
388
|
-
#### omdFunctionNode
|
|
389
|
-
|
|
390
|
-
Represents mathematical functions (sin, cos, log, etc.).
|
|
391
|
-
|
|
392
|
-
```javascript
|
|
393
|
-
import { omdFunctionNode } from '@teachinglab/omd';
|
|
394
|
-
|
|
395
|
-
const func = new omdFunctionNode(ast);
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
**See**: [omdFunctionNode API Documentation](./omdFunctionNode.md)
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
#### omdParenthesisNode
|
|
403
|
-
|
|
404
|
-
Represents expressions enclosed in parentheses.
|
|
405
|
-
|
|
406
|
-
```javascript
|
|
407
|
-
import { omdParenthesisNode } from '@teachinglab/omd';
|
|
408
|
-
|
|
409
|
-
const paren = new omdParenthesisNode(ast);
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
**See**: [omdParenthesisNode API Documentation](./omdParenthesisNode.md)
|
|
413
|
-
|
|
414
|
-
---
|
|
415
|
-
|
|
416
|
-
### Container Nodes
|
|
417
|
-
|
|
418
|
-
#### omdGroupNode
|
|
419
|
-
|
|
420
|
-
A container for grouping related nodes.
|
|
421
|
-
|
|
422
|
-
```javascript
|
|
423
|
-
import { omdGroupNode } from '@teachinglab/omd';
|
|
424
|
-
|
|
425
|
-
const group = new omdGroupNode(ast);
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
**See**: [omdGroupNode API Documentation](./omdGroupNode.md)
|
|
429
|
-
|
|
430
|
-
---
|
|
431
|
-
|
|
432
|
-
#### omdEquationSequenceNode
|
|
433
|
-
|
|
434
|
-
A container for displaying step-by-step equation solutions.
|
|
435
|
-
|
|
436
|
-
```javascript
|
|
437
|
-
import { omdEquationSequenceNode } from '@teachinglab/omd';
|
|
438
|
-
|
|
439
|
-
const sequence = new omdEquationSequenceNode();
|
|
440
|
-
sequence.addChild(equation1);
|
|
441
|
-
sequence.addChild(equation2);
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
**See**: [omdEquationSequenceNode API Documentation](./omdEquationSequenceNode.md)
|
|
445
|
-
|
|
446
|
-
---
|
|
447
|
-
|
|
448
|
-
## Node Tree Structure
|
|
449
|
-
|
|
450
|
-
Nodes are organized in a tree structure:
|
|
451
|
-
|
|
452
|
-
```
|
|
453
|
-
omdEquationNode
|
|
454
|
-
├── left (omdNode)
|
|
455
|
-
│ └── omdBinaryExpressionNode
|
|
456
|
-
│ ├── left (omdConstantNode: 2)
|
|
457
|
-
│ ├── operator (omdOperatorNode: +)
|
|
458
|
-
│ └── right (omdConstantNode: 3)
|
|
459
|
-
├── equalsSign (omdOperatorNode: =)
|
|
460
|
-
└── right (omdNode)
|
|
461
|
-
└── omdConstantNode: 11
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
## Working with Expression Trees
|
|
465
|
-
|
|
466
|
-
### Creating Nodes from Strings
|
|
467
|
-
|
|
468
|
-
The simplest way to create nodes is from strings:
|
|
469
|
-
|
|
470
|
-
```javascript
|
|
471
|
-
import { omdEquationNode } from '@teachinglab/omd';
|
|
472
|
-
|
|
473
|
-
const equation = omdEquationNode.fromString('2x + 3 = 11');
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
### Manipulating Nodes
|
|
477
|
-
|
|
478
|
-
Nodes can be manipulated to perform mathematical operations:
|
|
479
|
-
|
|
480
|
-
```javascript
|
|
481
|
-
// Start with: 2x + 3 = 11
|
|
482
|
-
const step1 = equation.subtractFromBothSides(3);
|
|
483
|
-
// Result: 2x = 8
|
|
484
|
-
|
|
485
|
-
const step2 = step1.divideBothSides(2);
|
|
486
|
-
// Result: x = 4
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
### Traversing the Tree
|
|
490
|
-
|
|
491
|
-
Nodes can be traversed to analyze structure:
|
|
492
|
-
|
|
493
|
-
```javascript
|
|
494
|
-
const leftSide = equation.getLeft();
|
|
495
|
-
const rightSide = equation.getRight();
|
|
496
|
-
|
|
497
|
-
console.log(equation.toString()); // "2x + 3 = 11"
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
### Evaluating Expressions
|
|
501
|
-
|
|
502
|
-
Nodes can be evaluated with variable values:
|
|
503
|
-
|
|
504
|
-
```javascript
|
|
505
|
-
const result = equation.evaluate({ x: 4 });
|
|
506
|
-
console.log(result); // { left: 11, right: 11 }
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
## Common Patterns
|
|
510
|
-
|
|
511
|
-
### Creating a Step-by-Step Solution
|
|
512
|
-
|
|
513
|
-
```javascript
|
|
514
|
-
import { omdEquationNode, omdEquationStack } from '@teachinglab/omd';
|
|
515
|
-
|
|
516
|
-
const original = omdEquationNode.fromString('2x + 3 = 11');
|
|
517
|
-
const step1 = original.subtractFromBothSides(3);
|
|
518
|
-
const step2 = step1.divideBothSides(2);
|
|
519
|
-
|
|
520
|
-
const steps = [original, step1, step2];
|
|
521
|
-
const stack = new omdEquationStack(steps);
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
### Simplifying Expressions
|
|
525
|
-
|
|
526
|
-
```javascript
|
|
527
|
-
const equation = omdEquationNode.fromString('2x + 3x = 10');
|
|
528
|
-
const result = equation.simplify();
|
|
529
|
-
|
|
530
|
-
if (result.success) {
|
|
531
|
-
console.log(result.newRoot.toString()); // "5x = 10"
|
|
532
|
-
}
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
### Rendering to Visualizations
|
|
536
|
-
|
|
537
|
-
```javascript
|
|
538
|
-
const equation = omdEquationNode.fromString('y = x^2 - 4');
|
|
539
|
-
|
|
540
|
-
// Render to graph
|
|
541
|
-
const graphData = equation.renderTo('graph', {
|
|
542
|
-
xMin: -10,
|
|
543
|
-
xMax: 10,
|
|
544
|
-
yMin: -10,
|
|
545
|
-
yMax: 10
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
// Render to table
|
|
549
|
-
const tableData = equation.renderTo('table', {
|
|
550
|
-
xMin: -5,
|
|
551
|
-
xMax: 5,
|
|
552
|
-
stepSize: 1
|
|
553
|
-
});
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
## See Also
|
|
557
|
-
|
|
558
|
-
- [omdNode Base Class](./omdNode.md)
|
|
559
|
-
- [omdEquationNode Full Documentation](./omdEquationNode.md)
|
|
560
|
-
- [Equations Guide](../guides/equations.md)
|
|
561
|
-
- [JSON Schemas](../json-schemas.md)
|
|
1
|
+
# Expression Nodes
|
|
2
|
+
|
|
3
|
+
Expression nodes are the building blocks of mathematical expressions and equations in OMD. They form a tree structure that represents the mathematical content.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
OMD uses a node-based system where every mathematical element is represented as a node in an expression tree. This allows for powerful manipulation, simplification, and visualization of mathematical expressions.
|
|
8
|
+
|
|
9
|
+
## Core Node Classes
|
|
10
|
+
|
|
11
|
+
### omdNode
|
|
12
|
+
|
|
13
|
+
The abstract base class for all nodes in the expression tree.
|
|
14
|
+
|
|
15
|
+
**See**: [omdNode API Documentation](./omdNode.md)
|
|
16
|
+
|
|
17
|
+
### omdEquationNode
|
|
18
|
+
|
|
19
|
+
Represents a complete mathematical equation with left side, right side, and equals sign.
|
|
20
|
+
|
|
21
|
+
**Class**: `omdEquationNode extends omdNode`
|
|
22
|
+
|
|
23
|
+
#### Static Methods
|
|
24
|
+
|
|
25
|
+
**`fromString(equationString)`**
|
|
26
|
+
|
|
27
|
+
Creates an equation node from a string representation.
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
import { omdEquationNode } from '@teachinglab/omd';
|
|
31
|
+
|
|
32
|
+
const equation = omdEquationNode.fromString('2x + 3 = 11');
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- **Parameters**:
|
|
36
|
+
- `equationString` (string): The equation string (e.g., `"2x + 4 = 10"`)
|
|
37
|
+
- **Returns**: `omdEquationNode`
|
|
38
|
+
- **Throws**: Error if string is not a valid equation
|
|
39
|
+
|
|
40
|
+
#### Properties
|
|
41
|
+
|
|
42
|
+
- **`left`** (omdNode): The left side of the equation
|
|
43
|
+
- **`right`** (omdNode): The right side of the equation
|
|
44
|
+
- **`equalsSign`** (omdOperatorNode): The equals sign operator
|
|
45
|
+
|
|
46
|
+
#### Manipulation Methods
|
|
47
|
+
|
|
48
|
+
**`addToBothSides(value)`**
|
|
49
|
+
|
|
50
|
+
Returns a new equation with a value added to both sides.
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
const newEq = equation.addToBothSides(5);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- **Parameters**:
|
|
57
|
+
- `value` (number | object): Value to add
|
|
58
|
+
- **Returns**: `omdEquationNode`
|
|
59
|
+
|
|
60
|
+
**`subtractFromBothSides(value)`**
|
|
61
|
+
|
|
62
|
+
Returns a new equation with a value subtracted from both sides.
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
const newEq = equation.subtractFromBothSides(3);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- **Parameters**:
|
|
69
|
+
- `value` (number | object): Value to subtract
|
|
70
|
+
- **Returns**: `omdEquationNode`
|
|
71
|
+
|
|
72
|
+
**`multiplyBothSides(value)`**
|
|
73
|
+
|
|
74
|
+
Returns a new equation with both sides multiplied by a value.
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
const newEq = equation.multiplyBothSides(2);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- **Parameters**:
|
|
81
|
+
- `value` (number | object): Value to multiply by
|
|
82
|
+
- **Returns**: `omdEquationNode`
|
|
83
|
+
|
|
84
|
+
**`divideBothSides(value)`**
|
|
85
|
+
|
|
86
|
+
Returns a new equation with both sides divided by a value.
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
const newEq = equation.divideBothSides(2);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- **Parameters**:
|
|
93
|
+
- `value` (number | object): Value to divide by
|
|
94
|
+
- **Returns**: `omdEquationNode`
|
|
95
|
+
|
|
96
|
+
**`applyFunction(functionName)`**
|
|
97
|
+
|
|
98
|
+
Applies a function (e.g., sqrt, log) to both sides.
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
const newEq = equation.applyFunction('sqrt');
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- **Parameters**:
|
|
105
|
+
- `functionName` (string): Name of function to apply
|
|
106
|
+
- **Returns**: `omdEquationNode`
|
|
107
|
+
|
|
108
|
+
**`applyOperation(value, operation, side = 'both')`**
|
|
109
|
+
|
|
110
|
+
Applies an arithmetic operation to one or both sides.
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
const newEq = equation.applyOperation(5, 'add', 'left');
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- **Parameters**:
|
|
117
|
+
- `value` (number | omdNode): Value to apply
|
|
118
|
+
- `operation` (string): Operation type: `'add'`, `'subtract'`, `'multiply'`, or `'divide'`
|
|
119
|
+
- `side` (string): Side to apply to: `'left'`, `'right'`, or `'both'` (default: `'both'`)
|
|
120
|
+
- **Returns**: `omdEquationNode`
|
|
121
|
+
|
|
122
|
+
**`swapSides()`**
|
|
123
|
+
|
|
124
|
+
Swaps the left and right sides of the equation.
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
const swapped = equation.swapSides();
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- **Returns**: `omdEquationNode`
|
|
131
|
+
|
|
132
|
+
**`simplify()`**
|
|
133
|
+
|
|
134
|
+
Simplifies both sides using the simplification engine.
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
const result = equation.simplify();
|
|
138
|
+
// Returns: { success: boolean, newRoot: omdEquationNode, message: string }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- **Returns**: Object with `success`, `newRoot`, and `message` properties
|
|
142
|
+
|
|
143
|
+
#### Utility Methods
|
|
144
|
+
|
|
145
|
+
**`clone()`**
|
|
146
|
+
|
|
147
|
+
Creates a deep clone of the equation node.
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
const copy = equation.clone();
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
- **Returns**: `omdEquationNode`
|
|
154
|
+
|
|
155
|
+
**`toString()`**
|
|
156
|
+
|
|
157
|
+
Converts the equation to its string representation.
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
const str = equation.toString();
|
|
161
|
+
// Returns: "2x + 3 = 11"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
- **Returns**: `string`
|
|
165
|
+
|
|
166
|
+
**`evaluate(variables)`**
|
|
167
|
+
|
|
168
|
+
Evaluates both sides with given variable values.
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
const result = equation.evaluate({ x: 4 });
|
|
172
|
+
// Returns: { left: 11, right: 11 }
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- **Parameters**:
|
|
176
|
+
- `variables` (object): Map of variable names to values
|
|
177
|
+
- **Returns**: Object with `left` and `right` evaluated values
|
|
178
|
+
|
|
179
|
+
**`getLeft()`**
|
|
180
|
+
|
|
181
|
+
Returns the node representing the left side.
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
const leftSide = equation.getLeft();
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- **Returns**: `omdNode`
|
|
188
|
+
|
|
189
|
+
**`getRight()`**
|
|
190
|
+
|
|
191
|
+
Returns the node representing the right side.
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
const rightSide = equation.getRight();
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
- **Returns**: `omdNode`
|
|
198
|
+
|
|
199
|
+
#### Styling Methods
|
|
200
|
+
|
|
201
|
+
**`setBackgroundStyle(style)`**
|
|
202
|
+
|
|
203
|
+
Configures background styling for the equation node.
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
equation.setBackgroundStyle({
|
|
207
|
+
backgroundColor: '#E3F2FD',
|
|
208
|
+
cornerRadius: 8,
|
|
209
|
+
pill: true
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
- **Parameters**:
|
|
214
|
+
- `style` (object): Style properties (`backgroundColor`, `cornerRadius`, `pill`)
|
|
215
|
+
|
|
216
|
+
**`getEqualsAnchorX()`**
|
|
217
|
+
|
|
218
|
+
Returns the X-coordinate of the equals sign center (for alignment).
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
const anchorX = equation.getEqualsAnchorX();
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- **Returns**: `number`
|
|
225
|
+
|
|
226
|
+
**`getBackgroundPaddingX()`**
|
|
227
|
+
|
|
228
|
+
Returns the horizontal padding applied by background style.
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
231
|
+
const padding = equation.getBackgroundPaddingX();
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
- **Returns**: `number`
|
|
235
|
+
|
|
236
|
+
#### Visualization Methods
|
|
237
|
+
|
|
238
|
+
**`renderTo(visualizationType, options)`**
|
|
239
|
+
|
|
240
|
+
Renders the equation to different visualization formats.
|
|
241
|
+
|
|
242
|
+
```javascript
|
|
243
|
+
// Render to coordinate plane
|
|
244
|
+
const graphJSON = equation.renderTo('graph', {
|
|
245
|
+
xMin: -10,
|
|
246
|
+
xMax: 10,
|
|
247
|
+
yMin: -10,
|
|
248
|
+
yMax: 10
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// Render to table
|
|
252
|
+
const tableJSON = equation.renderTo('table', {
|
|
253
|
+
xMin: -5,
|
|
254
|
+
xMax: 5,
|
|
255
|
+
stepSize: 1
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// Render to balance hanger
|
|
259
|
+
const hangerJSON = equation.renderTo('hanger');
|
|
260
|
+
|
|
261
|
+
// Render to tile equation
|
|
262
|
+
const tileJSON = equation.renderTo('tileequation');
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
- **Parameters**:
|
|
266
|
+
- `visualizationType` (string): Type of visualization: `'graph'`, `'table'`, `'hanger'`, or `'tileequation'`
|
|
267
|
+
- `options` (object): Configuration options specific to visualization type
|
|
268
|
+
- **Returns**: JSON object for the visualization
|
|
269
|
+
|
|
270
|
+
**See**: [omdEquationNode Full API Documentation](./omdEquationNode.md)
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
### Expression Component Nodes
|
|
275
|
+
|
|
276
|
+
#### omdConstantNode
|
|
277
|
+
|
|
278
|
+
Represents numeric constants.
|
|
279
|
+
|
|
280
|
+
```javascript
|
|
281
|
+
import { omdConstantNode } from '@teachinglab/omd';
|
|
282
|
+
|
|
283
|
+
const constant = new omdConstantNode(ast);
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**See**: [omdConstantNode API Documentation](./omdConstantNode.md)
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
#### omdVariableNode
|
|
291
|
+
|
|
292
|
+
Represents algebraic variables.
|
|
293
|
+
|
|
294
|
+
```javascript
|
|
295
|
+
import { omdVariableNode } from '@teachinglab/omd';
|
|
296
|
+
|
|
297
|
+
const variable = new omdVariableNode(ast);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**See**: [omdVariableNode API Documentation](./omdVariableNode.md)
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
#### omdOperatorNode
|
|
305
|
+
|
|
306
|
+
Represents mathematical operators (+, -, ×, ÷, =).
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
import { omdOperatorNode } from '@teachinglab/omd';
|
|
310
|
+
|
|
311
|
+
const operator = new omdOperatorNode(ast);
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**See**: [omdOperatorNode API Documentation](./omdOperatorNode.md)
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
#### omdBinaryExpressionNode
|
|
319
|
+
|
|
320
|
+
Represents binary operations (addition, subtraction, multiplication, division).
|
|
321
|
+
|
|
322
|
+
```javascript
|
|
323
|
+
import { omdBinaryExpressionNode } from '@teachinglab/omd';
|
|
324
|
+
|
|
325
|
+
const binaryExpr = new omdBinaryExpressionNode(ast);
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**See**: [omdBinaryExpressionNode API Documentation](./omdBinaryExpressionNode.md)
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
#### omdUnaryExpressionNode
|
|
333
|
+
|
|
334
|
+
Represents unary operations (negation).
|
|
335
|
+
|
|
336
|
+
```javascript
|
|
337
|
+
import { omdUnaryExpressionNode } from '@teachinglab/omd';
|
|
338
|
+
|
|
339
|
+
const unaryExpr = new omdUnaryExpressionNode(ast);
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**See**: [omdUnaryExpressionNode API Documentation](./omdUnaryExpressionNode.md)
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
#### omdPowerNode
|
|
347
|
+
|
|
348
|
+
Represents exponentiation (x²).
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
import { omdPowerNode } from '@teachinglab/omd';
|
|
352
|
+
|
|
353
|
+
const power = new omdPowerNode(ast);
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**See**: [omdPowerNode API Documentation](./omdPowerNode.md)
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
#### omdRationalNode
|
|
361
|
+
|
|
362
|
+
Represents fractions and rational numbers.
|
|
363
|
+
|
|
364
|
+
```javascript
|
|
365
|
+
import { omdRationalNode } from '@teachinglab/omd';
|
|
366
|
+
|
|
367
|
+
const rational = new omdRationalNode(ast);
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**See**: [omdRationalNode API Documentation](./omdRationalNode.md)
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
#### omdSqrtNode
|
|
375
|
+
|
|
376
|
+
Represents square root expressions.
|
|
377
|
+
|
|
378
|
+
```javascript
|
|
379
|
+
import { omdSqrtNode } from '@teachinglab/omd';
|
|
380
|
+
|
|
381
|
+
const sqrt = new omdSqrtNode(ast);
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**See**: [omdSqrtNode API Documentation](./omdSqrtNode.md)
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
#### omdFunctionNode
|
|
389
|
+
|
|
390
|
+
Represents mathematical functions (sin, cos, log, etc.).
|
|
391
|
+
|
|
392
|
+
```javascript
|
|
393
|
+
import { omdFunctionNode } from '@teachinglab/omd';
|
|
394
|
+
|
|
395
|
+
const func = new omdFunctionNode(ast);
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**See**: [omdFunctionNode API Documentation](./omdFunctionNode.md)
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
#### omdParenthesisNode
|
|
403
|
+
|
|
404
|
+
Represents expressions enclosed in parentheses.
|
|
405
|
+
|
|
406
|
+
```javascript
|
|
407
|
+
import { omdParenthesisNode } from '@teachinglab/omd';
|
|
408
|
+
|
|
409
|
+
const paren = new omdParenthesisNode(ast);
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
**See**: [omdParenthesisNode API Documentation](./omdParenthesisNode.md)
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
### Container Nodes
|
|
417
|
+
|
|
418
|
+
#### omdGroupNode
|
|
419
|
+
|
|
420
|
+
A container for grouping related nodes.
|
|
421
|
+
|
|
422
|
+
```javascript
|
|
423
|
+
import { omdGroupNode } from '@teachinglab/omd';
|
|
424
|
+
|
|
425
|
+
const group = new omdGroupNode(ast);
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**See**: [omdGroupNode API Documentation](./omdGroupNode.md)
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
#### omdEquationSequenceNode
|
|
433
|
+
|
|
434
|
+
A container for displaying step-by-step equation solutions.
|
|
435
|
+
|
|
436
|
+
```javascript
|
|
437
|
+
import { omdEquationSequenceNode } from '@teachinglab/omd';
|
|
438
|
+
|
|
439
|
+
const sequence = new omdEquationSequenceNode();
|
|
440
|
+
sequence.addChild(equation1);
|
|
441
|
+
sequence.addChild(equation2);
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
**See**: [omdEquationSequenceNode API Documentation](./omdEquationSequenceNode.md)
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## Node Tree Structure
|
|
449
|
+
|
|
450
|
+
Nodes are organized in a tree structure:
|
|
451
|
+
|
|
452
|
+
```
|
|
453
|
+
omdEquationNode
|
|
454
|
+
├── left (omdNode)
|
|
455
|
+
│ └── omdBinaryExpressionNode
|
|
456
|
+
│ ├── left (omdConstantNode: 2)
|
|
457
|
+
│ ├── operator (omdOperatorNode: +)
|
|
458
|
+
│ └── right (omdConstantNode: 3)
|
|
459
|
+
├── equalsSign (omdOperatorNode: =)
|
|
460
|
+
└── right (omdNode)
|
|
461
|
+
└── omdConstantNode: 11
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
## Working with Expression Trees
|
|
465
|
+
|
|
466
|
+
### Creating Nodes from Strings
|
|
467
|
+
|
|
468
|
+
The simplest way to create nodes is from strings:
|
|
469
|
+
|
|
470
|
+
```javascript
|
|
471
|
+
import { omdEquationNode } from '@teachinglab/omd';
|
|
472
|
+
|
|
473
|
+
const equation = omdEquationNode.fromString('2x + 3 = 11');
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Manipulating Nodes
|
|
477
|
+
|
|
478
|
+
Nodes can be manipulated to perform mathematical operations:
|
|
479
|
+
|
|
480
|
+
```javascript
|
|
481
|
+
// Start with: 2x + 3 = 11
|
|
482
|
+
const step1 = equation.subtractFromBothSides(3);
|
|
483
|
+
// Result: 2x = 8
|
|
484
|
+
|
|
485
|
+
const step2 = step1.divideBothSides(2);
|
|
486
|
+
// Result: x = 4
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Traversing the Tree
|
|
490
|
+
|
|
491
|
+
Nodes can be traversed to analyze structure:
|
|
492
|
+
|
|
493
|
+
```javascript
|
|
494
|
+
const leftSide = equation.getLeft();
|
|
495
|
+
const rightSide = equation.getRight();
|
|
496
|
+
|
|
497
|
+
console.log(equation.toString()); // "2x + 3 = 11"
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Evaluating Expressions
|
|
501
|
+
|
|
502
|
+
Nodes can be evaluated with variable values:
|
|
503
|
+
|
|
504
|
+
```javascript
|
|
505
|
+
const result = equation.evaluate({ x: 4 });
|
|
506
|
+
console.log(result); // { left: 11, right: 11 }
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
## Common Patterns
|
|
510
|
+
|
|
511
|
+
### Creating a Step-by-Step Solution
|
|
512
|
+
|
|
513
|
+
```javascript
|
|
514
|
+
import { omdEquationNode, omdEquationStack } from '@teachinglab/omd';
|
|
515
|
+
|
|
516
|
+
const original = omdEquationNode.fromString('2x + 3 = 11');
|
|
517
|
+
const step1 = original.subtractFromBothSides(3);
|
|
518
|
+
const step2 = step1.divideBothSides(2);
|
|
519
|
+
|
|
520
|
+
const steps = [original, step1, step2];
|
|
521
|
+
const stack = new omdEquationStack(steps);
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
### Simplifying Expressions
|
|
525
|
+
|
|
526
|
+
```javascript
|
|
527
|
+
const equation = omdEquationNode.fromString('2x + 3x = 10');
|
|
528
|
+
const result = equation.simplify();
|
|
529
|
+
|
|
530
|
+
if (result.success) {
|
|
531
|
+
console.log(result.newRoot.toString()); // "5x = 10"
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### Rendering to Visualizations
|
|
536
|
+
|
|
537
|
+
```javascript
|
|
538
|
+
const equation = omdEquationNode.fromString('y = x^2 - 4');
|
|
539
|
+
|
|
540
|
+
// Render to graph
|
|
541
|
+
const graphData = equation.renderTo('graph', {
|
|
542
|
+
xMin: -10,
|
|
543
|
+
xMax: 10,
|
|
544
|
+
yMin: -10,
|
|
545
|
+
yMax: 10
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
// Render to table
|
|
549
|
+
const tableData = equation.renderTo('table', {
|
|
550
|
+
xMin: -5,
|
|
551
|
+
xMax: 5,
|
|
552
|
+
stepSize: 1
|
|
553
|
+
});
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## See Also
|
|
557
|
+
|
|
558
|
+
- [omdNode Base Class](./omdNode.md)
|
|
559
|
+
- [omdEquationNode Full Documentation](./omdEquationNode.md)
|
|
560
|
+
- [Equations Guide](../guides/equations.md)
|
|
561
|
+
- [JSON Schemas](../json-schemas.md)
|