@teachinglab/omd
Version:
omd
145 lines (87 loc) • 5.61 kB
Markdown
# omdSqrtNode
Represents a square root node in the mathematical expression tree. It handles the rendering of the radical symbol (√) and the expression under the root (radicand), ensuring correct visual layout and mathematical behavior.
## Class Definition
```javascript
export class omdSqrtNode extends omdNode
```
## Constructor
### `new omdSqrtNode(astNodeData)`
Creates a new `omdSqrtNode` instance.
- **`astNodeData`** (`object`): The math.js AST node containing square root function information. It should have an `args` property, which is an array containing a single AST node for the radicand. The constructor also initializes the visual `radicalPath` and `radicalLine` elements.
## Static Methods
### `fromString(expressionString)`
Creates an `omdSqrtNode` from a string representation of a square root function. Requires `window.math` (math.js) to be available globally for parsing.
- **`expressionString`** (`string`): The square root expression as a string (e.g., `"sqrt(x+1)"`).
- **Returns**: `omdSqrtNode` - A new instance.
- **Throws**: `Error` if `math.js` is not available, if the string cannot be parsed, or if it does not represent a valid `sqrt` function.
## Public Properties
- **`argument`** (`omdNode`): The node representing the radicand (the expression under the root).
- **`value`** (`string`): Always `"sqrt"` for this node type.
- **`radicalPath`** (`jsvgPath`): The SVG path element that draws the radical symbol (√).
- **`radicalLine`** (`jsvgLine`): The SVG line element that draws the horizontal line above the radicand.
- **`args`** (`Array<object>`): The raw AST arguments passed to the constructor.
## Public Methods
### `computeDimensions()`
Calculates the dimensions of the square root node. It scales down the font size of the `argument`, computes its dimensions, and then determines the overall width (radical width + spacing + argument width) and height (argument height + extra height for the radical top).
- **Overrides**: `omdNode.computeDimensions()`.
### `updateLayout()`
Updates the layout of the square root node. It positions the `argument` node, then draws and positions the `radicalPath` and `radicalLine` elements relative to the argument, ensuring the radical symbol correctly encloses the radicand.
- **Overrides**: `omdNode.updateLayout()`.
### `clone()`
Creates a deep, structural clone of the square root node, including its `argument` node and visual elements. The cloned node's `provenance` array is updated to include the original node's ID.
- **Returns**: `omdSqrtNode` - A new, identical instance of the square root node.
### `highlightAll()`
Applies a highlight to the square root node itself and recursively highlights its `argument` node.
### `unhighlightAll()`
Removes the highlight from the square root node and recursively unhighlights its `argument` node.
### `toMathJSNode()`
Converts the `omdSqrtNode` back into its math.js AST representation. It creates a `FunctionNode` with `fn: 'sqrt'` and the converted `argument` AST.
- **Returns**: `object` - A math.js `FunctionNode` for the square root operation. The returned object also includes a `clone` method for compatibility.
### `toString()`
Converts the square root node to its string representation (e.g., `"sqrt(x+1)"`).
- **Returns**: `string`.
### `evaluate(variables)`
Evaluates the square root expression. It evaluates the `argument` and then calculates its square root.
- **`variables`** (`object`): A map of variable names to their numeric values.
- **Returns**: `number` - The evaluated square root, or `NaN` if the radicand cannot be evaluated or is negative.
### `isSquareRoot()`
Checks if the node represents a square root. Always returns `true` for `omdSqrtNode`.
- **Returns**: `boolean`.
### `isCubeRoot()`
Checks if the node represents a cube root. Always returns `false` for `omdSqrtNode`.
- **Returns**: `boolean`.
### `toPowerForm()`
Converts the square root node into an equivalent `omdPowerNode` representation (e.g., `sqrt(x)` becomes `x^(0.5)`).
- **Returns**: `omdPowerNode` - The equivalent power expression, or `null` if the `argument` is missing.
## Internal Methods
- **`parseValue()`**: Sets the `value` property to `"sqrt"`.
- **`createArgumentNode()`**: Creates an `omdNode` instance for the radicand from its AST, and adds it as a child.
- **`createRadicalElements()`**: Creates and initializes the `jsvgPath` for the radical symbol and the `jsvgLine` for the horizontal bar, adding them as children.
## Example
```javascript
import { omdSqrtNode } from '@teachinglab/omd';
import * as math from 'mathjs';
// Create from AST
const node = new omdSqrtNode({
type: 'FunctionNode',
fn: { name: 'sqrt' },
args: [ { type: 'SymbolNode', name: 'x' } ]
});
// Or from string
const node2 = omdSqrtNode.fromString('sqrt(x+1)');
// Render and layout
node.setFontSize(24);
node.initialize();
// Evaluate
const val = node.evaluate({ x: 9 }); // 3
// Convert to power form
const powerNode = node.toPowerForm(); // x^(1/2)
// Add to an SVG container to display
// const svgContainer = new jsvgContainer();
// svgContainer.addChild(node);
// document.body.appendChild(svgContainer.svgObject);
```
## See Also
- [`omdNode`](./omdNode.md) - The base class.
- [`omdPowerNode`](./omdPowerNode.md) - For power form (e.g., `x^(1/2)`).
- [`omdFunctionNode`](./omdFunctionNode.md) - For other mathematical functions.