@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,682 +1,682 @@
|
|
|
1
|
-
# Visualizations Guide
|
|
2
|
-
|
|
3
|
-
OMD provides a comprehensive set of visualization components for teaching and learning mathematics. This guide covers all visualization components organized by category.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
1. [Number & Ratio Visualizations](#number--ratio-visualizations)
|
|
8
|
-
2. [Graphing & Geometry](#graphing--geometry)
|
|
9
|
-
3. [Data Display](#data-display)
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Number & Ratio Visualizations
|
|
14
|
-
|
|
15
|
-
### Number Line
|
|
16
|
-
|
|
17
|
-
`omdNumberLine` creates interactive number lines with labeled ticks and optional dots to mark values.
|
|
18
|
-
|
|
19
|
-
#### Basic Usage
|
|
20
|
-
|
|
21
|
-
```javascript
|
|
22
|
-
import { omdNumberLine } from '@teachinglab/omd';
|
|
23
|
-
|
|
24
|
-
const numberLine = new omdNumberLine();
|
|
25
|
-
numberLine.loadFromJSON({
|
|
26
|
-
min: 0,
|
|
27
|
-
max: 10,
|
|
28
|
-
dotValues: [2, 5, 8],
|
|
29
|
-
label: "Number Line"
|
|
30
|
-
});
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
#### Properties
|
|
34
|
-
|
|
35
|
-
| Property | Type | Default | Description |
|
|
36
|
-
|----------|------|---------|-------------|
|
|
37
|
-
| `min` | number | 0 | Minimum value on the line |
|
|
38
|
-
| `max` | number | 10 | Maximum value on the line |
|
|
39
|
-
| `dotValues` | number[] | [] | Array of values to mark with dots |
|
|
40
|
-
| `label` | string | "" | Optional label for the number line |
|
|
41
|
-
|
|
42
|
-
#### Examples
|
|
43
|
-
|
|
44
|
-
**Simple number line (0-20):**
|
|
45
|
-
```javascript
|
|
46
|
-
numberLine.loadFromJSON({
|
|
47
|
-
min: 0,
|
|
48
|
-
max: 20
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**Marking fractions:**
|
|
53
|
-
```javascript
|
|
54
|
-
numberLine.loadFromJSON({
|
|
55
|
-
min: 0,
|
|
56
|
-
max: 1,
|
|
57
|
-
dotValues: [0.25, 0.5, 0.75],
|
|
58
|
-
label: "Fractions"
|
|
59
|
-
});
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Negative numbers:**
|
|
63
|
-
```javascript
|
|
64
|
-
numberLine.loadFromJSON({
|
|
65
|
-
min: -10,
|
|
66
|
-
max: 10,
|
|
67
|
-
dotValues: [-5, 0, 5]
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
### Number Tiles
|
|
74
|
-
|
|
75
|
-
`omdNumberTile` creates visual tiles with dots for counting and grouping activities.
|
|
76
|
-
|
|
77
|
-
#### Basic Usage
|
|
78
|
-
|
|
79
|
-
```javascript
|
|
80
|
-
import { omdNumberTile } from '@teachinglab/omd';
|
|
81
|
-
|
|
82
|
-
const tile = new omdNumberTile();
|
|
83
|
-
tile.loadFromJSON({
|
|
84
|
-
value: 10,
|
|
85
|
-
size: "medium",
|
|
86
|
-
dotsPerColumn: 5
|
|
87
|
-
});
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
#### Properties
|
|
91
|
-
|
|
92
|
-
| Property | Type | Default | Description |
|
|
93
|
-
|----------|------|---------|-------------|
|
|
94
|
-
| `value` | number | required | Number of dots to display |
|
|
95
|
-
| `size` | "small" \| "medium" \| "large" | "medium" | Size of the tile |
|
|
96
|
-
| `dotsPerColumn` | number | 5 | How many dots per column |
|
|
97
|
-
| `backgroundColor` | string | "#FFFFFF" | Background color of tile |
|
|
98
|
-
| `dotColor` | string | "#000000" | Color of the dots |
|
|
99
|
-
|
|
100
|
-
#### Examples
|
|
101
|
-
|
|
102
|
-
**Small tile:**
|
|
103
|
-
```javascript
|
|
104
|
-
tile.loadFromJSON({
|
|
105
|
-
value: 5,
|
|
106
|
-
size: "small",
|
|
107
|
-
backgroundColor: "#E8F4FD",
|
|
108
|
-
dotColor: "#1976D2"
|
|
109
|
-
});
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Custom arrangement:**
|
|
113
|
-
```javascript
|
|
114
|
-
tile.loadFromJSON({
|
|
115
|
-
value: 15,
|
|
116
|
-
dotsPerColumn: 3, // 5 columns x 3 rows
|
|
117
|
-
size: "large"
|
|
118
|
-
});
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
### Tape Diagrams
|
|
124
|
-
|
|
125
|
-
`omdTapeDiagram` creates part-whole relationship diagrams with labeled sections.
|
|
126
|
-
|
|
127
|
-
#### Basic Usage
|
|
128
|
-
|
|
129
|
-
```javascript
|
|
130
|
-
import { omdTapeDiagram } from '@teachinglab/omd';
|
|
131
|
-
|
|
132
|
-
const tape = new omdTapeDiagram();
|
|
133
|
-
tape.loadFromJSON({
|
|
134
|
-
values: [3, 5, 2],
|
|
135
|
-
colors: ["#FF6B6B", "#4ECDC4", "#45B7D1"],
|
|
136
|
-
labelSet: [
|
|
137
|
-
{
|
|
138
|
-
startIndex: 0,
|
|
139
|
-
endIndex: 2,
|
|
140
|
-
label: "Total: 10",
|
|
141
|
-
showBelow: true
|
|
142
|
-
}
|
|
143
|
-
]
|
|
144
|
-
});
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
#### Properties
|
|
148
|
-
|
|
149
|
-
| Property | Type | Default | Description |
|
|
150
|
-
|----------|------|---------|-------------|
|
|
151
|
-
| `values` | number[] | required | Array of segment values |
|
|
152
|
-
| `showValues` | boolean | true | Show values in each segment |
|
|
153
|
-
| `colors` | string[] | auto | Colors for each segment |
|
|
154
|
-
| `labelSet` | TapeLabel[] | [] | Labels spanning segments |
|
|
155
|
-
| `unitWidth` | number | 30 | Width per unit value |
|
|
156
|
-
|
|
157
|
-
#### Label Structure
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
{
|
|
161
|
-
startIndex: number, // First segment index
|
|
162
|
-
endIndex: number, // Last segment index
|
|
163
|
-
label: string, // Label text
|
|
164
|
-
showBelow?: boolean // Show below the tape
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
#### Examples
|
|
169
|
-
|
|
170
|
-
**Simple ratio:**
|
|
171
|
-
```javascript
|
|
172
|
-
tape.loadFromJSON({
|
|
173
|
-
values: [2, 3],
|
|
174
|
-
colors: ["#FF6B6B", "#4ECDC4"],
|
|
175
|
-
labelSet: [
|
|
176
|
-
{ startIndex: 0, endIndex: 1, label: "2:3", showBelow: true }
|
|
177
|
-
]
|
|
178
|
-
});
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Multi-part problem:**
|
|
182
|
-
```javascript
|
|
183
|
-
tape.loadFromJSON({
|
|
184
|
-
values: [4, 4, 4, 6],
|
|
185
|
-
showValues: true,
|
|
186
|
-
labelSet: [
|
|
187
|
-
{ startIndex: 0, endIndex: 2, label: "3 equal parts" },
|
|
188
|
-
{ startIndex: 3, endIndex: 3, label: "remainder" }
|
|
189
|
-
],
|
|
190
|
-
unitWidth: 25
|
|
191
|
-
});
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
### Ratio Charts
|
|
197
|
-
|
|
198
|
-
`omdRatioChart` creates pie and bar chart visualizations for ratios.
|
|
199
|
-
|
|
200
|
-
#### Basic Usage
|
|
201
|
-
|
|
202
|
-
```javascript
|
|
203
|
-
import { omdRatioChart } from '@teachinglab/omd';
|
|
204
|
-
|
|
205
|
-
const chart = new omdRatioChart();
|
|
206
|
-
chart.loadFromJSON({
|
|
207
|
-
valueA: 3,
|
|
208
|
-
valueB: 2,
|
|
209
|
-
renderType: "pie",
|
|
210
|
-
size: "medium"
|
|
211
|
-
});
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
#### Properties
|
|
215
|
-
|
|
216
|
-
| Property | Type | Default | Description |
|
|
217
|
-
|----------|------|---------|-------------|
|
|
218
|
-
| `valueA` | number | required | First ratio value |
|
|
219
|
-
| `valueB` | number | required | Second ratio value |
|
|
220
|
-
| `renderType` | "pie" \| "bar" | "pie" | Chart type |
|
|
221
|
-
| `size` | "small" \| "medium" \| "large" | "medium" | Chart size |
|
|
222
|
-
|
|
223
|
-
#### Examples
|
|
224
|
-
|
|
225
|
-
**Pie chart:**
|
|
226
|
-
```javascript
|
|
227
|
-
chart.loadFromJSON({
|
|
228
|
-
valueA: 3,
|
|
229
|
-
valueB: 5,
|
|
230
|
-
renderType: "pie"
|
|
231
|
-
});
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
**Bar chart:**
|
|
235
|
-
```javascript
|
|
236
|
-
chart.loadFromJSON({
|
|
237
|
-
valueA: 7,
|
|
238
|
-
valueB: 3,
|
|
239
|
-
renderType: "bar",
|
|
240
|
-
size: "large"
|
|
241
|
-
});
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
### Balance Hanger
|
|
247
|
-
|
|
248
|
-
`omdBalanceHanger` creates balance scale visualizations for equations and equality.
|
|
249
|
-
|
|
250
|
-
#### Basic Usage
|
|
251
|
-
|
|
252
|
-
```javascript
|
|
253
|
-
import { omdBalanceHanger } from '@teachinglab/omd';
|
|
254
|
-
|
|
255
|
-
const balance = new omdBalanceHanger();
|
|
256
|
-
balance.loadFromJSON({
|
|
257
|
-
leftValues: [5, 3],
|
|
258
|
-
rightValues: [4, 4],
|
|
259
|
-
tilt: "balanced"
|
|
260
|
-
});
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
#### Properties
|
|
264
|
-
|
|
265
|
-
| Property | Type | Default | Description |
|
|
266
|
-
|----------|------|---------|-------------|
|
|
267
|
-
| `leftValues` | number[] | required | Values on left side |
|
|
268
|
-
| `rightValues` | number[] | required | Values on right side |
|
|
269
|
-
| `tilt` | "left" \| "right" \| "balanced" | auto | Balance state |
|
|
270
|
-
|
|
271
|
-
#### Examples
|
|
272
|
-
|
|
273
|
-
**Balanced equation:**
|
|
274
|
-
```javascript
|
|
275
|
-
balance.loadFromJSON({
|
|
276
|
-
leftValues: [10],
|
|
277
|
-
rightValues: [7, 3],
|
|
278
|
-
tilt: "balanced"
|
|
279
|
-
});
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**Unbalanced:**
|
|
283
|
-
```javascript
|
|
284
|
-
balance.loadFromJSON({
|
|
285
|
-
leftValues: [8, 3],
|
|
286
|
-
rightValues: [5, 2],
|
|
287
|
-
tilt: "left"
|
|
288
|
-
});
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## Graphing & Geometry
|
|
294
|
-
|
|
295
|
-
### Coordinate Plane
|
|
296
|
-
|
|
297
|
-
`omdCoordinatePlane` creates a 2D coordinate system with full graphing capabilities.
|
|
298
|
-
|
|
299
|
-
#### Basic Usage
|
|
300
|
-
|
|
301
|
-
```javascript
|
|
302
|
-
import { omdCoordinatePlane } from '@teachinglab/omd';
|
|
303
|
-
|
|
304
|
-
const plane = new omdCoordinatePlane();
|
|
305
|
-
plane.loadFromJSON({
|
|
306
|
-
xMin: -10,
|
|
307
|
-
xMax: 10,
|
|
308
|
-
yMin: -10,
|
|
309
|
-
yMax: 10,
|
|
310
|
-
graphEquations: [
|
|
311
|
-
{ equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 }
|
|
312
|
-
]
|
|
313
|
-
});
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
#### Properties
|
|
317
|
-
|
|
318
|
-
| Property | Type | Default | Description |
|
|
319
|
-
|----------|------|---------|-------------|
|
|
320
|
-
| `xMin` | number | -5 | Minimum x value |
|
|
321
|
-
| `xMax` | number | 5 | Maximum x value |
|
|
322
|
-
| `yMin` | number | -5 | Minimum y value |
|
|
323
|
-
| `yMax` | number | 5 | Maximum y value |
|
|
324
|
-
| `xLabel` | string | "" | X-axis label |
|
|
325
|
-
| `yLabel` | string | "" | Y-axis label |
|
|
326
|
-
| `tickInterval` | number | 1 | Spacing between ticks |
|
|
327
|
-
| `graphEquations` | Equation[] | [] | Functions to graph |
|
|
328
|
-
| `lineSegments` | LineSegment[] | [] | Line segments to draw |
|
|
329
|
-
| `dotValues` | Dot[] | [] | Points to plot |
|
|
330
|
-
| `shapeSet` | Shape[] | [] | Shapes to display |
|
|
331
|
-
| `showTickLabels` | boolean | true | Show numeric labels |
|
|
332
|
-
| `backgroundColor` | string | lightGray | Background color |
|
|
333
|
-
| `showBackground` | boolean | true | Show background |
|
|
334
|
-
|
|
335
|
-
#### Equation Structure
|
|
336
|
-
|
|
337
|
-
```typescript
|
|
338
|
-
{
|
|
339
|
-
equation: string, // e.g., "y = 2x + 1"
|
|
340
|
-
color?: string, // Line color
|
|
341
|
-
strokeWidth?: number, // Line width
|
|
342
|
-
domain?: { // Optional domain restriction
|
|
343
|
-
min: number,
|
|
344
|
-
max: number
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
#### Examples
|
|
350
|
-
|
|
351
|
-
**Linear function:**
|
|
352
|
-
```javascript
|
|
353
|
-
plane.loadFromJSON({
|
|
354
|
-
xMin: -5,
|
|
355
|
-
xMax: 5,
|
|
356
|
-
yMin: -5,
|
|
357
|
-
yMax: 5,
|
|
358
|
-
graphEquations: [
|
|
359
|
-
{ equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 }
|
|
360
|
-
],
|
|
361
|
-
xLabel: "x",
|
|
362
|
-
yLabel: "y"
|
|
363
|
-
});
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
**Multiple functions:**
|
|
367
|
-
```javascript
|
|
368
|
-
plane.loadFromJSON({
|
|
369
|
-
xMin: -10,
|
|
370
|
-
xMax: 10,
|
|
371
|
-
yMin: -10,
|
|
372
|
-
yMax: 10,
|
|
373
|
-
graphEquations: [
|
|
374
|
-
{ equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 },
|
|
375
|
-
{ equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 },
|
|
376
|
-
{ equation: 'y = -x^2 + 5', color: '#10B981', strokeWidth: 2 }
|
|
377
|
-
]
|
|
378
|
-
});
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
**With points and shapes:**
|
|
382
|
-
```javascript
|
|
383
|
-
plane.loadFromJSON({
|
|
384
|
-
xMin: -5,
|
|
385
|
-
xMax: 5,
|
|
386
|
-
yMin: -5,
|
|
387
|
-
yMax: 5,
|
|
388
|
-
graphEquations: [
|
|
389
|
-
{ equation: 'y = x^2 - 4', color: '#e11d48' }
|
|
390
|
-
],
|
|
391
|
-
dotValues: [
|
|
392
|
-
[-2, 0, "blue"], // [x, y, color]
|
|
393
|
-
[2, 0, "blue"],
|
|
394
|
-
[0, -4, "red"]
|
|
395
|
-
],
|
|
396
|
-
lineSegments: [
|
|
397
|
-
{
|
|
398
|
-
point1: [-2, 0],
|
|
399
|
-
point2: [2, 0],
|
|
400
|
-
color: "green",
|
|
401
|
-
strokeWidth: 1
|
|
402
|
-
}
|
|
403
|
-
]
|
|
404
|
-
});
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
---
|
|
408
|
-
|
|
409
|
-
### Shapes
|
|
410
|
-
|
|
411
|
-
OMD provides several geometric shapes that can be used standalone or within a coordinate plane.
|
|
412
|
-
|
|
413
|
-
#### Circle
|
|
414
|
-
|
|
415
|
-
```javascript
|
|
416
|
-
import { omdCircle } from '@teachinglab/omd';
|
|
417
|
-
|
|
418
|
-
const circle = new omdCircle();
|
|
419
|
-
circle.loadFromJSON({
|
|
420
|
-
radius: 10,
|
|
421
|
-
color: "#FF0000"
|
|
422
|
-
});
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
#### Rectangle
|
|
426
|
-
|
|
427
|
-
```javascript
|
|
428
|
-
import { omdRectangle } from '@teachinglab/omd';
|
|
429
|
-
|
|
430
|
-
const rect = new omdRectangle();
|
|
431
|
-
rect.loadFromJSON({
|
|
432
|
-
width: 20,
|
|
433
|
-
height: 10,
|
|
434
|
-
color: "#00FF00"
|
|
435
|
-
});
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
#### Regular Polygon
|
|
439
|
-
|
|
440
|
-
```javascript
|
|
441
|
-
import { omdRegularPolygon } from '@teachinglab/omd';
|
|
442
|
-
|
|
443
|
-
const polygon = new omdRegularPolygon();
|
|
444
|
-
polygon.loadFromJSON({
|
|
445
|
-
sides: 6, // Hexagon
|
|
446
|
-
radius: 15,
|
|
447
|
-
color: "#0000FF"
|
|
448
|
-
});
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
#### Ellipse
|
|
452
|
-
|
|
453
|
-
```javascript
|
|
454
|
-
import { omdEllipse } from '@teachinglab/omd';
|
|
455
|
-
|
|
456
|
-
const ellipse = new omdEllipse();
|
|
457
|
-
ellipse.loadFromJSON({
|
|
458
|
-
radiusX: 20,
|
|
459
|
-
radiusY: 10,
|
|
460
|
-
color: "#FFFF00"
|
|
461
|
-
});
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
#### Right Triangle
|
|
465
|
-
|
|
466
|
-
```javascript
|
|
467
|
-
import { omdRightTriangle } from '@teachinglab/omd';
|
|
468
|
-
|
|
469
|
-
const triangle = new omdRightTriangle();
|
|
470
|
-
triangle.loadFromJSON({
|
|
471
|
-
base: 10,
|
|
472
|
-
height: 15,
|
|
473
|
-
color: "#FF00FF"
|
|
474
|
-
});
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
#### Isosceles Triangle
|
|
478
|
-
|
|
479
|
-
```javascript
|
|
480
|
-
import { omdIsoscelesTriangle } from '@teachinglab/omd';
|
|
481
|
-
|
|
482
|
-
const triangle = new omdIsoscelesTriangle();
|
|
483
|
-
triangle.loadFromJSON({
|
|
484
|
-
base: 10,
|
|
485
|
-
height: 15,
|
|
486
|
-
color: "#00FFFF"
|
|
487
|
-
});
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
#### Using Shapes in Coordinate Plane
|
|
491
|
-
|
|
492
|
-
```javascript
|
|
493
|
-
plane.loadFromJSON({
|
|
494
|
-
xMin: -5,
|
|
495
|
-
xMax: 5,
|
|
496
|
-
yMin: -5,
|
|
497
|
-
yMax: 5,
|
|
498
|
-
shapeSet: [
|
|
499
|
-
{ omdType: 'circle', radius: 2, color: '#FF6B6B' },
|
|
500
|
-
{ omdType: 'rectangle', width: 3, height: 2, color: '#4ECDC4' },
|
|
501
|
-
{ omdType: 'regularPolygon', sides: 6, radius: 1.5, color: '#45B7D1' }
|
|
502
|
-
]
|
|
503
|
-
});
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
---
|
|
507
|
-
|
|
508
|
-
### Spinner
|
|
509
|
-
|
|
510
|
-
`omdSpinner` creates circular spinners for probability and division activities.
|
|
511
|
-
|
|
512
|
-
#### Basic Usage
|
|
513
|
-
|
|
514
|
-
```javascript
|
|
515
|
-
import { omdSpinner } from '@teachinglab/omd';
|
|
516
|
-
|
|
517
|
-
const spinner = new omdSpinner();
|
|
518
|
-
spinner.loadFromJSON({
|
|
519
|
-
divisions: 8,
|
|
520
|
-
arrowPosition: 3,
|
|
521
|
-
size: "medium"
|
|
522
|
-
});
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
#### Properties
|
|
526
|
-
|
|
527
|
-
| Property | Type | Default | Description |
|
|
528
|
-
|----------|------|---------|-------------|
|
|
529
|
-
| `divisions` | number | required | Number of spinner divisions |
|
|
530
|
-
| `arrowPosition` | number | 0 | Initial arrow position |
|
|
531
|
-
| `size` | "small" \| "medium" \| "large" | "medium" | Spinner size |
|
|
532
|
-
|
|
533
|
-
#### Examples
|
|
534
|
-
|
|
535
|
-
**Four equal parts:**
|
|
536
|
-
```javascript
|
|
537
|
-
spinner.loadFromJSON({
|
|
538
|
-
divisions: 4,
|
|
539
|
-
arrowPosition: 0
|
|
540
|
-
});
|
|
541
|
-
```
|
|
542
|
-
|
|
543
|
-
**Probability spinner:**
|
|
544
|
-
```javascript
|
|
545
|
-
spinner.loadFromJSON({
|
|
546
|
-
divisions: 10,
|
|
547
|
-
arrowPosition: 5,
|
|
548
|
-
size: "large"
|
|
549
|
-
});
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
---
|
|
553
|
-
|
|
554
|
-
## Data Display
|
|
555
|
-
|
|
556
|
-
### Tables
|
|
557
|
-
|
|
558
|
-
`omdTable` creates data tables with customizable styling.
|
|
559
|
-
|
|
560
|
-
#### Basic Usage
|
|
561
|
-
|
|
562
|
-
```javascript
|
|
563
|
-
import { omdTable } from '@teachinglab/omd';
|
|
564
|
-
|
|
565
|
-
const table = new omdTable();
|
|
566
|
-
table.loadFromJSON({
|
|
567
|
-
equation: "y = x^2",
|
|
568
|
-
headers: ["x", "y"],
|
|
569
|
-
xMin: -5,
|
|
570
|
-
xMax: 5,
|
|
571
|
-
stepSize: 1,
|
|
572
|
-
title: "Quadratic Function"
|
|
573
|
-
});
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
#### Properties
|
|
577
|
-
|
|
578
|
-
| Property | Type | Default | Description |
|
|
579
|
-
|----------|------|---------|-------------|
|
|
580
|
-
| `equation` | string | "" | Equation to generate data |
|
|
581
|
-
| `data` | [number, number][] | [] | Manual data input |
|
|
582
|
-
| `headers` | string[] | ['x', 'y'] | Column headers |
|
|
583
|
-
| `xMin` | number | -5 | Minimum x value |
|
|
584
|
-
| `xMax` | number | 5 | Maximum x value |
|
|
585
|
-
| `stepSize` | number | 1 | Increment between x values |
|
|
586
|
-
| `title` | string | "" | Table title |
|
|
587
|
-
| `fontSize` | number | 14 | Cell font size |
|
|
588
|
-
| `headerFontSize` | number | 16 | Header font size |
|
|
589
|
-
| `fontFamily` | string | "Albert Sans" | Font family |
|
|
590
|
-
| `cellHeight` | number | 35 | Cell height in pixels |
|
|
591
|
-
| `backgroundColor` | string | lightGray | Background color |
|
|
592
|
-
| `alternatingRowColors` | string[] | null | Alternating row colors |
|
|
593
|
-
|
|
594
|
-
#### Examples
|
|
595
|
-
|
|
596
|
-
**From equation:**
|
|
597
|
-
```javascript
|
|
598
|
-
table.loadFromJSON({
|
|
599
|
-
equation: "y = 2x + 1",
|
|
600
|
-
headers: ["x", "y"],
|
|
601
|
-
xMin: -3,
|
|
602
|
-
xMax: 3,
|
|
603
|
-
stepSize: 1,
|
|
604
|
-
title: "Linear Function",
|
|
605
|
-
alternatingRowColors: ["#F0F0F0", "#FFFFFF"]
|
|
606
|
-
});
|
|
607
|
-
```
|
|
608
|
-
|
|
609
|
-
**Manual data:**
|
|
610
|
-
```javascript
|
|
611
|
-
table.loadFromJSON({
|
|
612
|
-
data: [
|
|
613
|
-
[0, 0],
|
|
614
|
-
[1, 1],
|
|
615
|
-
[2, 4],
|
|
616
|
-
[3, 9]
|
|
617
|
-
],
|
|
618
|
-
headers: ["x", "x²"],
|
|
619
|
-
title: "Squares",
|
|
620
|
-
fontSize: 16,
|
|
621
|
-
cellHeight: 40
|
|
622
|
-
});
|
|
623
|
-
```
|
|
624
|
-
|
|
625
|
-
**Styled table:**
|
|
626
|
-
```javascript
|
|
627
|
-
table.loadFromJSON({
|
|
628
|
-
equation: "y = x^3",
|
|
629
|
-
xMin: -2,
|
|
630
|
-
xMax: 2,
|
|
631
|
-
stepSize: 0.5,
|
|
632
|
-
title: "Cubic Function",
|
|
633
|
-
fontFamily: "Georgia",
|
|
634
|
-
fontSize: 14,
|
|
635
|
-
headerFontSize: 18,
|
|
636
|
-
backgroundColor: "#E3F2FD",
|
|
637
|
-
alternatingRowColors: ["#BBDEFB", "#E3F2FD"]
|
|
638
|
-
});
|
|
639
|
-
```
|
|
640
|
-
|
|
641
|
-
---
|
|
642
|
-
|
|
643
|
-
## Best Practices
|
|
644
|
-
|
|
645
|
-
### Sizing
|
|
646
|
-
|
|
647
|
-
Most visualization components support size options:
|
|
648
|
-
- `"small"` - Compact display
|
|
649
|
-
- `"medium"` - Standard size (default)
|
|
650
|
-
- `"large"` - Expanded display
|
|
651
|
-
|
|
652
|
-
### Colors
|
|
653
|
-
|
|
654
|
-
OMD uses a consistent color system:
|
|
655
|
-
- Use hex colors for consistency: `#FF6B6B`
|
|
656
|
-
- Access built-in colors: `omdColor.lightGray`
|
|
657
|
-
- Ensure sufficient contrast for accessibility
|
|
658
|
-
|
|
659
|
-
### Performance
|
|
660
|
-
|
|
661
|
-
For coordinate planes with many equations:
|
|
662
|
-
- Limit the number of simultaneous graphs
|
|
663
|
-
- Use domain restrictions when possible
|
|
664
|
-
- Consider the viewport size (xMin/xMax, yMin/yMax)
|
|
665
|
-
|
|
666
|
-
### Responsive Design
|
|
667
|
-
|
|
668
|
-
Set appropriate container dimensions:
|
|
669
|
-
```css
|
|
670
|
-
#math-container {
|
|
671
|
-
width: 100%;
|
|
672
|
-
max-width: 800px;
|
|
673
|
-
height: 400px;
|
|
674
|
-
}
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
## Next Steps
|
|
678
|
-
|
|
679
|
-
- **[Equations Guide](./equations.md)** - Learn about equation components
|
|
680
|
-
- **[JSON Schemas](../json-schemas.md)** - Complete reference
|
|
681
|
-
- **[API Reference](../api/api-reference.md)** - Detailed documentation
|
|
682
|
-
- **[Examples](./quick-examples.md)** - More code samples
|
|
1
|
+
# Visualizations Guide
|
|
2
|
+
|
|
3
|
+
OMD provides a comprehensive set of visualization components for teaching and learning mathematics. This guide covers all visualization components organized by category.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Number & Ratio Visualizations](#number--ratio-visualizations)
|
|
8
|
+
2. [Graphing & Geometry](#graphing--geometry)
|
|
9
|
+
3. [Data Display](#data-display)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Number & Ratio Visualizations
|
|
14
|
+
|
|
15
|
+
### Number Line
|
|
16
|
+
|
|
17
|
+
`omdNumberLine` creates interactive number lines with labeled ticks and optional dots to mark values.
|
|
18
|
+
|
|
19
|
+
#### Basic Usage
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
import { omdNumberLine } from '@teachinglab/omd';
|
|
23
|
+
|
|
24
|
+
const numberLine = new omdNumberLine();
|
|
25
|
+
numberLine.loadFromJSON({
|
|
26
|
+
min: 0,
|
|
27
|
+
max: 10,
|
|
28
|
+
dotValues: [2, 5, 8],
|
|
29
|
+
label: "Number Line"
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
#### Properties
|
|
34
|
+
|
|
35
|
+
| Property | Type | Default | Description |
|
|
36
|
+
|----------|------|---------|-------------|
|
|
37
|
+
| `min` | number | 0 | Minimum value on the line |
|
|
38
|
+
| `max` | number | 10 | Maximum value on the line |
|
|
39
|
+
| `dotValues` | number[] | [] | Array of values to mark with dots |
|
|
40
|
+
| `label` | string | "" | Optional label for the number line |
|
|
41
|
+
|
|
42
|
+
#### Examples
|
|
43
|
+
|
|
44
|
+
**Simple number line (0-20):**
|
|
45
|
+
```javascript
|
|
46
|
+
numberLine.loadFromJSON({
|
|
47
|
+
min: 0,
|
|
48
|
+
max: 20
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Marking fractions:**
|
|
53
|
+
```javascript
|
|
54
|
+
numberLine.loadFromJSON({
|
|
55
|
+
min: 0,
|
|
56
|
+
max: 1,
|
|
57
|
+
dotValues: [0.25, 0.5, 0.75],
|
|
58
|
+
label: "Fractions"
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Negative numbers:**
|
|
63
|
+
```javascript
|
|
64
|
+
numberLine.loadFromJSON({
|
|
65
|
+
min: -10,
|
|
66
|
+
max: 10,
|
|
67
|
+
dotValues: [-5, 0, 5]
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### Number Tiles
|
|
74
|
+
|
|
75
|
+
`omdNumberTile` creates visual tiles with dots for counting and grouping activities.
|
|
76
|
+
|
|
77
|
+
#### Basic Usage
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
import { omdNumberTile } from '@teachinglab/omd';
|
|
81
|
+
|
|
82
|
+
const tile = new omdNumberTile();
|
|
83
|
+
tile.loadFromJSON({
|
|
84
|
+
value: 10,
|
|
85
|
+
size: "medium",
|
|
86
|
+
dotsPerColumn: 5
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### Properties
|
|
91
|
+
|
|
92
|
+
| Property | Type | Default | Description |
|
|
93
|
+
|----------|------|---------|-------------|
|
|
94
|
+
| `value` | number | required | Number of dots to display |
|
|
95
|
+
| `size` | "small" \| "medium" \| "large" | "medium" | Size of the tile |
|
|
96
|
+
| `dotsPerColumn` | number | 5 | How many dots per column |
|
|
97
|
+
| `backgroundColor` | string | "#FFFFFF" | Background color of tile |
|
|
98
|
+
| `dotColor` | string | "#000000" | Color of the dots |
|
|
99
|
+
|
|
100
|
+
#### Examples
|
|
101
|
+
|
|
102
|
+
**Small tile:**
|
|
103
|
+
```javascript
|
|
104
|
+
tile.loadFromJSON({
|
|
105
|
+
value: 5,
|
|
106
|
+
size: "small",
|
|
107
|
+
backgroundColor: "#E8F4FD",
|
|
108
|
+
dotColor: "#1976D2"
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Custom arrangement:**
|
|
113
|
+
```javascript
|
|
114
|
+
tile.loadFromJSON({
|
|
115
|
+
value: 15,
|
|
116
|
+
dotsPerColumn: 3, // 5 columns x 3 rows
|
|
117
|
+
size: "large"
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Tape Diagrams
|
|
124
|
+
|
|
125
|
+
`omdTapeDiagram` creates part-whole relationship diagrams with labeled sections.
|
|
126
|
+
|
|
127
|
+
#### Basic Usage
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
import { omdTapeDiagram } from '@teachinglab/omd';
|
|
131
|
+
|
|
132
|
+
const tape = new omdTapeDiagram();
|
|
133
|
+
tape.loadFromJSON({
|
|
134
|
+
values: [3, 5, 2],
|
|
135
|
+
colors: ["#FF6B6B", "#4ECDC4", "#45B7D1"],
|
|
136
|
+
labelSet: [
|
|
137
|
+
{
|
|
138
|
+
startIndex: 0,
|
|
139
|
+
endIndex: 2,
|
|
140
|
+
label: "Total: 10",
|
|
141
|
+
showBelow: true
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### Properties
|
|
148
|
+
|
|
149
|
+
| Property | Type | Default | Description |
|
|
150
|
+
|----------|------|---------|-------------|
|
|
151
|
+
| `values` | number[] | required | Array of segment values |
|
|
152
|
+
| `showValues` | boolean | true | Show values in each segment |
|
|
153
|
+
| `colors` | string[] | auto | Colors for each segment |
|
|
154
|
+
| `labelSet` | TapeLabel[] | [] | Labels spanning segments |
|
|
155
|
+
| `unitWidth` | number | 30 | Width per unit value |
|
|
156
|
+
|
|
157
|
+
#### Label Structure
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
{
|
|
161
|
+
startIndex: number, // First segment index
|
|
162
|
+
endIndex: number, // Last segment index
|
|
163
|
+
label: string, // Label text
|
|
164
|
+
showBelow?: boolean // Show below the tape
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### Examples
|
|
169
|
+
|
|
170
|
+
**Simple ratio:**
|
|
171
|
+
```javascript
|
|
172
|
+
tape.loadFromJSON({
|
|
173
|
+
values: [2, 3],
|
|
174
|
+
colors: ["#FF6B6B", "#4ECDC4"],
|
|
175
|
+
labelSet: [
|
|
176
|
+
{ startIndex: 0, endIndex: 1, label: "2:3", showBelow: true }
|
|
177
|
+
]
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Multi-part problem:**
|
|
182
|
+
```javascript
|
|
183
|
+
tape.loadFromJSON({
|
|
184
|
+
values: [4, 4, 4, 6],
|
|
185
|
+
showValues: true,
|
|
186
|
+
labelSet: [
|
|
187
|
+
{ startIndex: 0, endIndex: 2, label: "3 equal parts" },
|
|
188
|
+
{ startIndex: 3, endIndex: 3, label: "remainder" }
|
|
189
|
+
],
|
|
190
|
+
unitWidth: 25
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
### Ratio Charts
|
|
197
|
+
|
|
198
|
+
`omdRatioChart` creates pie and bar chart visualizations for ratios.
|
|
199
|
+
|
|
200
|
+
#### Basic Usage
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
import { omdRatioChart } from '@teachinglab/omd';
|
|
204
|
+
|
|
205
|
+
const chart = new omdRatioChart();
|
|
206
|
+
chart.loadFromJSON({
|
|
207
|
+
valueA: 3,
|
|
208
|
+
valueB: 2,
|
|
209
|
+
renderType: "pie",
|
|
210
|
+
size: "medium"
|
|
211
|
+
});
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
#### Properties
|
|
215
|
+
|
|
216
|
+
| Property | Type | Default | Description |
|
|
217
|
+
|----------|------|---------|-------------|
|
|
218
|
+
| `valueA` | number | required | First ratio value |
|
|
219
|
+
| `valueB` | number | required | Second ratio value |
|
|
220
|
+
| `renderType` | "pie" \| "bar" | "pie" | Chart type |
|
|
221
|
+
| `size` | "small" \| "medium" \| "large" | "medium" | Chart size |
|
|
222
|
+
|
|
223
|
+
#### Examples
|
|
224
|
+
|
|
225
|
+
**Pie chart:**
|
|
226
|
+
```javascript
|
|
227
|
+
chart.loadFromJSON({
|
|
228
|
+
valueA: 3,
|
|
229
|
+
valueB: 5,
|
|
230
|
+
renderType: "pie"
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Bar chart:**
|
|
235
|
+
```javascript
|
|
236
|
+
chart.loadFromJSON({
|
|
237
|
+
valueA: 7,
|
|
238
|
+
valueB: 3,
|
|
239
|
+
renderType: "bar",
|
|
240
|
+
size: "large"
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
### Balance Hanger
|
|
247
|
+
|
|
248
|
+
`omdBalanceHanger` creates balance scale visualizations for equations and equality.
|
|
249
|
+
|
|
250
|
+
#### Basic Usage
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
import { omdBalanceHanger } from '@teachinglab/omd';
|
|
254
|
+
|
|
255
|
+
const balance = new omdBalanceHanger();
|
|
256
|
+
balance.loadFromJSON({
|
|
257
|
+
leftValues: [5, 3],
|
|
258
|
+
rightValues: [4, 4],
|
|
259
|
+
tilt: "balanced"
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
#### Properties
|
|
264
|
+
|
|
265
|
+
| Property | Type | Default | Description |
|
|
266
|
+
|----------|------|---------|-------------|
|
|
267
|
+
| `leftValues` | number[] | required | Values on left side |
|
|
268
|
+
| `rightValues` | number[] | required | Values on right side |
|
|
269
|
+
| `tilt` | "left" \| "right" \| "balanced" | auto | Balance state |
|
|
270
|
+
|
|
271
|
+
#### Examples
|
|
272
|
+
|
|
273
|
+
**Balanced equation:**
|
|
274
|
+
```javascript
|
|
275
|
+
balance.loadFromJSON({
|
|
276
|
+
leftValues: [10],
|
|
277
|
+
rightValues: [7, 3],
|
|
278
|
+
tilt: "balanced"
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Unbalanced:**
|
|
283
|
+
```javascript
|
|
284
|
+
balance.loadFromJSON({
|
|
285
|
+
leftValues: [8, 3],
|
|
286
|
+
rightValues: [5, 2],
|
|
287
|
+
tilt: "left"
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Graphing & Geometry
|
|
294
|
+
|
|
295
|
+
### Coordinate Plane
|
|
296
|
+
|
|
297
|
+
`omdCoordinatePlane` creates a 2D coordinate system with full graphing capabilities.
|
|
298
|
+
|
|
299
|
+
#### Basic Usage
|
|
300
|
+
|
|
301
|
+
```javascript
|
|
302
|
+
import { omdCoordinatePlane } from '@teachinglab/omd';
|
|
303
|
+
|
|
304
|
+
const plane = new omdCoordinatePlane();
|
|
305
|
+
plane.loadFromJSON({
|
|
306
|
+
xMin: -10,
|
|
307
|
+
xMax: 10,
|
|
308
|
+
yMin: -10,
|
|
309
|
+
yMax: 10,
|
|
310
|
+
graphEquations: [
|
|
311
|
+
{ equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 }
|
|
312
|
+
]
|
|
313
|
+
});
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
#### Properties
|
|
317
|
+
|
|
318
|
+
| Property | Type | Default | Description |
|
|
319
|
+
|----------|------|---------|-------------|
|
|
320
|
+
| `xMin` | number | -5 | Minimum x value |
|
|
321
|
+
| `xMax` | number | 5 | Maximum x value |
|
|
322
|
+
| `yMin` | number | -5 | Minimum y value |
|
|
323
|
+
| `yMax` | number | 5 | Maximum y value |
|
|
324
|
+
| `xLabel` | string | "" | X-axis label |
|
|
325
|
+
| `yLabel` | string | "" | Y-axis label |
|
|
326
|
+
| `tickInterval` | number | 1 | Spacing between ticks |
|
|
327
|
+
| `graphEquations` | Equation[] | [] | Functions to graph |
|
|
328
|
+
| `lineSegments` | LineSegment[] | [] | Line segments to draw |
|
|
329
|
+
| `dotValues` | Dot[] | [] | Points to plot |
|
|
330
|
+
| `shapeSet` | Shape[] | [] | Shapes to display |
|
|
331
|
+
| `showTickLabels` | boolean | true | Show numeric labels |
|
|
332
|
+
| `backgroundColor` | string | lightGray | Background color |
|
|
333
|
+
| `showBackground` | boolean | true | Show background |
|
|
334
|
+
|
|
335
|
+
#### Equation Structure
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
{
|
|
339
|
+
equation: string, // e.g., "y = 2x + 1"
|
|
340
|
+
color?: string, // Line color
|
|
341
|
+
strokeWidth?: number, // Line width
|
|
342
|
+
domain?: { // Optional domain restriction
|
|
343
|
+
min: number,
|
|
344
|
+
max: number
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### Examples
|
|
350
|
+
|
|
351
|
+
**Linear function:**
|
|
352
|
+
```javascript
|
|
353
|
+
plane.loadFromJSON({
|
|
354
|
+
xMin: -5,
|
|
355
|
+
xMax: 5,
|
|
356
|
+
yMin: -5,
|
|
357
|
+
yMax: 5,
|
|
358
|
+
graphEquations: [
|
|
359
|
+
{ equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 }
|
|
360
|
+
],
|
|
361
|
+
xLabel: "x",
|
|
362
|
+
yLabel: "y"
|
|
363
|
+
});
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Multiple functions:**
|
|
367
|
+
```javascript
|
|
368
|
+
plane.loadFromJSON({
|
|
369
|
+
xMin: -10,
|
|
370
|
+
xMax: 10,
|
|
371
|
+
yMin: -10,
|
|
372
|
+
yMax: 10,
|
|
373
|
+
graphEquations: [
|
|
374
|
+
{ equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 },
|
|
375
|
+
{ equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 },
|
|
376
|
+
{ equation: 'y = -x^2 + 5', color: '#10B981', strokeWidth: 2 }
|
|
377
|
+
]
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**With points and shapes:**
|
|
382
|
+
```javascript
|
|
383
|
+
plane.loadFromJSON({
|
|
384
|
+
xMin: -5,
|
|
385
|
+
xMax: 5,
|
|
386
|
+
yMin: -5,
|
|
387
|
+
yMax: 5,
|
|
388
|
+
graphEquations: [
|
|
389
|
+
{ equation: 'y = x^2 - 4', color: '#e11d48' }
|
|
390
|
+
],
|
|
391
|
+
dotValues: [
|
|
392
|
+
[-2, 0, "blue"], // [x, y, color]
|
|
393
|
+
[2, 0, "blue"],
|
|
394
|
+
[0, -4, "red"]
|
|
395
|
+
],
|
|
396
|
+
lineSegments: [
|
|
397
|
+
{
|
|
398
|
+
point1: [-2, 0],
|
|
399
|
+
point2: [2, 0],
|
|
400
|
+
color: "green",
|
|
401
|
+
strokeWidth: 1
|
|
402
|
+
}
|
|
403
|
+
]
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
### Shapes
|
|
410
|
+
|
|
411
|
+
OMD provides several geometric shapes that can be used standalone or within a coordinate plane.
|
|
412
|
+
|
|
413
|
+
#### Circle
|
|
414
|
+
|
|
415
|
+
```javascript
|
|
416
|
+
import { omdCircle } from '@teachinglab/omd';
|
|
417
|
+
|
|
418
|
+
const circle = new omdCircle();
|
|
419
|
+
circle.loadFromJSON({
|
|
420
|
+
radius: 10,
|
|
421
|
+
color: "#FF0000"
|
|
422
|
+
});
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
#### Rectangle
|
|
426
|
+
|
|
427
|
+
```javascript
|
|
428
|
+
import { omdRectangle } from '@teachinglab/omd';
|
|
429
|
+
|
|
430
|
+
const rect = new omdRectangle();
|
|
431
|
+
rect.loadFromJSON({
|
|
432
|
+
width: 20,
|
|
433
|
+
height: 10,
|
|
434
|
+
color: "#00FF00"
|
|
435
|
+
});
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
#### Regular Polygon
|
|
439
|
+
|
|
440
|
+
```javascript
|
|
441
|
+
import { omdRegularPolygon } from '@teachinglab/omd';
|
|
442
|
+
|
|
443
|
+
const polygon = new omdRegularPolygon();
|
|
444
|
+
polygon.loadFromJSON({
|
|
445
|
+
sides: 6, // Hexagon
|
|
446
|
+
radius: 15,
|
|
447
|
+
color: "#0000FF"
|
|
448
|
+
});
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
#### Ellipse
|
|
452
|
+
|
|
453
|
+
```javascript
|
|
454
|
+
import { omdEllipse } from '@teachinglab/omd';
|
|
455
|
+
|
|
456
|
+
const ellipse = new omdEllipse();
|
|
457
|
+
ellipse.loadFromJSON({
|
|
458
|
+
radiusX: 20,
|
|
459
|
+
radiusY: 10,
|
|
460
|
+
color: "#FFFF00"
|
|
461
|
+
});
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
#### Right Triangle
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
import { omdRightTriangle } from '@teachinglab/omd';
|
|
468
|
+
|
|
469
|
+
const triangle = new omdRightTriangle();
|
|
470
|
+
triangle.loadFromJSON({
|
|
471
|
+
base: 10,
|
|
472
|
+
height: 15,
|
|
473
|
+
color: "#FF00FF"
|
|
474
|
+
});
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
#### Isosceles Triangle
|
|
478
|
+
|
|
479
|
+
```javascript
|
|
480
|
+
import { omdIsoscelesTriangle } from '@teachinglab/omd';
|
|
481
|
+
|
|
482
|
+
const triangle = new omdIsoscelesTriangle();
|
|
483
|
+
triangle.loadFromJSON({
|
|
484
|
+
base: 10,
|
|
485
|
+
height: 15,
|
|
486
|
+
color: "#00FFFF"
|
|
487
|
+
});
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
#### Using Shapes in Coordinate Plane
|
|
491
|
+
|
|
492
|
+
```javascript
|
|
493
|
+
plane.loadFromJSON({
|
|
494
|
+
xMin: -5,
|
|
495
|
+
xMax: 5,
|
|
496
|
+
yMin: -5,
|
|
497
|
+
yMax: 5,
|
|
498
|
+
shapeSet: [
|
|
499
|
+
{ omdType: 'circle', radius: 2, color: '#FF6B6B' },
|
|
500
|
+
{ omdType: 'rectangle', width: 3, height: 2, color: '#4ECDC4' },
|
|
501
|
+
{ omdType: 'regularPolygon', sides: 6, radius: 1.5, color: '#45B7D1' }
|
|
502
|
+
]
|
|
503
|
+
});
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
### Spinner
|
|
509
|
+
|
|
510
|
+
`omdSpinner` creates circular spinners for probability and division activities.
|
|
511
|
+
|
|
512
|
+
#### Basic Usage
|
|
513
|
+
|
|
514
|
+
```javascript
|
|
515
|
+
import { omdSpinner } from '@teachinglab/omd';
|
|
516
|
+
|
|
517
|
+
const spinner = new omdSpinner();
|
|
518
|
+
spinner.loadFromJSON({
|
|
519
|
+
divisions: 8,
|
|
520
|
+
arrowPosition: 3,
|
|
521
|
+
size: "medium"
|
|
522
|
+
});
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
#### Properties
|
|
526
|
+
|
|
527
|
+
| Property | Type | Default | Description |
|
|
528
|
+
|----------|------|---------|-------------|
|
|
529
|
+
| `divisions` | number | required | Number of spinner divisions |
|
|
530
|
+
| `arrowPosition` | number | 0 | Initial arrow position |
|
|
531
|
+
| `size` | "small" \| "medium" \| "large" | "medium" | Spinner size |
|
|
532
|
+
|
|
533
|
+
#### Examples
|
|
534
|
+
|
|
535
|
+
**Four equal parts:**
|
|
536
|
+
```javascript
|
|
537
|
+
spinner.loadFromJSON({
|
|
538
|
+
divisions: 4,
|
|
539
|
+
arrowPosition: 0
|
|
540
|
+
});
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**Probability spinner:**
|
|
544
|
+
```javascript
|
|
545
|
+
spinner.loadFromJSON({
|
|
546
|
+
divisions: 10,
|
|
547
|
+
arrowPosition: 5,
|
|
548
|
+
size: "large"
|
|
549
|
+
});
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
## Data Display
|
|
555
|
+
|
|
556
|
+
### Tables
|
|
557
|
+
|
|
558
|
+
`omdTable` creates data tables with customizable styling.
|
|
559
|
+
|
|
560
|
+
#### Basic Usage
|
|
561
|
+
|
|
562
|
+
```javascript
|
|
563
|
+
import { omdTable } from '@teachinglab/omd';
|
|
564
|
+
|
|
565
|
+
const table = new omdTable();
|
|
566
|
+
table.loadFromJSON({
|
|
567
|
+
equation: "y = x^2",
|
|
568
|
+
headers: ["x", "y"],
|
|
569
|
+
xMin: -5,
|
|
570
|
+
xMax: 5,
|
|
571
|
+
stepSize: 1,
|
|
572
|
+
title: "Quadratic Function"
|
|
573
|
+
});
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
#### Properties
|
|
577
|
+
|
|
578
|
+
| Property | Type | Default | Description |
|
|
579
|
+
|----------|------|---------|-------------|
|
|
580
|
+
| `equation` | string | "" | Equation to generate data |
|
|
581
|
+
| `data` | [number, number][] | [] | Manual data input |
|
|
582
|
+
| `headers` | string[] | ['x', 'y'] | Column headers |
|
|
583
|
+
| `xMin` | number | -5 | Minimum x value |
|
|
584
|
+
| `xMax` | number | 5 | Maximum x value |
|
|
585
|
+
| `stepSize` | number | 1 | Increment between x values |
|
|
586
|
+
| `title` | string | "" | Table title |
|
|
587
|
+
| `fontSize` | number | 14 | Cell font size |
|
|
588
|
+
| `headerFontSize` | number | 16 | Header font size |
|
|
589
|
+
| `fontFamily` | string | "Albert Sans" | Font family |
|
|
590
|
+
| `cellHeight` | number | 35 | Cell height in pixels |
|
|
591
|
+
| `backgroundColor` | string | lightGray | Background color |
|
|
592
|
+
| `alternatingRowColors` | string[] | null | Alternating row colors |
|
|
593
|
+
|
|
594
|
+
#### Examples
|
|
595
|
+
|
|
596
|
+
**From equation:**
|
|
597
|
+
```javascript
|
|
598
|
+
table.loadFromJSON({
|
|
599
|
+
equation: "y = 2x + 1",
|
|
600
|
+
headers: ["x", "y"],
|
|
601
|
+
xMin: -3,
|
|
602
|
+
xMax: 3,
|
|
603
|
+
stepSize: 1,
|
|
604
|
+
title: "Linear Function",
|
|
605
|
+
alternatingRowColors: ["#F0F0F0", "#FFFFFF"]
|
|
606
|
+
});
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
**Manual data:**
|
|
610
|
+
```javascript
|
|
611
|
+
table.loadFromJSON({
|
|
612
|
+
data: [
|
|
613
|
+
[0, 0],
|
|
614
|
+
[1, 1],
|
|
615
|
+
[2, 4],
|
|
616
|
+
[3, 9]
|
|
617
|
+
],
|
|
618
|
+
headers: ["x", "x²"],
|
|
619
|
+
title: "Squares",
|
|
620
|
+
fontSize: 16,
|
|
621
|
+
cellHeight: 40
|
|
622
|
+
});
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
**Styled table:**
|
|
626
|
+
```javascript
|
|
627
|
+
table.loadFromJSON({
|
|
628
|
+
equation: "y = x^3",
|
|
629
|
+
xMin: -2,
|
|
630
|
+
xMax: 2,
|
|
631
|
+
stepSize: 0.5,
|
|
632
|
+
title: "Cubic Function",
|
|
633
|
+
fontFamily: "Georgia",
|
|
634
|
+
fontSize: 14,
|
|
635
|
+
headerFontSize: 18,
|
|
636
|
+
backgroundColor: "#E3F2FD",
|
|
637
|
+
alternatingRowColors: ["#BBDEFB", "#E3F2FD"]
|
|
638
|
+
});
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## Best Practices
|
|
644
|
+
|
|
645
|
+
### Sizing
|
|
646
|
+
|
|
647
|
+
Most visualization components support size options:
|
|
648
|
+
- `"small"` - Compact display
|
|
649
|
+
- `"medium"` - Standard size (default)
|
|
650
|
+
- `"large"` - Expanded display
|
|
651
|
+
|
|
652
|
+
### Colors
|
|
653
|
+
|
|
654
|
+
OMD uses a consistent color system:
|
|
655
|
+
- Use hex colors for consistency: `#FF6B6B`
|
|
656
|
+
- Access built-in colors: `omdColor.lightGray`
|
|
657
|
+
- Ensure sufficient contrast for accessibility
|
|
658
|
+
|
|
659
|
+
### Performance
|
|
660
|
+
|
|
661
|
+
For coordinate planes with many equations:
|
|
662
|
+
- Limit the number of simultaneous graphs
|
|
663
|
+
- Use domain restrictions when possible
|
|
664
|
+
- Consider the viewport size (xMin/xMax, yMin/yMax)
|
|
665
|
+
|
|
666
|
+
### Responsive Design
|
|
667
|
+
|
|
668
|
+
Set appropriate container dimensions:
|
|
669
|
+
```css
|
|
670
|
+
#math-container {
|
|
671
|
+
width: 100%;
|
|
672
|
+
max-width: 800px;
|
|
673
|
+
height: 400px;
|
|
674
|
+
}
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
## Next Steps
|
|
678
|
+
|
|
679
|
+
- **[Equations Guide](./equations.md)** - Learn about equation components
|
|
680
|
+
- **[JSON Schemas](../json-schemas.md)** - Complete reference
|
|
681
|
+
- **[API Reference](../api/api-reference.md)** - Detailed documentation
|
|
682
|
+
- **[Examples](./quick-examples.md)** - More code samples
|