OMD Documentation

OMD Shape Components

SVG geometry shapes rendered via the OMD library. All shapes are loaded with loadFromJSON() and passed to omdDisplay or omdCanvas.

import { omdRectangle } from '@teachinglab/omd';
const shape = new omdRectangle();
shape.loadFromJSON({ width: 5, height: 3, unitScale: 40, showLabels: true });

unitScale (pixels per unit) controls the rendered size. showLabels enables automatic dimension labels on all shapes.


rightTriangle

A right triangle with the right angle at the bottom-right vertex.

Name Type Required Default Description
horizontalLeg number yes* 5 Length of the bottom (horizontal) leg in units
verticalLeg number yes* 10 Length of the right (vertical) leg in units
unitScale number no 10 Pixels per unit
showLabels boolean no false Show leg length labels
angleA number no Angle A in degrees. If provided with hypotenuse, overrides horizontalLeg and verticalLeg
angleB number no Angle B in degrees (stored but not used for leg calculation)
hypotenuse number no Hypotenuse length. Used with angleA to derive leg lengths

* horizontalLeg and verticalLeg are required unless angleA + hypotenuse are provided instead.

Do not use width, height, or color fields.

import { omdRightTriangle } from '@teachinglab/omd';
const tri = new omdRightTriangle();
tri.loadFromJSON({ horizontalLeg: 6, verticalLeg: 8, unitScale: 30, showLabels: true });

isoscelesTriangle

An isosceles triangle with the apex centered above the base.

Name Type Required Default Description
base number yes 5 Length of the base in units
height number yes 10 Height of the triangle in units
unitScale number no 10 Pixels per unit
showLabels boolean no false Show side length labels
import { omdIsoscelesTriangle } from '@teachinglab/omd';
const tri = new omdIsoscelesTriangle();
tri.loadFromJSON({ base: 4, height: 6, unitScale: 40 });

rectangle

A rectangle with optional side labels, center label, and outside labels.

Name Type Required Default Description
width number yes 10 Width in units
height number yes 10 Height in units
unitScale number no 10 Pixels per unit
showLabels boolean no false Auto-label top and right sides with dimension values
labelMode 'edge' | 'side' no 'edge' 'edge' labels top + right; 'side' labels all four sides
sideLabels object no Override individual side labels: { top, right, bottom, left }
centerLabel string no '' Text rendered at the center of the rectangle
outsideTopLabel string no '' Text above the top edge (further out than the dimension label)
outsideBottomLabel string no '' Text below the bottom edge
outsideLeftLabel string no '' Text to the left of the left edge
outsideRightLabel string no '' Text to the right of the right edge
labelFontSize number no 12 Font size in pixels for all labels

Do not use a top-level color field.

import { omdRectangle } from '@teachinglab/omd';
const rect = new omdRectangle();
rect.loadFromJSON({
  width: 5,
  height: 3,
  unitScale: 40,
  showLabels: true,
  labelMode: 'side',
  centerLabel: 'A = 15',
  outsideTopLabel: 'base'
});

rectangularPrism

A 3D rectangular prism drawn in oblique projection with optional dimension annotations.

Name Type Required Default Description
length number yes 5 Length (front face width) in units
width number yes 3 Depth (side face width) in units
height number yes 4 Height in units
unitScale number no 18 Pixels per unit
showLabels boolean no false Auto-label length, width, and height with dimension values
sideLabels object no Override dimension labels: { length, width, height } (also accepts l, w, h shorthand)
lengthLabel string no '' Override the length dimension label text
widthLabel string no '' Override the width dimension label text
heightLabel string no '' Override the height dimension label text
insideLabel string no '' Text rendered below the front face (useful for volume expressions)
outsideTopLabel string no '' Text above the top face
showHiddenEdges boolean no true Render back edges as dashed lines
labelFontSize number no 12 Font size in pixels for all labels
import { omdRectangularPrism } from '@teachinglab/omd';
const prism = new omdRectangularPrism();
prism.loadFromJSON({
  length: 4,
  width: 2,
  height: 3,
  unitScale: 30,
  showLabels: true,
  insideLabel: 'V = 24 units³'
});

ellipse

An ellipse defined by horizontal and vertical radii.

Name Type Required Default Description
width number yes 10 Horizontal radius in units
height number yes 5 Vertical radius in units
unitScale number no 10 Pixels per unit
showLabels boolean no false Show a center label with dimensions (e.g. 4 × 2)
import { omdEllipse } from '@teachinglab/omd';
const ellipse = new omdEllipse();
ellipse.loadFromJSON({ width: 4, height: 2, unitScale: 35, showLabels: true });

circle

A circle with optional annotated points and segments between points.

Name Type Required Default Description
radius number yes 5 Radius in units
unitScale number no 10 Pixels per unit
showLabels boolean no false Show a labeled radius line when no points are defined
points array no [] Named points on the circle. Each item: { name, label, type: 'center' | 'circumference', angle }
segments array no [] Line segments between named points. Each item: { from, to, label, labelOffset, color }
pointRadius number no 4 Radius of point dots in pixels
annotationFontSize number no 16 Font size for point and segment labels

Point fields:

Field Description
name Identifier used by segments.from / segments.to
label Display text for the point (defaults to name if omitted)
type 'center' places the point at the origin; 'circumference' places it on the circle edge
angle Degrees from the positive x-axis (0 = right, 90 = up). Used when type is 'circumference'

Do not use a top-level color field.

import { omdCircle } from '@teachinglab/omd';
const circle = new omdCircle();
circle.loadFromJSON({
  radius: 4,
  unitScale: 35,
  points: [
    { name: 'O', type: 'center' },
    { name: 'A', type: 'circumference', angle: 0 },
    { name: 'B', type: 'circumference', angle: 90 }
  ],
  segments: [
    { from: 'O', to: 'A', label: 'r = 4' },
    { from: 'A', to: 'B', color: '#e03' }
  ]
});

angle

One or more rays from a shared vertex with arc markers and angle labels.

Name Type Required Default Description
rays array yes [{angle:0},{angle:55}] Array of ray objects. Each: { angle, length, label, labelDistance, color, strokeWidth }
angles array no [{from:0,to:1,label:'a°'}] Arc markers between rays. Each: { from, to, label, marker }
vertexLabel string no '' Label at the vertex point
rayLength number no 160 Default ray length in pixels
strokeColor string no 'black' Default stroke color for rays and arcs
strokeWidth number no 2 Default stroke width in pixels
arcRadius number no 42 Default arc marker radius in pixels
dotRadius number no 4 Radius of the vertex dot in pixels
fontSize number no 28 Font size for angle and ray labels

Ray fields:

Field Description
angle Direction in degrees. 0 points right, 90 points up, 180 points left
length Ray length in pixels (overrides rayLength for this ray)
label Label rendered at the ray tip
labelDistance Extra offset in pixels beyond the ray tip for the label
color Stroke color for this ray
strokeWidth Stroke width for this ray

Angle marker fields (angles array):

Field Description
from Ray index (number) or ray name/label string
to Ray index (number) or ray name/label string
label Text label for this angle
marker 'arc' (default), 'square' / 'right' for 90°, or 'full-circle'

Do not use width, height, or top-level color fields.

import { omdAngle } from '@teachinglab/omd';
const angle = new omdAngle();
angle.loadFromJSON({
  rays: [
    { angle: 0, label: 'B' },
    { angle: 50, label: 'A' }
  ],
  angles: [
    { from: 0, to: 1, label: '50°', marker: 'arc' }
  ],
  vertexLabel: 'C',
  arcRadius: 50
});

regularPolygon

A regular polygon centered in its viewbox, with an optional side-length label.

Name Type Required Default Description
numberOfSides number yes 5 Number of sides (must be 3 or greater)
radius number yes 5 Circumradius in units (center to vertex)
unitScale number no 10 Pixels per unit
showLabels boolean no false Show the computed side length on one side

Use numberOfSides, not sides.

import { omdRegularPolygon } from '@teachinglab/omd';
const hex = new omdRegularPolygon();
hex.loadFromJSON({ numberOfSides: 6, radius: 4, unitScale: 30, showLabels: true });
↑ Top