@brownnrl/geomlib 0.6.1 → 0.7.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://geomlib/./src/Colors.ts","webpack://geomlib/./src/Slate.ts","webpack://geomlib/./src/SlateAnimator.ts","webpack://geomlib/./src/SlateControls.ts","webpack://geomlib/./src/elements/Animations.ts","webpack://geomlib/./src/elements/Constructions.ts","webpack://geomlib/./src/elements/GeomElement.ts","webpack://geomlib/./src/elements/circle/CircleAnimations.ts","webpack://geomlib/./src/elements/circle/CircleConstructions.ts","webpack://geomlib/./src/elements/circle/CircleElement.ts","webpack://geomlib/./src/elements/circle/CircumcircleElement.ts","webpack://geomlib/./src/elements/circle/InvertCircleElement.ts","webpack://geomlib/./src/elements/circle/SphereIntersectionElement.ts","webpack://geomlib/./src/elements/line/Bichord.ts","webpack://geomlib/./src/elements/line/Chord.ts","webpack://geomlib/./src/elements/line/LineAnimations.ts","webpack://geomlib/./src/elements/line/LineConstructions.ts","webpack://geomlib/./src/elements/line/LineElement.ts","webpack://geomlib/./src/elements/line/Perpendicular.ts","webpack://geomlib/./src/elements/line/PlanePerpendicularLine.ts","webpack://geomlib/./src/elements/plane/ParallelPlane.ts","webpack://geomlib/./src/elements/plane/PerpendicularPlane.ts","webpack://geomlib/./src/elements/plane/PlaneConstructions.ts","webpack://geomlib/./src/elements/plane/PlaneElement.ts","webpack://geomlib/./src/elements/point/AngleDividerElement.ts","webpack://geomlib/./src/elements/point/CircleSlider.ts","webpack://geomlib/./src/elements/point/FixedPoint.ts","webpack://geomlib/./src/elements/point/Foot.ts","webpack://geomlib/./src/elements/point/HarmonicElement.ts","webpack://geomlib/./src/elements/point/Intersection.ts","webpack://geomlib/./src/elements/point/InvertPointElement.ts","webpack://geomlib/./src/elements/point/Layoff.ts","webpack://geomlib/./src/elements/point/LineSlider.ts","webpack://geomlib/./src/elements/point/MeanProportionalElement.ts","webpack://geomlib/./src/elements/point/Midpoint.ts","webpack://geomlib/./src/elements/point/PlaneFootElement.ts","webpack://geomlib/./src/elements/point/PlaneIntersection.ts","webpack://geomlib/./src/elements/point/PlaneSlider.ts","webpack://geomlib/./src/elements/point/PointAnimations.ts","webpack://geomlib/./src/elements/point/PointConstructions.ts","webpack://geomlib/./src/elements/point/PointElement.ts","webpack://geomlib/./src/elements/point/ProportionElement.ts","webpack://geomlib/./src/elements/point/SimilarElement.ts","webpack://geomlib/./src/elements/point/SphereSliderElement.ts","webpack://geomlib/./src/elements/polygon/ApplicationElement.ts","webpack://geomlib/./src/elements/polygon/PolygonAnimations.ts","webpack://geomlib/./src/elements/polygon/PolygonConstructions.ts","webpack://geomlib/./src/elements/polygon/PolygonElement.ts","webpack://geomlib/./src/elements/polygon/RegularPolygonElement.ts","webpack://geomlib/./src/elements/polyhedron/PolyhedronConstructions.ts","webpack://geomlib/./src/elements/polyhedron/PolyhedronElement.ts","webpack://geomlib/./src/elements/polyhedron/PrismElement.ts","webpack://geomlib/./src/elements/polyhedron/PyramidElement.ts","webpack://geomlib/./src/elements/sector/ArcElement.ts","webpack://geomlib/./src/elements/sector/SectorConstructions.ts","webpack://geomlib/./src/elements/sector/SectorElement.ts","webpack://geomlib/./src/elements/sphere/SphereConstructions.ts","webpack://geomlib/./src/elements/sphere/SphereElement.ts","webpack://geomlib/./src/index.ts","webpack://geomlib/./src/slideshow.ts","webpack://geomlib/webpack/bootstrap","webpack://geomlib/webpack/startup"],"sourcesContent":["/*----------------------------------------------------------------------+\n| Color parsing and manipulation. |\n| Matches the behavior of Java's Geometry.parseColor() exactly: |\n| 1. null / \"none\" / \"0\" / numeric 0 → null (transparent) |\n| 2. \"random\" → random pastel |\n| 3. \"background\" → bgcolor |\n| 4. \"brighter\" → brighter(bgcolor) |\n| 5. \"darker\" → darker(bgcolor) |\n| 6. Named color (13 names) → rgb string |\n| 7. Hex integer \"rrggbb\" → rgb string |\n| 8. HSB comma triple \"h,s,b\" → rgb string |\n| 9. Fallback → null |\n+----------------------------------------------------------------------*/\n\nexport const colors : {[colorName: string]: string} =\n{\n \"black\": \"rgb(0,0,0)\",\n \"blue\": \"rgb(0,0,255)\",\n \"cyan\": \"rgb(0,255,255)\",\n \"darkGray\": \"rgb(64,64,64)\",\n \"gray\": \"rgb(128,128,128)\",\n \"green\": \"rgb(0,255,0)\",\n \"lightGray\": \"rgb(192,192,192)\",\n \"magenta\": \"rgb(255,0,255)\",\n \"orange\": \"rgb(255,200,0)\",\n \"pink\": \"rgb(255,175,175)\",\n \"red\": \"rgb(255,0,0)\",\n \"white\": \"rgb(255,255,255)\",\n \"yellow\": \"rgb(255,255,0)\"\n};\n\nexport function parseColor(val: string | number, dfault: string, bgcolor: string) : string {\n // Handle numeric 0 (from IConstructionInfo where vertexColor: 0)\n if (val === 0) return null;\n // Handle null/undefined → use default\n if (val == null) return dfault;\n\n let str = String(val);\n // Transparent keywords\n if (str === \"none\" || str === \"0\" || str === \"\") return null;\n // Special keywords\n if (str === \"random\") return randomColor();\n if (str === \"background\") return bgcolor;\n if (str === \"brighter\") return brighter(bgcolor);\n if (str === \"darker\") return darker(bgcolor);\n // Named color lookup\n if (str in colors) return colors[str];\n // Hex color (e.g. \"ff0000\" or \"#ffe9cd\" → rgb(...))\n // Java does: new Color(Integer.parseInt(str, 16))\n // Also handle CSS #-prefixed hex which Java doesn't use but our\n // test pages do (e.g. background: '#ffe9cd')\n let hex = str.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]+$/.test(hex)) {\n let n = parseInt(hex, 16);\n if (!isNaN(n)) {\n let r = (n >> 16) & 0xFF;\n let g = (n >> 8) & 0xFF;\n let b = n & 0xFF;\n return `rgb(${r},${g},${b})`;\n }\n }\n // HSB comma triple (e.g. \"35,19,100\" → h=35/360, s=19/100, b=100/100)\n let parts = str.split(\",\");\n if (parts.length === 3) {\n let h = parseInt(parts[0]) / 360.0;\n let s = parseInt(parts[1]) / 100.0;\n let b = parseInt(parts[2]) / 100.0;\n if (!isNaN(h) && !isNaN(s) && !isNaN(b)) {\n let c = HSVtoRGB(h, s, b);\n return `rgb(${c.r},${c.g},${c.b})`;\n }\n }\n // Fallback — unrecognized\n return null;\n}\n\nexport function randomColor() : string {\n let c = HSVtoRGB(Math.random(), Math.random(), 1.0);\n return `rgb(${c.r},${c.g},${c.b})`;\n}\n\n// Java Color.brighter() — factor 0.7\n// Each component: if 0 → 3; elif < 3 → 3; else min(component/0.7, 255)\nexport function brighter(col: string) : string {\n let rgb = parseRGB(col);\n if (rgb == null) return col;\n let FACTOR = 0.7;\n let threshold = Math.ceil(1.0 / (1.0 - FACTOR)); // = 4\n let r = rgb.r === 0 ? threshold : Math.min(Math.floor(rgb.r / FACTOR), 255);\n let g = rgb.g === 0 ? threshold : Math.min(Math.floor(rgb.g / FACTOR), 255);\n let b = rgb.b === 0 ? threshold : Math.min(Math.floor(rgb.b / FACTOR), 255);\n if (r < threshold) r = threshold;\n if (g < threshold) g = threshold;\n if (b < threshold) b = threshold;\n return `rgb(${r},${g},${b})`;\n}\n\n// Java Color.darker() — factor 0.7\n// Each component: floor(component * 0.7)\nexport function darker(col: string) : string {\n let rgb = parseRGB(col);\n if (rgb == null) return col;\n let FACTOR = 0.7;\n let r = Math.floor(rgb.r * FACTOR);\n let g = Math.floor(rgb.g * FACTOR);\n let b = Math.floor(rgb.b * FACTOR);\n return `rgb(${r},${g},${b})`;\n}\n\n// Keep old names as aliases for backward compatibility with index.ts\nexport function lighten(col: string) : string {\n return brighter(col);\n}\n\nexport function darken(col: string) : string {\n return darker(col);\n}\n\n// Parse an rgb(...) string or hex color into {r, g, b} components.\n// Handles: \"rgb(r,g,b)\", \"#rrggbb\", \"rrggbb\", named colors, HSB triples\nfunction parseRGB(col: string) : {r: number, g: number, b: number} | null {\n if (col == null) return null;\n // rgb(r,g,b) format\n let m = col.match(/^rgb\\((\\d+),(\\d+),(\\d+)\\)$/);\n if (m) return {r: parseInt(m[1]), g: parseInt(m[2]), b: parseInt(m[3])};\n // Named color → resolve to rgb then re-parse\n if (col in colors) return parseRGB(colors[col]);\n // #rrggbb or rrggbb hex\n let hex = col.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{6}$/.test(hex)) {\n let n = parseInt(hex, 16);\n return {r: (n >> 16) & 0xFF, g: (n >> 8) & 0xFF, b: n & 0xFF};\n }\n // HSB comma triple — parse it to get RGB\n let parts = col.split(\",\");\n if (parts.length === 3) {\n let h = parseInt(parts[0]) / 360.0;\n let s = parseInt(parts[1]) / 100.0;\n let b = parseInt(parts[2]) / 100.0;\n if (!isNaN(h) && !isNaN(s) && !isNaN(b)) {\n return HSVtoRGB(h, s, b);\n }\n }\n return null;\n}\n\n// see https://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately\nfunction HSVtoRGB(h: number, s: number, v: number) : {r: number, g: number, b: number} {\n let r: number, g: number, b: number;\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n switch (i % 6) {\n case 0: r = v; g = t; b = p; break;\n case 1: r = q; g = v; b = p; break;\n case 2: r = p; g = v; b = t; break;\n case 3: r = p; g = q; b = v; break;\n case 4: r = t; g = p; b = v; break;\n case 5: r = v; g = p; b = q; break;\n }\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n}\n","import {GeomElement} from \"./elements/GeomElement\";\nimport {PlaneElement} from \"./elements/plane/PlaneElement\";\nimport {FixedPoint} from \"./elements/point/FixedPoint\";\nimport {AllConstructions, Construction, SortedParams, constructions, getConstructionName} from \"./elements/Constructions\";\nimport {PointElement} from \"./elements/point/PointElement\";\nimport {Canvas} from \"canvas\";\nimport {LineElement} from \"./elements/line/LineElement\";\nimport {ISlide, ISlideAnimation, IAnimationConfig} from \"./index\";\nimport {SlateAnimator} from \"./SlateAnimator\";\n\nexport type SlateCanvas = HTMLCanvasElement | Canvas;\n\nexport type ResolveJustification = (ref: string) => string | null | undefined;\n\nexport class Slate {\n\n protected _elements : GeomElement[];\n // Name aliases — secondary names that resolve to existing elements\n // without adding new ones to _elements. The original Geometry Applet\n // and Euclid's *Elements* refer to the same circle by every\n // permutation of its three named points (BCD ≡ CDB ≡ DBC ≡ …) and\n // to lines by either endpoint order (AB ≡ BA). Authors register\n // those equivalences here so the prose-side `{NAME}` shortcode can\n // light up the canonical element without needing a parallel\n // invisible duplicate per alias.\n private _aliases : Map<string, string> = new Map();\n // Optional slideshow walk-through; populated from init().slides.\n // Empty array means no presentation mode is available; SlateControls\n // skips the \"▶ Present\" button.\n private _slides : ISlide[] = [];\n // Consumer-supplied callback resolving a justification ref label\n // (e.g. \"I.Post.3\") to a URL. Returns null/undefined when the ref\n // isn't recognised, in which case the Presentation overlay renders\n // the ref as plain text. Undefined means no resolver was passed.\n private _resolveJustification : ResolveJustification | null = null;\n // Slide-transition animation config (rates, durations, modifiers).\n // The slate ships a default; init() merges in whatever the\n // consumer provides via IInitialization.animationConfig.\n private _animationConfig : IAnimationConfig = {};\n // The frame-driver. Lazy-created on first animateTo() so a\n // headless test slate that never animates doesn't allocate a\n // requestAnimationFrame loop.\n private _animator : SlateAnimator | null = null;\n // Ephemeral helper elements an animation can spawn for its\n // lifetime (compass arms, guide circles, straightedge bars).\n // Drawn on top of _elements in the same face → edge → vertex →\n // name order; never appear in lookupElement; cleared on\n // animator.cancel() as a safety net.\n private _ephemerals : GeomElement[] = [];\n protected _screen : PlaneElement;\n protected _pick : PointElement;\n protected _canvas : SlateCanvas;\n private _htmlCanvas : HTMLCanvasElement = null;\n protected _bgcolor : string;\n public inTest : boolean = false;\n private static numSlate : number = 0;\n private _itsNumSlate : number = -1;\n\n constructor(canvas: SlateCanvas) {\n Slate.numSlate += 1;\n this._itsNumSlate = Slate.numSlate;\n\n this._elements = [];\n if(canvas == null) {\n throw new TypeError(\"canvas cannot be null or undefined.\");\n }\n this._canvas = canvas;\n\n let screen_origin = new FixedPoint({x:0,y:0,z:0});\n screen_origin.name = \"screen_origin\";\n let screen_x = new FixedPoint({x:1,y:0,z:0});\n screen_x.name = \"screen_x\";\n let screen_y = new FixedPoint({x:0,y:1,z:0});\n screen_y.name = \"screen_y\";\n\n let screen = new PlaneElement({\n A: screen_origin,\n B: screen_x,\n C: screen_y\n });\n screen.name = \"screen\";\n screen.nameColor = null;\n screen.isScreen = true;\n this._screen = screen;\n this._pick = null;\n\n for(let e of [screen_origin, screen_x, screen_y, screen]) {\n e.nameColor = null;\n e.vertexColor = null;\n e.vertexHighlightColor = null;\n e.faceColor = null;\n e.faceHighlightColor = null;\n this._elements.push(e);\n }\n let slate = this;\n\n let cnv : HTMLCanvasElement = this._canvas as HTMLCanvasElement;\n this._htmlCanvas = cnv;\n\n if(this._htmlCanvas.addEventListener == null) return;\n\n // Pointer Events unify mouse / touch / stylus into one event model.\n // Setting touch-action: none here (rather than relying on\n // consumer-side CSS) tells the browser not to claim drag gestures\n // for scroll/zoom; calling setPointerCapture on pointerdown ensures\n // we keep getting move/up events even when the finger leaves the\n // canvas bounds. See issue #55 for the design rationale.\n this._htmlCanvas.style.touchAction = \"none\";\n\n // Only the primary pointer drives the drag pipeline for now.\n // Multi-touch (two-finger rotation etc.) is intentionally not yet\n // wired — design questions tracked in issue #57.\n let activePointerId: number | null = null;\n\n this._htmlCanvas.addEventListener(\"pointerdown\", (ev: PointerEvent) => {\n if (activePointerId !== null) return; // already tracking a primary\n activePointerId = ev.pointerId;\n try { slate._htmlCanvas.setPointerCapture(ev.pointerId); } catch (_) { /* ignore */ }\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDown(x, y);\n });\n\n this._htmlCanvas.addEventListener(\"pointermove\", (ev: PointerEvent) => {\n if (ev.pointerId !== activePointerId) return;\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDrag(x, y);\n });\n\n let endPointer = (ev: PointerEvent) => {\n if (ev.pointerId !== activePointerId) return;\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseUp(x, y);\n try { slate._htmlCanvas.releasePointerCapture(ev.pointerId); } catch (_) { /* ignore */ }\n activePointerId = null;\n };\n\n this._htmlCanvas.addEventListener(\"pointerup\", endPointer);\n this._htmlCanvas.addEventListener(\"pointercancel\", endPointer);\n this._htmlCanvas.addEventListener(\"lostpointercapture\", (ev: PointerEvent) => {\n if (ev.pointerId === activePointerId) {\n // Browser revoked capture (e.g., system gesture); clear pick state.\n if (slate._pick != null) {\n slate._pick = null;\n }\n activePointerId = null;\n }\n });\n\n }\n\n _getCanvasPosition(x: number, y: number) : [number, number] {\n let r = this._htmlCanvas.getBoundingClientRect();\n return [x - r.left,\n y - r.top];\n }\n\n _onMouseDown(x: number, y: number) {\n this._pick = null;\n this.movePick(x, y);\n };\n\n _onMouseUp(x: number, y: number) {\n if (this._pick == null) return;\n this.movePick(x, y);\n this._pick = null;\n };\n\n _onMouseDrag(x: number, y: number) {\n if (this._pick == null) return;\n this.movePick(x, y);\n };\n\n get elements() : GeomElement[] {\n return this._elements;\n }\n\n set bgcolor(value: string ) {\n this._bgcolor = value;\n }\n\n get bgcolor() : string {\n return this._bgcolor;\n }\n\n // Public accessor for the underlying canvas. Consumer-side code on\n // multi-canvas pages (e.g. the {NAME} shortcode on euclids-elements.org)\n // needs to compare DOM positions of each slate's canvas against the\n // prose-side <span> to pick the right slate. Was protected before\n // 0.4.0; the few prior callers (s.canvas in elem-ref-highlight.js)\n // were just reading undefined and falling through to a brute-force\n // walk of geomlib.slates.\n get canvas() : SlateCanvas {\n return this._canvas;\n }\n\n lookupElement(name: string) : GeomElement {\n for (let elem of this._elements) {\n if (elem.name == name) {\n return elem;\n }\n }\n // Direct miss — follow the alias map and look up the canonical\n // name. One hop only: we don't chase chains because aliases are\n // expected to point at real element names, not at each other.\n let canonical = this._aliases.get(name);\n if (canonical != null) {\n for (let elem of this._elements) {\n if (elem.name == canonical) return elem;\n }\n }\n return null;\n }\n\n // Register a single secondary name → canonical name mapping. Idempotent.\n // Called by init() when the user passes an `aliases` field.\n addAlias(from: string, to: string) : void {\n this._aliases.set(from, to);\n }\n\n addAliases(aliases: {[from: string]: string}) : void {\n for (let from in aliases) this._aliases.set(from, aliases[from]);\n }\n\n get slides() : ISlide[] {\n return this._slides;\n }\n\n set slides(value: ISlide[]) {\n this._slides = value || [];\n }\n\n get resolveJustification() : ResolveJustification | null {\n return this._resolveJustification;\n }\n\n set resolveJustification(value: ResolveJustification | null) {\n this._resolveJustification = value;\n }\n\n get animationConfig() : IAnimationConfig {\n return this._animationConfig;\n }\n\n set animationConfig(value: IAnimationConfig) {\n this._animationConfig = value || {};\n }\n\n get animator() : SlateAnimator | null {\n return this._animator;\n }\n\n get ephemerals() : GeomElement[] {\n return this._ephemerals;\n }\n\n addEphemeral(e: GeomElement) : void {\n this._ephemerals.push(e);\n }\n\n removeEphemeral(e: GeomElement) : void {\n const i = this._ephemerals.indexOf(e);\n if (i >= 0) this._ephemerals.splice(i, 1);\n }\n\n clearEphemerals() : void {\n this._ephemerals.length = 0;\n }\n\n // Lazy-create the animator on first use. Each slate owns at most\n // one — cancel() preserves it for re-use across slide transitions.\n private _ensureAnimator() : SlateAnimator {\n if (this._animator == null) {\n this._animator = new SlateAnimator(this);\n }\n return this._animator;\n }\n\n // Public entry point for slideshow controllers. Diff the current\n // visibility / highlight state against the target, run any slide-\n // listed animations against the elements becoming visible. Newly-\n // visible elements without an explicit animation entry pop in\n // instantly (4b parity). Returns a Promise that resolves when the\n // animator completes the run or cancel() is called.\n animateTo(\n targetVisible: Set<string>,\n targetHighlighted: Set<string>,\n slideAnimations: ISlideAnimation[],\n mode: \"cascade\" | \"parallel\",\n ) : Promise<void> {\n return this._ensureAnimator().run(\n targetVisible, targetHighlighted, slideAnimations, mode,\n );\n }\n\n // Hide every named element whose name is not in the supplied set.\n // Names not matching any element are silently ignored; elements\n // without a name (intermediate construction outputs) are left alone.\n // Screen-helper elements (screen / screen_origin / screen_x /\n // screen_y) follow the same rule: their visible flag does flip, but\n // since they're created with all-null colours they never draw\n // visible pixels anyway. Called by the presentation overlay per\n // slide; consumers can call directly too.\n setVisibleNames(names: string[]) : void {\n const visible = new Set(names);\n for (let elem of this._elements) {\n if (elem.name == null) continue;\n elem.visible = visible.has(elem.name);\n }\n }\n\n // Restore every element's visible flag to true. Counterpart to\n // setVisibleNames; called on presentation exit so the canvas\n // returns to its inline default.\n clearVisibility() : void {\n for (let elem of this._elements) elem.visible = true;\n }\n\n // Sort params into P[] (points), E[] (other elements), N[] (integers),\n // matching Java's selectDataChoice (Slate.java lines 344-393).\n // LineElements are expanded into their two endpoint PointElements.\n convertParams(params: any[]) : SortedParams {\n let P: PointElement[] = [];\n let E: GeomElement[] = [];\n let N: number[] = [];\n for(let param of params) {\n switch(typeof(param)) {\n case \"string\":\n let g : GeomElement = this.lookupElement(param);\n if ( g == null )\n throw new TypeError(`Element with name ${param} not found.`);\n if (g instanceof PointElement) {\n P.push(g);\n } else if (g instanceof LineElement) {\n // LineElement expands to two PointElements (matching Java)\n P.push(g.A);\n P.push(g.B);\n } else {\n E.push(g);\n }\n break;\n case \"number\":\n N.push(param);\n break;\n default:\n throw new TypeError(\"Expecting only named elements (strings) or numbers.\");\n }\n }\n return {P, E, N};\n }\n\n findConstruction(cm : AllConstructions, sp: SortedParams) : Construction {\n for(let c of constructions) {\n if(c.validateSignature(cm, sp)) {\n return c;\n }\n }\n return null;\n }\n\n createElement(cm : AllConstructions, params: any[], name?: string) : GeomElement {\n let sp : SortedParams = this.convertParams(params);\n let c : Construction = this.findConstruction(cm, sp);\n if(c == null) {\n let cName : String = getConstructionName(cm);\n if (name == null) {\n name = \"\";\n }\n throw new TypeError(`Construction not found for \"${name}\" ${cName} with params P=[${sp.P}] E=[${sp.E}] N=[${sp.N}]`);\n }\n let [gs, g] = c.construct(this._screen, sp.P, sp.E, sp.N);\n // Mark as preexisting if this element was already in _elements\n // before this construction (e.g., point;first returns an existing\n // PointElement). Preexisting elements are skipped during\n // rotate/translate to avoid double-movement.\n // (Java: Slate.java preexists[] array)\n if (this._elements.indexOf(g) !== -1) {\n g.preexists = true;\n }\n if(name != null)\n g.name = name;\n for (let elem of gs) {\n if (this._elements.indexOf(elem) == -1)\n this._elements.push(elem);\n }\n if(this._elements.indexOf(g) == -1)\n this._elements.push(g);\n return g;\n }\n\n reset() : void {\n for (let element of this._elements) {\n element.reset();\n }\n this.update();\n }\n\n update() : void {\n for(let element of this._elements) element.update();\n this.drawElements();\n }\n\n drawElements(): void {\n if(this.inTest) return;\n // we draw all the elements first\n let w = this._canvas.width;\n let h = this._canvas.height;\n let ctx : CanvasRenderingContext2D = this._canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.clearRect(0,0,w,h);\n ctx.fillStyle = this._bgcolor;\n ctx.fillRect(0,0,w,h);\n for(let element of this._elements) element.drawFace(this._canvas);\n for(let element of this._elements) element.drawEdge(this._canvas);\n for(let element of this._elements) element.drawVertex(this._canvas);\n // and then draw their names.\n for(let element of this._elements)\n element.drawName(this._canvas);\n // Ephemeral animation helpers render on top of the permanent\n // figure (compass arms, guide circles, straightedge bars).\n // Same face → edge → vertex → name pass order so a guide arc\n // overlays correctly without re-clearing the canvas.\n for(let e of this._ephemerals) e.drawFace(this._canvas);\n for(let e of this._ephemerals) e.drawEdge(this._canvas);\n for(let e of this._ephemerals) e.drawVertex(this._canvas);\n for(let e of this._ephemerals) e.drawName(this._canvas);\n }\n\n // Update coordinates starting with element[i+1], matching Java's\n // Slate.java updateCoordinates (lines 808-814). Only elements AFTER\n // the picked element are recomputed — elements before it are left\n // untouched to avoid reprojection artifacts after rotation.\n updateCoordinates(i : number) {\n for(++i; i < this._elements.length; i++) {\n if(!this._elements[i].defined())\n this._elements[i].reset();\n this._elements[i].update();\n }\n this.drawElements();\n }\n\n translateCoordinates(dx : number, dy: number) {\n // translate all non-preexisting elements\n // (Java: Slate.java line 819 — if (!preexists[i]) element[i].translate(...))\n for(let i = 0; i < this._elements.length; i++) {\n let elem = this._elements[i];\n if (!elem.preexists)\n elem.translate(dx, dy);\n }\n this.update();\n }\n\n closestVisiblePoint(elements : GeomElement[], p : PointElement, tolerance : number = 30) : PointElement {\n // Use 2D screen distance (x,y only, ignoring z) for picking,\n // matching the Java applet's movePick() at Slate.java:887-889.\n // The canvas is a 2D projection; a 3D point at (x,y,z) renders\n // at screen position (x,y) regardless of z.\n let screenDist2 = (a: PointElement, b: PointElement) =>\n (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);\n let sortedDistanceElements = elements\n .filter(e => e instanceof PointElement)\n .map(e => e as PointElement)\n .filter(e => e.vertexColor != null)\n .sort((a,b) => {\n let adcp = screenDist2(a, p);\n let bdcp = screenDist2(b, p);\n if(adcp < bdcp) {\n return -1;\n } else if (bdcp < adcp) {\n return 1;\n }\n return 0;\n });\n if (sortedDistanceElements.length == 0) return null;\n let bestDistPoint = sortedDistanceElements[0];\n if(Math.sqrt(screenDist2(bestDistPoint, p)) > tolerance) return null;\n return bestDistPoint;\n }\n\n private _getPick(c: number, d: number) : PointElement {\n if (this._pick != null) return this._pick;\n let currentPoint = new PointElement({x:c,y:d});\n let closestVisiblePoint = this.closestVisiblePoint(this._elements, currentPoint);\n if(closestVisiblePoint == null) return;\n this._pick = closestVisiblePoint;\n return this._pick;\n }\n\n // Set the pivot point for scene rotation.\n // Format: \"pointName\" or \"pointName,planeName\"\n // Without a plane, the pivot is set on the screen plane.\n // With a plane, the pivot is set on that plane (for 3D rotation).\n // (Java: Slate.java setPivot, lines 787-801)\n setPivot(param : string) : void {\n let parts = param.split(\",\");\n let pointName = parts[0].trim();\n let e : GeomElement = this.lookupElement(pointName);\n if (e == null || !(e instanceof PointElement)) return;\n let piv : PointElement = e as PointElement;\n\n if (parts.length > 1) {\n // \"A,xyplane\" — set pivot on a specific plane\n let planeName = parts[1].trim();\n let p : GeomElement = this.lookupElement(planeName);\n if (p == null || !(p instanceof PlaneElement)) return;\n (p as PlaneElement).pivot = piv;\n } else {\n // \"A\" — set pivot on screen plane\n piv._AP = this._screen;\n this._screen.pivot = piv;\n }\n }\n\n movePick(c: number, d: number) : void {\n if(this._getPick(c, d) == null) return;\n let picki = this._elements.indexOf(this._pick);\n\n let w : number = this._canvas.width;\n if (c < 0) c = 0;\n else if (c > w) c = w;\n let h : number = this._canvas.height;\n if (d < 0) d = 0;\n else if (d > h) d = h;\n if (Math.abs(c - this._pick.x) + Math.abs(d - this._pick.y) < 1.0) {\n return; // no motion\n }\n if ( this._pick.draggable ) {\n if(this._pick.drag(c,d)) {\n this.updateCoordinates(picki);\n } else {\n return;\n }\n } else if (this._pick.AP != null \n && this._pick.AP.pivot != null\n && this._pick.AP.pivot != this._pick) { // rotate around the pivot\n this.rotateCoordinates(c,d);\n } else {\n let dx = c - this._pick.x;\n let dy = d - this._pick.y;\n this.translateCoordinates(dx,dy);\n }\n this.drawElements();\n }\n\n rotateCoordinates(c : number, d : number) : void {\n // rotate space according to how pick goes around pivot in the plane\n let pick : PointElement = this._pick;\n let piv : PointElement = pick.AP.pivot;\n // compute old and new pick's 3D coordinates relative to the pivot\n let oldP : PointElement = PointElement.difference(pick,piv);\n let newx : number = c-piv.x;\n let newy : number = d-piv.y;\t\t//(newz is irrelevant)\n // find their 2D coordinates on the plane\n let S : PointElement = pick.AP.S;\n let T : PointElement = pick.AP.T;\n let olds : number = PointElement.dot(oldP,S);\n let oldt : number = PointElement.dot(oldP,T);\n let den : number = S.x * T.y - S.y * T.x;\n let news : number = (newx*T.y - newy*T.x)/den;\n let newt : number = (newy*S.x - newx*S.y)/den;\n // compute the scale&rotation factors\n den = olds*olds + oldt*oldt;\n let ac : number = (news*olds + newt*oldt)/den;\n let as : number = (newt*olds - news*oldt)/den;\n // Rotate all non-preexisting elements directly.\n // (Java: Slate.java line 843-845)\n for (let elem of this._elements) {\n if (!elem.preexists)\n elem.rotate(piv, ac, as);\n }\n // After direct rotation, recompute derived elements from their (now\n // rotated) parents. Java doesn't need this because element[] carries\n // duplicate entries for shared objects — a Layoff created by\n // line;extend and re-referenced by point;last appears at two indices,\n // one with preexists=false that gets rotated directly. TS dedupes\n // _elements, so a shared object marked preexists=true is skipped,\n // which means Layoff-style points backed by bare LineElement wrappers\n // would never get moved directly (bare LineElement.rotate is a no-op).\n // Running update() rebuilds them from their (rotated) parents, which\n // produces the same result because rotation is a linear operation\n // and Layoff.update() derives its position from parent coords.\n this.update();\n }\n\n}\n","// Slide-transition animator. Drives Animation.build() steps over\n// time via requestAnimationFrame, calling slate.drawElements() each\n// frame so the per-element drawProgress drives the partial geometry.\n// Cascade mode plays one step at a time in slide order; parallel\n// mode runs them all concurrently.\n//\n// Owned lazily by a Slate (created on first animateTo() call) and\n// reused across transitions; cancel() resolves the in-flight promise\n// and finalises every active step so a rapid Next/Prev sequence\n// preempts the previous animation cleanly.\n\nimport {Slate} from \"./Slate\";\nimport {findAnimation, IAnimationStep, Animation} from \"./elements/Animations\";\nimport {GeomElement} from \"./elements/GeomElement\";\nimport {ISlideAnimation} from \"./index\";\n\n// Wrapped step with mutable progress state. The animator manages\n// these; concrete Animations don't see them.\ninterface ActiveStep {\n step: IAnimationStep;\n elapsedMs: number;\n started: boolean;\n finalised: boolean;\n}\n\n// Wrapped per-target group of steps. Each ISlideAnimation entry maps\n// to one Group, and Animation.build() returns the inner step list.\n// Cascade mode runs groups in order; within a group, steps are always\n// sequential (an Animation that wants edge-then-fade returns 2 steps).\ninterface ActiveGroup {\n target: GeomElement;\n steps: ActiveStep[];\n currentIndex: number; // which step is in flight; advances as each finalises\n finishedAtMs?: number; // when the last step finalised (for cascadeGapMs pacing)\n}\n\n// Time source: performance.now() when available (monotonic, high-res,\n// unaffected by NTP adjustments and not subject to wall-clock skew).\n// Falls back to Date.now() in headless environments without\n// performance.now(). dt is computed from the diff between consecutive\n// frames and clamped (see MAX_DT_MS) so background-tab pauses or\n// long single-frame stalls don't cause the next frame to advance by\n// a multi-second jump — hardware with different refresh rates\n// (60 Hz / 120 Hz / 144 Hz) all see the same total wall-clock\n// duration because progress is dt-driven, not frame-count driven.\nconst HAS_RAF = (typeof requestAnimationFrame === \"function\");\nconst NOW: () => number = (typeof performance !== \"undefined\" && performance.now)\n ? () => performance.now()\n : () => Date.now();\n// Clamp per-frame dt. Prevents a backgrounded tab's accumulated\n// pause-time from collapsing an entire animation into one frame on\n// resume; also smooths very long single-frame stalls (e.g. GC pause).\n// 100 ms = 6 frames at 60 Hz worth of catch-up — enough for normal\n// jitter, small enough that a hidden tab resuming after 30 s doesn't\n// blink through 30 s of construction in one paint.\nconst MAX_DT_MS = 100;\n\n// Duration of the post-animation emphasis fade-out. Trims the visible\n// \"snap from 6 px to highlight thickness\" into a smooth taper so the\n// settle isn't jarring when the underlying element is also slide-\n// highlighted (the polygon ABC over the highlighted AB / AC / BC is\n// the canonical case).\nconst EMPHASIS_FADE_OUT_MS = 250;\n\nexport class SlateAnimator {\n private slate: Slate;\n // The currently-running set of groups. Empty when idle.\n private groups: ActiveGroup[] = [];\n private mode: \"cascade\" | \"parallel\" = \"cascade\";\n private resolveCurrent: (() => void) | null = null;\n // For cascade, this index points at the group currently playing.\n private cascadeIndex: number = 0;\n private rafId: number | null = null;\n private lastFrameMs: number = 0;\n // Emphasis fade-out phase tracking. After every group's last step\n // finalises, the animator enters this phase and ticks each target's\n // emphasisAmount from 1 → 0 over EMPHASIS_FADE_OUT_MS before\n // resolving the promise.\n private fadingOut: boolean = false;\n private fadeStartMs: number = 0;\n\n constructor(slate: Slate) {\n this.slate = slate;\n }\n\n // Public entry point. Cancels any in-flight run, computes the\n // diff between current state and the target, builds steps for\n // every slide-listed animation, kicks off the rAF loop, and\n // returns a promise that resolves when every step has finalised\n // (or cancel() is called).\n run(\n targetVisible: Set<string>,\n targetHighlighted: Set<string>,\n slideAnimations: ISlideAnimation[],\n mode: \"cascade\" | \"parallel\",\n ): Promise<void> {\n // Preempt any in-flight run so the new transition starts cleanly.\n if (this.groups.length > 0) this.cancel();\n\n // Build the new groups from the slide's animation list, in\n // array order. Newly-visible elements without an explicit\n // animation entry pop in instantly (4b parity) — handled by\n // the caller before invoking run().\n const groups: ActiveGroup[] = [];\n const config = this.slate.animationConfig || {};\n const speedMul = config.speedMultiplier != null ? config.speedMultiplier : 1;\n const reduced = config.reducedMotion === true || speedMul === 0;\n for (const entry of slideAnimations || []) {\n const target = this.slate.lookupElement(entry.elem);\n if (target == null) continue;\n const animation: Animation | null = findAnimation(entry.name);\n if (animation == null) continue;\n // Type guard: console.warn-and-skip when the animation's\n // elementType doesn't match the actual target class.\n if (!(target instanceof (animation.elementType as any))) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n \"[geomlib] animation '\" + animation.name +\n \"' targets \" + (animation.elementType as any).name +\n \" but element '\" + entry.elem + \"' is \" +\n (target.constructor as any).name +\n \" — falling back to instant\"\n );\n }\n target.drawProgress = 1;\n target.visible = true;\n continue;\n }\n const builtSteps: IAnimationStep[] = animation.build(target, this.slate, entry.args || {}) || [];\n // Compute each step's resolved duration per the precedence\n // chain: entry.durationMs > config.durations[name] >\n // config.rates[name] > step.durationMs (already populated\n // by build() from the animation's defaults).\n const resolvedSteps: ActiveStep[] = builtSteps.map(step => ({\n step: {\n ...step,\n durationMs: resolveDuration(\n step.durationMs,\n entry.durationMs,\n config.durations && config.durations[animation.name],\n ),\n },\n elapsedMs: 0,\n started: false,\n finalised: false,\n }));\n groups.push({ target, steps: resolvedSteps, currentIndex: 0 });\n }\n\n // Visibility / highlight target state always applies — the\n // animation only governs HOW newly-visible elements appear.\n // Apply hidden / highlighted state synchronously; visible flips\n // are deferred for elements being animated because their setup\n // hook decides what to do with them.\n const animatedTargets = new Set<GeomElement>(groups.map(g => g.target));\n for (const e of this.slate.elements) {\n if (e.name == null) continue;\n const willBeVisible = targetVisible.has(e.name);\n const willBeHighlighted = targetHighlighted.has(e.name);\n if (animatedTargets.has(e)) {\n // Animation owns the visible flag during its run.\n // Deferred reveal (#83): the target stays hidden until\n // its own first step starts — drawProgress only gates\n // the edge, so a pre-revealed target would render its\n // face fill and name label at full strength while\n // earlier cascade steps play. _startStep flips it\n // visible; finalise() restores the final state on\n // every exit path.\n e.shouldHighlight = willBeHighlighted;\n e.drawProgress = 0;\n e.visible = false;\n } else {\n // Instant flip — matches 4b behaviour.\n e.visible = willBeVisible;\n e.shouldHighlight = willBeHighlighted;\n e.drawProgress = 1;\n }\n }\n\n // Reduced motion / speedMultiplier 0 / no groups: fast path.\n // Finalise everything synchronously and return a resolved\n // promise so the controller can flip the caption immediately.\n if (reduced || groups.length === 0) {\n for (const g of groups) {\n for (const as of g.steps) {\n if (as.step.setup && !as.started) as.step.setup();\n as.step.finalise();\n as.finalised = true;\n }\n }\n this.slate.clearEphemerals();\n this.slate.drawElements();\n return Promise.resolve();\n }\n\n // Mark every animating target as emphasized so its render pops\n // over any slide-highlighted underlying elements that share a\n // path (e.g. the polygon ABC animating over highlighted lines\n // AB / AC / BC). Cleared in _allFinalised / cancel().\n for (const g of groups) {\n g.target.emphasized = true;\n }\n\n this.groups = groups;\n this.mode = mode;\n this.cascadeIndex = 0;\n this.lastFrameMs = NOW();\n return new Promise<void>(resolve => {\n this.resolveCurrent = resolve;\n this._kickoff();\n this._scheduleFrame();\n });\n }\n\n // Drop the during-animation emphasis bumps from every group target.\n // Called once on completion or cancel so the slide settles back\n // into its plain highlight / not-highlighted steady state.\n private _clearAnimatedEmphasis(): void {\n for (const g of this.groups) {\n g.target.emphasized = false;\n }\n }\n\n // Cancel any in-flight run: finalise every step that started, wipe\n // ephemerals as a safety net, resolve the pending promise.\n cancel(): void {\n if (this.groups.length === 0) return;\n for (const g of this.groups) {\n for (let i = 0; i < g.steps.length; i++) {\n const as = g.steps[i];\n if (as.finalised) continue;\n // Run setup if we never got to it, so finalise sees a\n // consistent post-setup state.\n if (as.step.setup && !as.started) {\n as.step.setup();\n as.started = true;\n }\n as.step.finalise();\n as.finalised = true;\n }\n }\n this._clearAnimatedEmphasis();\n this.slate.clearEphemerals();\n this.slate.drawElements();\n this.groups = [];\n this.fadingOut = false;\n if (this.rafId != null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this.rafId);\n }\n this.rafId = null;\n if (this.resolveCurrent) {\n this.resolveCurrent();\n this.resolveCurrent = null;\n }\n }\n\n // Fire any pending setup() hooks for the steps that are about to\n // tick on the very first frame.\n private _kickoff(): void {\n if (this.mode === \"cascade\") {\n this._startGroupIndex(0);\n } else {\n // Parallel: start the first step of every group at once.\n for (const g of this.groups) {\n this._startStep(g, 0);\n }\n }\n }\n\n private _startGroupIndex(idx: number): void {\n if (idx >= this.groups.length) return;\n this._startStep(this.groups[idx], 0);\n }\n\n private _startStep(g: ActiveGroup, stepIdx: number): void {\n if (stepIdx >= g.steps.length) return;\n const as = g.steps[stepIdx];\n if (as.started) return;\n // Deferred reveal (#83): the target was held invisible through\n // any earlier cascade steps; it appears the moment its own\n // first step begins. setup() runs after this, so an animation\n // that hides the target to render ephemeral proxies instead\n // can still do so.\n if (stepIdx === 0) g.target.visible = true;\n if (as.step.setup) as.step.setup();\n as.started = true;\n g.currentIndex = stepIdx;\n }\n\n private _scheduleFrame(): void {\n if (HAS_RAF) {\n this.rafId = requestAnimationFrame(now => this._frame(now));\n } else {\n // No rAF (tests, node): synthesize a frame ~16ms in the\n // future via setTimeout. Mocha tests stub this differently.\n const t = NOW() + 16;\n this.rafId = (setTimeout(() => this._frame(t), 16) as any);\n }\n }\n\n private _frame(nowMs: number): void {\n if (this.groups.length === 0) return;\n const config = this.slate.animationConfig || {};\n const speedMul = config.speedMultiplier != null ? config.speedMultiplier : 1;\n const cascadeGap = config.cascadeGapMs || 0;\n // Real elapsed wall-clock dt, clamped to MAX_DT_MS so a\n // backgrounded tab or long GC pause doesn't fast-forward\n // through the rest of the animation in a single frame.\n let rawDt = nowMs - this.lastFrameMs;\n if (rawDt < 0) rawDt = 0;\n if (rawDt > MAX_DT_MS) rawDt = MAX_DT_MS;\n const dt = rawDt * speedMul;\n this.lastFrameMs = nowMs;\n\n // Advance the active step(s).\n if (this.mode === \"cascade\") {\n this._tickCascade(dt, nowMs, cascadeGap);\n } else {\n this._tickParallel(dt, nowMs);\n }\n\n // Always redraw so partial geometry shows up. Ephemerals\n // drawn alongside permanent elements.\n this.slate.drawElements();\n\n // Once every step's tick has finalised, enter the fade-out\n // phase: tick each target's emphasisAmount from 1 → 0 over\n // EMPHASIS_FADE_OUT_MS, redrawing each frame. Only resolves\n // once the fade completes.\n if (this._allFinalised()) {\n if (!this.fadingOut) {\n this.fadingOut = true;\n this.fadeStartMs = nowMs;\n }\n const fadeElapsed = nowMs - this.fadeStartMs;\n const fp = fadeElapsed >= EMPHASIS_FADE_OUT_MS\n ? 1 : fadeElapsed / EMPHASIS_FADE_OUT_MS;\n const ea = 1 - fp;\n for (const g of this.groups) {\n g.target.emphasisAmount = ea;\n }\n this.slate.drawElements();\n if (fp >= 1) {\n this._clearAnimatedEmphasis();\n this.groups = [];\n this.fadingOut = false;\n this.rafId = null;\n if (this.resolveCurrent) {\n this.resolveCurrent();\n this.resolveCurrent = null;\n }\n return;\n }\n this._scheduleFrame();\n return;\n }\n this._scheduleFrame();\n }\n\n private _tickCascade(dt: number, nowMs: number, cascadeGap: number): void {\n // Advance the current cascade group's current step. When it\n // finalises, optionally wait cascadeGapMs before advancing\n // either to the next step in the same group or to the next\n // group's first step.\n while (this.cascadeIndex < this.groups.length) {\n const g = this.groups[this.cascadeIndex];\n const as = g.steps[g.currentIndex];\n if (!as) {\n this.cascadeIndex += 1;\n if (this.cascadeIndex < this.groups.length) {\n this._startStep(this.groups[this.cascadeIndex], 0);\n }\n continue;\n }\n // Honour cascadeGap between groups.\n if (as.finalised) {\n if (g.finishedAtMs == null) g.finishedAtMs = nowMs;\n if (nowMs - g.finishedAtMs < cascadeGap) return;\n // Advance.\n if (g.currentIndex + 1 < g.steps.length) {\n this._startStep(g, g.currentIndex + 1);\n } else {\n this.cascadeIndex += 1;\n if (this.cascadeIndex < this.groups.length) {\n this._startStep(this.groups[this.cascadeIndex], 0);\n }\n }\n continue;\n }\n // Tick this step.\n this._tickStep(g.target, as, dt, nowMs);\n return; // one step per frame in cascade mode\n }\n }\n\n private _tickParallel(dt: number, nowMs: number): void {\n for (const g of this.groups) {\n const as = g.steps[g.currentIndex];\n if (!as) continue;\n if (as.finalised) {\n if (g.currentIndex + 1 < g.steps.length) {\n this._startStep(g, g.currentIndex + 1);\n }\n continue;\n }\n this._tickStep(g.target, as, dt, nowMs);\n }\n }\n\n private _tickStep(target: GeomElement, as: ActiveStep, dt: number, nowMs: number): void {\n if (!as.started) {\n if (as.step.setup) as.step.setup();\n as.started = true;\n }\n as.elapsedMs += dt;\n const total = as.step.durationMs;\n let p = total > 0 ? as.elapsedMs / total : 1;\n if (p > 1) p = 1;\n if (p < 0) p = 0;\n as.step.tick(p, dt, as.elapsedMs);\n if (p >= 1) {\n as.step.finalise();\n as.finalised = true;\n }\n }\n\n private _allFinalised(): boolean {\n for (const g of this.groups) {\n for (const as of g.steps) {\n if (!as.finalised) return false;\n }\n }\n return true;\n }\n}\n\n// Resolution order, top-down, returning the first defined non-undefined.\nfunction resolveDuration(stepDefault: number, slideOverride?: number, configOverride?: number): number {\n if (slideOverride != null) return slideOverride;\n if (configOverride != null) return configOverride;\n return stepDefault;\n}\n","/*----------------------------------------------------------------------+\n| Title: SlateControls.ts |\n| UI overlay for geometry diagrams: reset, maximize, new window. |\n| Buttons are canvas-drawn icons overlaid on each Slate canvas. |\n| Keyboard shortcuts match the original Java applet: |\n| r / space → reset |\n| u / return → new window |\n| m → maximize/minimize |\n+----------------------------------------------------------------------*/\n\nimport {Slate} from \"./Slate\";\nimport {computeSlideState} from \"./slideshow\";\n\ninterface IInitConfig {\n background: string;\n title: string;\n align?: number;\n canvasid?: string;\n pivot?: string;\n elements: any[];\n}\n\n// Slate-controls icon sizing. The historical default is 20 px; touch\n// devices (coarse pointer) get a slightly tighter 15-px row per author\n// preference — small enough to stay out of the diagram, still hittable\n// with a fingertip.\nfunction isCoarsePointer(): boolean {\n return typeof window !== \"undefined\"\n && typeof window.matchMedia === \"function\"\n && window.matchMedia(\"(pointer: coarse)\").matches;\n}\nconst BTN_SIZE = isCoarsePointer() ? 18 : 20;\nconst BTN_GAP = isCoarsePointer() ? 4 : 4;\nconst BTN_MARGIN = isCoarsePointer() ? 7 : 8;\n\n// Minimal event-target interface so this helper is testable without a real\n// `Window`. Browser `Window`, `Document`, and `Element` all satisfy it.\nexport interface IResizeTarget {\n addEventListener(type: \"resize\", listener: () => void): void;\n removeEventListener(type: \"resize\", listener: () => void): void;\n}\n\n/**\n * Attach `callback` to the target's \"resize\" event. Returns a teardown\n * function that removes the listener — call it to stop tracking.\n */\nexport function trackWindowResize(target: IResizeTarget, callback: () => void): () => void {\n const handler = () => callback();\n target.addEventListener(\"resize\", handler);\n return () => target.removeEventListener(\"resize\", handler);\n}\n\nexport function createControls(slate: Slate, canvas: HTMLCanvasElement, config: IInitConfig): void {\n // Skip in headless/test environments\n if (!canvas.parentElement) return;\n\n let controls = new SlateControls(slate, canvas, config);\n controls.init();\n}\n\nclass SlateControls {\n private _slate: Slate;\n private _canvas: HTMLCanvasElement;\n private _config: IInitConfig;\n private _wrapper: HTMLDivElement;\n private _maximized: boolean = false;\n private _savedStyles: {\n wrapperPosition: string;\n wrapperTop: string;\n wrapperLeft: string;\n wrapperWidth: string;\n wrapperHeight: string;\n wrapperZIndex: string;\n wrapperBackground: string;\n canvasStyleWidth: string;\n canvasStyleHeight: string;\n canvasAttrWidth: number;\n canvasAttrHeight: number;\n } = null;\n private _stopTrackingResize: (() => void) | null = null;\n\n // Presentation-mode (slideshow) state. Caption + nav float over\n // the maximized canvas; no fullscreen overlay, no background takeover.\n private _presenting: boolean = false;\n private _presentationIndex: number = 0;\n private _presentationOverlay: HTMLDivElement | null = null;\n private _presentationCaption: HTMLDivElement | null = null;\n private _presentationJusts: HTMLDivElement | null = null;\n private _presentationCounter: HTMLSpanElement | null = null;\n private _presentationOnKey: ((e: KeyboardEvent) => void) | null = null;\n // Single-pin sticky for caption {NAME} refs: only one element may be\n // emphasized at a time. Clicking another ref clears the prior pin\n // before stickying the new one; hover is suppressed while a pin is\n // active so the sticky element stays the dominant one.\n private _stickyRefSpan: HTMLSpanElement | null = null;\n private _stickyRefElem: import(\"./elements/GeomElement\").GeomElement | null = null;\n\n constructor(slate: Slate, canvas: HTMLCanvasElement, config: IInitConfig) {\n this._slate = slate;\n this._canvas = canvas;\n this._config = config;\n }\n\n init(): void {\n this._wrapper = this.createWrapper();\n this.createButtons();\n this.addKeyboardShortcuts();\n }\n\n private createWrapper(): HTMLDivElement {\n let wrapper = document.createElement(\"div\");\n wrapper.style.position = \"relative\";\n wrapper.style.display = \"inline-block\";\n\n // Insert wrapper before canvas, then move canvas into it\n this._canvas.parentElement.insertBefore(wrapper, this._canvas);\n wrapper.appendChild(this._canvas);\n\n // Make canvas focusable for keyboard shortcuts\n this._canvas.setAttribute(\"tabindex\", \"0\");\n this._canvas.style.outline = \"none\"; // default no outline\n this._canvas.addEventListener(\"focus\", () => {\n this._canvas.style.outline = \"2px solid rgba(66,133,244,0.5)\";\n });\n this._canvas.addEventListener(\"blur\", () => {\n this._canvas.style.outline = \"none\";\n });\n\n return wrapper;\n }\n\n private createButtons(): void {\n let buttons = [\n { draw: drawResetIcon, action: () => this.onReset(), title: \"Reset (r)\" },\n { draw: drawMaximizeIcon, action: () => this.onMaximize(), title: \"Maximize (m)\" },\n { draw: drawNewWindowIcon, action: () => this.onNewWindow(), title: \"New Window (u)\" },\n ];\n\n // Conditionally append a \"▶ Present\" button when the slate\n // carries any slides. Slates without slides see the same\n // three-button row as before — backwards-compatible.\n if (this._slate.slides.length > 0) {\n buttons.push({\n draw: drawPresentIcon,\n action: () => this.onPresent(),\n title: \"Present (p)\",\n });\n }\n\n for (let i = 0; i < buttons.length; i++) {\n let btn = document.createElement(\"button\");\n btn.style.position = \"absolute\";\n btn.style.top = BTN_MARGIN + \"px\";\n btn.style.right = (BTN_MARGIN + i * (BTN_SIZE + BTN_GAP)) + \"px\";\n btn.style.width = BTN_SIZE + \"px\";\n btn.style.height = BTN_SIZE + \"px\";\n btn.style.padding = \"0\";\n btn.style.border = \"none\";\n btn.style.cursor = \"pointer\";\n btn.style.background = \"rgba(0,0,0,0.12)\";\n btn.style.borderRadius = \"3px\";\n btn.title = buttons[i].title;\n\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.background = \"rgba(0,0,0,0.3)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.background = \"rgba(0,0,0,0.12)\";\n });\n\n // Draw icon on a small canvas inside the button\n let iconCanvas = document.createElement(\"canvas\");\n iconCanvas.width = BTN_SIZE;\n iconCanvas.height = BTN_SIZE;\n iconCanvas.style.display = \"block\";\n let ctx = iconCanvas.getContext(\"2d\");\n buttons[i].draw(ctx, BTN_SIZE);\n btn.appendChild(iconCanvas);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n buttons[i].action();\n // Return focus to the main canvas after button click\n this._canvas.focus();\n });\n\n // Store reference for maximize icon swap\n if (i === 1) {\n (this as any)._maxBtn = btn;\n (this as any)._maxIconCanvas = iconCanvas;\n }\n\n this._wrapper.appendChild(btn);\n }\n }\n\n private addKeyboardShortcuts(): void {\n this._canvas.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n switch (e.key) {\n case \"r\":\n case \"R\":\n case \" \":\n e.preventDefault();\n this.onReset();\n break;\n case \"u\":\n case \"U\":\n case \"Enter\":\n e.preventDefault();\n this.onNewWindow();\n break;\n case \"m\":\n case \"M\":\n e.preventDefault();\n this.onMaximize();\n break;\n case \"p\":\n case \"P\":\n if (this._slate.slides.length > 0) {\n e.preventDefault();\n this.onPresent();\n }\n break;\n }\n });\n }\n\n private onReset(): void {\n this._slate.reset();\n }\n\n private onMaximize(): void {\n if (this._maximized) {\n this.minimize();\n } else {\n this.maximize();\n }\n }\n\n private maximize(): void {\n // Save current styles AND canvas width/height attributes. The attrs\n // are the canvas bitmap resolution; resizeAndRedraw() overwrites them\n // to match the maximized CSS size, so minimize() must restore them.\n this._savedStyles = {\n wrapperPosition: this._wrapper.style.position,\n wrapperTop: this._wrapper.style.top,\n wrapperLeft: this._wrapper.style.left,\n wrapperWidth: this._wrapper.style.width,\n wrapperHeight: this._wrapper.style.height,\n wrapperZIndex: this._wrapper.style.zIndex,\n wrapperBackground: this._wrapper.style.background,\n canvasStyleWidth: this._canvas.style.width,\n canvasStyleHeight: this._canvas.style.height,\n canvasAttrWidth: this._canvas.width,\n canvasAttrHeight: this._canvas.height,\n };\n\n // Maximize wrapper to fill viewport\n this._wrapper.style.position = \"fixed\";\n this._wrapper.style.top = \"0\";\n this._wrapper.style.left = \"0\";\n this._wrapper.style.width = \"100vw\";\n this._wrapper.style.height = \"100vh\";\n this._wrapper.style.zIndex = \"9999\";\n this._wrapper.style.background = \"white\";\n\n // Expand canvas to fill wrapper\n this._canvas.style.width = \"100%\";\n this._canvas.style.height = \"100%\";\n\n this.resizeAndRedraw();\n this._maximized = true;\n this.updateMaximizeIcon();\n\n // Track window resize so the canvas bitmap stays in sync with the\n // wrapper's 100vw × 100vh CSS size. Without this the bitmap stays\n // at its maximize-time dimensions while the CSS display follows\n // viewport changes, and the diagram visibly stretches/squishes.\n this._stopTrackingResize = trackWindowResize(window, () => this.resizeAndRedraw());\n }\n\n private minimize(): void {\n if (!this._savedStyles) return;\n\n // Stop tracking window resize before restoring saved layout.\n if (this._stopTrackingResize) {\n this._stopTrackingResize();\n this._stopTrackingResize = null;\n }\n\n // Restore saved styles\n this._wrapper.style.position = this._savedStyles.wrapperPosition;\n this._wrapper.style.top = this._savedStyles.wrapperTop;\n this._wrapper.style.left = this._savedStyles.wrapperLeft;\n this._wrapper.style.width = this._savedStyles.wrapperWidth;\n this._wrapper.style.height = this._savedStyles.wrapperHeight;\n this._wrapper.style.zIndex = this._savedStyles.wrapperZIndex;\n this._wrapper.style.background = this._savedStyles.wrapperBackground;\n\n this._canvas.style.width = this._savedStyles.canvasStyleWidth;\n this._canvas.style.height = this._savedStyles.canvasStyleHeight;\n\n // Restore the canvas bitmap resolution to match its pre-maximize\n // intrinsic size. Without this, the canvas keeps the enlarged\n // width/height attributes from the maximize pass and (when style\n // width/height are empty) falls back to those attrs for its CSS\n // size — leaving the diagram rendered full-width.\n this._canvas.width = this._savedStyles.canvasAttrWidth;\n this._canvas.height = this._savedStyles.canvasAttrHeight;\n\n this.resizeAndRedraw();\n this._maximized = false;\n this._savedStyles = null;\n this.updateMaximizeIcon();\n }\n\n private resizeAndRedraw(): void {\n // Sync canvas internal resolution to CSS size\n let w = this._canvas.clientWidth;\n let h = this._canvas.clientHeight;\n if (this._canvas.width !== w || this._canvas.height !== h) {\n this._canvas.width = w;\n this._canvas.height = h;\n }\n this._slate.update();\n }\n\n private updateMaximizeIcon(): void {\n let iconCanvas = (this as any)._maxIconCanvas as HTMLCanvasElement;\n let btn = (this as any)._maxBtn as HTMLButtonElement;\n if (!iconCanvas) return;\n let ctx = iconCanvas.getContext(\"2d\");\n ctx.clearRect(0, 0, BTN_SIZE, BTN_SIZE);\n if (this._maximized) {\n drawMinimizeIcon(ctx, BTN_SIZE);\n btn.title = \"Minimize (m)\";\n } else {\n drawMaximizeIcon(ctx, BTN_SIZE);\n btn.title = \"Maximize (m)\";\n }\n }\n\n private onNewWindow(): void {\n // Find the bundle.js script path from the current page\n let scripts = document.querySelectorAll(\"script[src]\");\n let bundleSrc = \"bundle.js\";\n for (let i = 0; i < scripts.length; i++) {\n let src = (scripts[i] as HTMLScriptElement).src;\n if (src.indexOf(\"bundle.js\") >= 0) {\n bundleSrc = src;\n break;\n }\n }\n\n // Override the config's canvasid so geomlib.init() targets the\n // new window's canvas (id=\"canvasId\"), not the source page's canvas\n // which doesn't exist in the new document. Without the override,\n // init() would look up this._config.canvasid (e.g. \"canvas_0\") in\n // the new document, get null, and throw in resizeCanvasToDisplaySize.\n let newWinConfig = Object.assign({}, this._config, { canvasid: \"canvasId\" });\n let configJSON = JSON.stringify(newWinConfig);\n let title = this._config.title || \"Geometry\";\n\n // Open maximized: use full screen dimensions, canvas fills viewport\n let html = `<!DOCTYPE html>\n<html><head><title>${title}</title></head>\n<body style=\"margin:0;padding:0;overflow:hidden;\">\n<canvas id=\"canvasId\" style=\"width:100vw;height:100vh;\"></canvas>\n<script src=\"${bundleSrc}\"><\\/script>\n<script>geomlib.init(${configJSON});<\\/script>\n</body></html>`;\n\n let newWin = window.open(\"\", \"_blank\");\n if (newWin) {\n newWin.document.write(html);\n newWin.document.close();\n }\n }\n\n // --- Presentation mode (slideshow) ---\n //\n // Opens the slate's slides as a step-through. The canvas itself\n // takes over the viewport via the existing maximize state (no\n // separate fullscreen overlay, no black takeover) — the caption\n // and nav controls float on top of the maximized canvas.\n\n private onPresent(): void {\n if (this._presenting) return;\n if (this._slate.slides.length === 0) return;\n if (!this._maximized) this.maximize();\n this.buildPresentationOverlay();\n this.bindPresentationKeys();\n this._presenting = true;\n this.showSlide(0);\n }\n\n private exitPresent(): void {\n if (!this._presenting) return;\n this.unbindPresentationKeys();\n this.clearStickyRef();\n this.removePresentationOverlay();\n this._slate.clearVisibility();\n for (let e of this._slate.elements) {\n e.shouldHighlight = false;\n e.emphasized = false;\n }\n this._slate.update();\n this._presenting = false;\n }\n\n private buildPresentationOverlay(): void {\n // Floating UI panel pinned to the bottom of the viewport.\n // Uses position: fixed and attaches to documentElement so it\n // can't be clipped by any wrapper, transformed parent, or\n // scrollable container — works the same on iOS Safari,\n // Samsung Internet, Android Chrome, and desktop. Solid white\n // (no transparency) so it's never mistaken for background;\n // bright box-shadow so the boundary reads.\n const overlay = document.createElement(\"div\");\n overlay.className = \"geomlib-presentation-overlay\";\n overlay.style.position = \"fixed\";\n overlay.style.left = \"0\";\n overlay.style.right = \"0\";\n overlay.style.bottom = \"0\";\n overlay.style.margin = \"0 auto\";\n // Span the bottom of the viewport so the centred contents\n // can't render off-screen and there's nowhere for the panel\n // to \"hide\". The actual visible chrome is the inner column.\n overlay.style.maxWidth = \"100vw\";\n overlay.style.background = \"#ffffff\";\n overlay.style.color = \"#222\";\n overlay.style.borderTop = \"1px solid rgba(0,0,0,0.18)\";\n overlay.style.boxShadow = \"0 -6px 18px rgba(0,0,0,0.18)\";\n overlay.style.padding = \"12px 16px calc(12px + env(safe-area-inset-bottom, 0px))\";\n // Max possible z-index so nothing can stack above us.\n overlay.style.zIndex = \"2147483647\";\n overlay.style.fontFamily = \"Georgia, 'Times New Roman', serif\";\n overlay.style.touchAction = \"manipulation\";\n overlay.style.boxSizing = \"border-box\";\n overlay.style.textAlign = \"center\";\n\n const caption = document.createElement(\"div\");\n caption.className = \"geomlib-presentation-caption\";\n caption.style.fontSize = \"1.1rem\";\n caption.style.lineHeight = \"1.45\";\n caption.style.textAlign = \"center\";\n caption.style.marginBottom = \"6px\";\n overlay.appendChild(caption);\n\n const justs = document.createElement(\"div\");\n justs.className = \"geomlib-presentation-justs\";\n justs.style.fontSize = \"0.85rem\";\n justs.style.textAlign = \"center\";\n justs.style.opacity = \"0.85\";\n justs.style.minHeight = \"1em\";\n justs.style.marginBottom = \"10px\";\n overlay.appendChild(justs);\n\n const nav = document.createElement(\"div\");\n nav.className = \"geomlib-presentation-nav\";\n nav.style.display = \"flex\";\n nav.style.gap = \"10px\";\n nav.style.alignItems = \"center\";\n nav.style.justifyContent = \"center\";\n\n const prevBtn = makePresentationButton(\"‹ Prev\");\n const counter = document.createElement(\"span\");\n counter.className = \"geomlib-presentation-counter\";\n counter.style.minWidth = \"56px\";\n counter.style.textAlign = \"center\";\n counter.style.opacity = \"0.7\";\n counter.style.fontSize = \"0.9rem\";\n const nextBtn = makePresentationButton(\"Next ›\");\n const exitBtn = makePresentationButton(\"✕ Exit\");\n exitBtn.style.marginLeft = \"16px\";\n\n prevBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.showSlide(this._presentationIndex - 1);\n });\n nextBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.showSlide(this._presentationIndex + 1);\n });\n exitBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.exitPresent();\n });\n\n nav.appendChild(prevBtn);\n nav.appendChild(counter);\n nav.appendChild(nextBtn);\n nav.appendChild(exitBtn);\n overlay.appendChild(nav);\n\n // Append to documentElement (html) — outside body — so a\n // mobile browser's odd body sizing can't clip us.\n document.documentElement.appendChild(overlay);\n this._presentationOverlay = overlay;\n this._presentationCaption = caption;\n this._presentationJusts = justs;\n this._presentationCounter = counter;\n }\n\n private removePresentationOverlay(): void {\n if (this._presentationOverlay && this._presentationOverlay.parentNode) {\n this._presentationOverlay.parentNode.removeChild(this._presentationOverlay);\n }\n this._presentationOverlay = null;\n this._presentationCaption = null;\n this._presentationJusts = null;\n this._presentationCounter = null;\n }\n\n private bindPresentationKeys(): void {\n const handler = (e: KeyboardEvent) => {\n if (!this._presenting) return;\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n this.showSlide(this._presentationIndex - 1);\n break;\n case \"ArrowRight\":\n case \" \":\n e.preventDefault();\n this.showSlide(this._presentationIndex + 1);\n break;\n case \"Escape\":\n e.preventDefault();\n this.exitPresent();\n break;\n }\n };\n this._presentationOnKey = handler;\n document.addEventListener(\"keydown\", handler);\n }\n\n private unbindPresentationKeys(): void {\n if (this._presentationOnKey) {\n document.removeEventListener(\"keydown\", this._presentationOnKey);\n this._presentationOnKey = null;\n }\n }\n\n private showSlide(index: number): void {\n const slides = this._slate.slides;\n if (slides.length === 0) return;\n const clamped = Math.max(0, Math.min(slides.length - 1, index));\n this._presentationIndex = clamped;\n\n const state = computeSlideState(this._slate, slides, clamped);\n // Drop any sticky pin from the previous slide — its span\n // belongs to the prior caption and is about to be replaced\n // anyway.\n this.clearStickyRef();\n\n const slide = slides[clamped];\n const transition = slide.transition;\n const animations = transition && transition.animations;\n const mode: \"cascade\" | \"parallel\" =\n (transition && transition.mode === \"parallel\") ? \"parallel\" : \"cascade\";\n // Clear per-element emphasis on every transition so a previous\n // slide's hover state doesn't carry forward.\n for (let e of this._slate.elements) e.emphasized = false;\n\n if (animations && animations.length > 0) {\n // Animated transition — slate.animateTo flips visibility +\n // highlight per-element and runs the configured Animation\n // for each entry. Newly-visible elements without an entry\n // pop in instantly (handled inside animateTo).\n this._slate.animateTo(state.visible, state.highlighted, animations, mode);\n } else {\n // Instant transition (4b behaviour) — flip every element\n // synchronously, no rAF loop.\n for (let e of this._slate.elements) {\n if (e.name == null) continue;\n e.visible = state.visible.has(e.name);\n e.shouldHighlight = state.highlighted.has(e.name);\n e.drawProgress = 1;\n }\n this._slate.update();\n }\n\n if (this._presentationCaption) {\n this.renderCaptionText(this._presentationCaption, slide.text || \"\");\n }\n if (this._presentationCounter) {\n this._presentationCounter.textContent = (clamped + 1) + \" / \" + slides.length;\n }\n if (this._presentationJusts) {\n this._presentationJusts.innerHTML = \"\";\n const resolve = this._slate.resolveJustification;\n if (slide.justifications) {\n for (let i = 0; i < slide.justifications.length; i++) {\n if (i > 0) {\n const sep = document.createElement(\"span\");\n sep.textContent = \" · \";\n sep.style.opacity = \"0.5\";\n this._presentationJusts.appendChild(sep);\n }\n const ref = slide.justifications[i].ref;\n const url = resolve ? resolve(ref) : null;\n if (url) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.textContent = ref;\n a.target = \"_blank\";\n a.rel = \"noopener\";\n a.style.color = \"#0066cc\";\n this._presentationJusts.appendChild(a);\n } else {\n const span = document.createElement(\"span\");\n span.textContent = ref;\n this._presentationJusts.appendChild(span);\n }\n }\n }\n }\n }\n\n // Parse {NAME} tokens in caption text and emit interactive bold-\n // italic spans for any that resolve to a slate element (alias\n // lookups included). Unknown / unresolved refs render as plain\n // text with the braces stripped. Hover / pointerdown toggles\n // element.emphasized so the figure picks the ref up with an\n // extra-thick gold stroke.\n private renderCaptionText(host: HTMLElement, text: string): void {\n host.innerHTML = \"\";\n const re = /\\{([A-Za-z][A-Za-z0-9'\\-]*)\\}/g;\n let lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n if (m.index > lastIndex) {\n host.appendChild(document.createTextNode(text.slice(lastIndex, m.index)));\n }\n const name = m[1];\n const elem = this._slate.lookupElement(name);\n if (elem) {\n host.appendChild(this.buildCaptionRef(name, elem));\n } else {\n // Unknown — render plain so a typo doesn't surface as\n // raw \"{XYZ}\" to the reader.\n host.appendChild(document.createTextNode(name));\n }\n lastIndex = m.index + m[0].length;\n }\n if (lastIndex < text.length) {\n host.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n }\n\n private buildCaptionRef(label: string, elem: import(\"./elements/GeomElement\").GeomElement): HTMLSpanElement {\n const span = document.createElement(\"span\");\n span.className = \"geomlib-presentation-ref\";\n span.textContent = label;\n span.style.fontWeight = \"700\";\n span.style.fontStyle = \"italic\";\n span.style.cursor = \"pointer\";\n span.style.borderBottom = \"1px dotted currentColor\";\n span.addEventListener(\"mouseenter\", () => {\n // Hover does nothing while a sticky pin is active — the\n // pinned element should remain the sole highlighted ref.\n if (this._stickyRefSpan != null) return;\n elem.emphasized = true;\n this._slate.update();\n });\n span.addEventListener(\"mouseleave\", () => {\n if (this._stickyRefSpan != null) return;\n elem.emphasized = false;\n this._slate.update();\n });\n span.addEventListener(\"pointerdown\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n const wasThis = this._stickyRefSpan === span;\n this.clearStickyRef();\n if (!wasThis) this.setStickyRef(span, elem);\n this._slate.update();\n });\n return span;\n }\n\n // Drop the active sticky pin (if any): release the pinned\n // element's emphasis flag and reset the span's visual state.\n private clearStickyRef(): void {\n if (this._stickyRefSpan != null) {\n this._stickyRefSpan.classList.remove(\"active\");\n this._stickyRefSpan.style.color = \"\";\n }\n if (this._stickyRefElem != null) {\n this._stickyRefElem.emphasized = false;\n }\n this._stickyRefSpan = null;\n this._stickyRefElem = null;\n }\n\n // Pin a new sticky ref. Call clearStickyRef() first if another\n // ref is currently pinned.\n private setStickyRef(span: HTMLSpanElement, elem: import(\"./elements/GeomElement\").GeomElement): void {\n span.classList.add(\"active\");\n span.style.color = \"#b08800\";\n elem.emphasized = true;\n this._stickyRefSpan = span;\n this._stickyRefElem = elem;\n }\n}\n\n// Button styling shared by the four nav buttons in the presentation\n// overlay. Matches the soft, light visual of the surrounding panel.\nfunction makePresentationButton(label: string): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.textContent = label;\n b.style.background = \"rgba(0,0,0,0.08)\";\n b.style.color = \"#222\";\n b.style.border = \"1px solid rgba(0,0,0,0.15)\";\n b.style.borderRadius = \"4px\";\n // Min 44px tap target per Apple HIG / Material guidance; the\n // wider padding also gives Pro Max thumbs some breathing room.\n b.style.padding = \"10px 16px\";\n b.style.minHeight = \"44px\";\n b.style.cursor = \"pointer\";\n b.style.fontFamily = \"inherit\";\n b.style.fontSize = \"1rem\";\n b.style.touchAction = \"manipulation\";\n b.addEventListener(\"mouseenter\", () => { b.style.background = \"rgba(0,0,0,0.16)\"; });\n b.addEventListener(\"mouseleave\", () => { b.style.background = \"rgba(0,0,0,0.08)\"; });\n return b;\n}\n\n// --- Icon drawing functions ---\n// All draw on a size×size canvas with 3px padding\n\nfunction drawResetIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let cx = size / 2;\n let cy = size / 2;\n let r = size * 0.32;\n let pad = 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Circular arc (270 degrees)\n ctx.beginPath();\n ctx.arc(cx, cy, r, -Math.PI * 0.5, Math.PI * 0.75);\n ctx.stroke();\n\n // Arrowhead at the end of the arc\n let endAngle = Math.PI * 0.75;\n let ax = cx + r * Math.cos(endAngle);\n let ay = cy + r * Math.sin(endAngle);\n let headLen = 4;\n let a1 = endAngle + Math.PI * 0.3;\n let a2 = endAngle + Math.PI * 0.9;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(ax + headLen * Math.cos(a1), ay + headLen * Math.sin(a1));\n ctx.lineTo(ax + headLen * Math.cos(a2), ay + headLen * Math.sin(a2));\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawMaximizeIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Top-right outward arrow\n let ax = pad + s * 0.55;\n let ay = pad + s * 0.45;\n let bx = pad + s;\n let by = pad;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n // Arrowhead\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx - 5, by);\n ctx.lineTo(bx, by + 5);\n ctx.closePath();\n ctx.fill();\n\n // Bottom-left outward arrow\n ax = pad + s * 0.45;\n ay = pad + s * 0.55;\n bx = pad;\n by = pad + s;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx + 5, by);\n ctx.lineTo(bx, by - 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawMinimizeIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Top-right inward arrow\n let ax = pad + s;\n let ay = pad;\n let bx = pad + s * 0.55;\n let by = pad + s * 0.45;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx + 5, by);\n ctx.lineTo(bx, by - 5);\n ctx.closePath();\n ctx.fill();\n\n // Bottom-left inward arrow\n ax = pad;\n ay = pad + s;\n bx = pad + s * 0.45;\n by = pad + s * 0.55;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx - 5, by);\n ctx.lineTo(bx, by + 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawNewWindowIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Small rectangle (the window)\n let rx = pad;\n let ry = pad + s * 0.3;\n let rw = s * 0.65;\n let rh = s * 0.7;\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Arrow pointing up-right out of the rectangle\n let arrowStartX = pad + s * 0.4;\n let arrowStartY = pad + s * 0.6;\n let arrowEndX = pad + s;\n let arrowEndY = pad;\n ctx.beginPath();\n ctx.moveTo(arrowStartX, arrowStartY);\n ctx.lineTo(arrowEndX, arrowEndY);\n ctx.stroke();\n\n // Arrowhead\n ctx.beginPath();\n ctx.moveTo(arrowEndX, arrowEndY);\n ctx.lineTo(arrowEndX - 5, arrowEndY);\n ctx.lineTo(arrowEndX, arrowEndY + 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawPresentIcon(ctx: CanvasRenderingContext2D, size: number): void {\n // Right-pointing play triangle, centred. The button is square so a\n // little leftward bias visually centres the optical mass.\n let pad = size * 0.28;\n let leftX = pad - 1;\n let rightX = size - pad + 2;\n let topY = pad;\n let bottomY = size - pad;\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.beginPath();\n ctx.moveTo(leftX, topY);\n ctx.lineTo(leftX, bottomY);\n ctx.lineTo(rightX, size / 2);\n ctx.closePath();\n ctx.fill();\n}\n","// Animation registry — parallel to Constructions but distinct purpose.\n//\n// A Construction builds an element once at init() time. An Animation\n// describes how to *reveal* that element when a slide transitions:\n// lines trace from one endpoint to the other, circles sweep an arc,\n// polygons trace edges in order then fade in the face. Multiple\n// animations can target the same element type — e.g. a Line might\n// be revealed via the shorthand A.Line.straightEdgeConnect (pencil\n// stroke A → B) or the long-form A.Line.compassTransfer (compass\n// walks a radius from another line then drops the straightedge).\n// Authors pick the right one per slide.\n//\n// Names follow the same `Type.method` shape as Constructions\n// (E.Line.connect ↔ A.Line.straightEdgeConnect). The enum value is\n// what authors pass; the human-readable name string is used for the\n// string-form fallback (param strings) + console.warn diagnostics.\n\nimport {GeomElement} from \"./GeomElement\";\nimport {Slate} from \"../Slate\";\n\n// Typed enum, parallel to AllConstructions. Numeric backing — typo-\n// safe at compile time and cheap to compare at runtime.\nexport enum AllAnimations {\n INSTANT,\n POINT_APPEAR,\n POINT_INTERSECT, // future\n LINE_STRAIGHT_EDGE_CONNECT,\n LINE_STRAIGHT_EDGE_EXTEND,\n LINE_COMPASS_TRANSFER, // future\n CIRCLE_COMPASS,\n CIRCLE_COMPASS_EXPLICIT, // future\n POLYGON_OUTLINE,\n POLYGON_OUTLINE_AND_FILL,\n}\n\n// Typed constants object, mirroring E for constructions. Authors\n// write `A.Circle.compass` instead of remembering the raw enum.\nexport const A = {\n Point: {\n appear: AllAnimations.POINT_APPEAR,\n intersect: AllAnimations.POINT_INTERSECT, // future\n },\n Line: {\n straightEdgeConnect: AllAnimations.LINE_STRAIGHT_EDGE_CONNECT,\n straightEdgeExtend: AllAnimations.LINE_STRAIGHT_EDGE_EXTEND,\n compassTransfer: AllAnimations.LINE_COMPASS_TRANSFER, // future\n },\n Circle: {\n compass: AllAnimations.CIRCLE_COMPASS,\n compassExplicit: AllAnimations.CIRCLE_COMPASS_EXPLICIT, // future\n },\n Polygon: {\n outline: AllAnimations.POLYGON_OUTLINE,\n outlineAndFill: AllAnimations.POLYGON_OUTLINE_AND_FILL,\n },\n instant: AllAnimations.INSTANT,\n};\n\n// One frame-driven step of an animation. An Animation.build() returns\n// an array of these; the SlateAnimator drives each step's progress\n// from 0 → 1 over its durationMs, then calls finalise().\nexport interface IAnimationStep {\n durationMs: number;\n\n // Setup hook fires once before the first tick. Used to hide the\n // target element (so visual proxies can render over its final\n // position without overlap) and to register ephemeral helper\n // elements via slate.addEphemeral.\n setup?: () => void;\n\n // Called each frame with progress ∈ [0, 1]. Typically sets\n // target.drawProgress = progress; richer animations may also tick\n // ephemeral helpers.\n tick: (progress: number, dtMs: number, totalMs: number) => void;\n\n // Called on cancel, skip, or normal completion. Animations MUST:\n // 1. Remove every ephemeral helper they added.\n // 2. Restore the target element to its final visible state\n // (target.visible = true, drawProgress = 1).\n finalise: () => void;\n}\n\n// Abstract base class for all animations. Concrete subclasses live in\n// the per-element-type sibling files (PointAnimations.ts,\n// LineAnimations.ts, CircleAnimations.ts, PolygonAnimations.ts).\nexport abstract class Animation {\n // Enum value the animation registers under. Mirrors Construction's\n // `constructionMethod: AllConstructions` field shape.\n public abstract animationMethod: AllAnimations;\n\n // Human-readable name in the same `Type.method` shape Construction\n // uses (\"Line.straightEdgeConnect\", \"Circle.compass\", …).\n public abstract name: string;\n\n // Element class the animation can animate. animateTo validates\n // the target before calling build(); a mismatch emits a\n // console.warn and falls through to Instant.\n public abstract elementType: Function;\n\n // Per-animation default duration AND rate. Whichever the slate's\n // animationConfig overrides wins. Null on both means build()\n // computes its own duration from geometry × default rate.\n public defaultDurationMs?: number;\n public defaultRate?: number;\n\n public abstract build(target: GeomElement, slate: Slate, args: any): IAnimationStep[];\n}\n\n// InstantAnimation — the registry's fallback. Used explicitly via\n// A.instant on a slide entry to suppress an inherited animation, or\n// implicitly when an unknown name lookup fails. Just finalises the\n// target to its full-rendered state.\nexport class InstantAnimation extends Animation {\n public animationMethod = AllAnimations.INSTANT;\n public name = \"instant\";\n public elementType = GeomElement;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [{\n durationMs: 0,\n tick: () => {},\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n }];\n }\n}\n\n// Module-level registry. Subclass files call registerAnimation(new X())\n// at import time so the registry is populated by the time any consumer\n// looks anything up.\nconst animationsByEnum: Map<AllAnimations, Animation> = new Map();\nconst animationsByName: Map<string, Animation> = new Map();\nconst warnedUnknown: Set<string> = new Set();\n\nexport function registerAnimation(a: Animation): void {\n animationsByEnum.set(a.animationMethod, a);\n animationsByName.set(a.name, a);\n}\n\n// Accepts either the enum value or the string name; returns the\n// registered Animation or null when the name doesn't resolve. An\n// unknown name emits a console.warn once per name across the slate's\n// lifetime so consumers see typos surfaced without log spam.\nexport function findAnimation(ref: AllAnimations | string): Animation | null {\n let a: Animation | undefined;\n if (typeof ref === \"string\") {\n a = animationsByName.get(ref);\n } else {\n a = animationsByEnum.get(ref);\n }\n if (a == null) {\n const key = String(ref);\n if (!warnedUnknown.has(key)) {\n warnedUnknown.add(key);\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[geomlib] unknown animation '\" + key + \"' — falling back to instant\");\n }\n }\n return null;\n }\n return a ?? null;\n}\n\n// Register the always-present Instant. Concrete animations in\n// PointAnimations.ts / LineAnimations.ts / … register themselves the\n// same way when their modules are imported.\nregisterAnimation(new InstantAnimation());\n","/*----------------------------------------------------------------------+\n| Title:\tConstructions.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {GeomElement} from \"./GeomElement\";\nimport {PlaneElement} from \"./plane/PlaneElement\";\nimport {PointElement} from \"./point/PointElement\";\n\nexport enum ConstructionTypes {\n Integer,\n PointElement,\n CircleElement,\n PlaneElement,\n SphereElement,\n PolygonElement,\n PolyhedronElement\n}\n\nexport enum PointConstructions {\n free = 1,\n midpoint = 2,\n intersection = 3,\n first = 4,\n last = 5,\n center = 6,\n lineSlider = 7,\n circleSlider = 8,\n circumcenter = 9,\n vertex = 10,\n foot = 11,\n cutoff = 12,\n extend = 13,\n parallelogram = 14,\n similar = 15,\n perpendicular = 16,\n proportion = 17,\n invert = 18,\n meanProportional = 19,\n planeSlider = 20,\n sphereSlider = 21,\n angleBisector = 22,\n angleDivider = 23,\n fixed = 24,\n lineSegmentSlider = 25,\n harmonic = 26\n}\n\nexport enum LineConstructions {\n connect = 101,\n angleBisector = 102,\n angleDivider = 103,\n foot = 104,\n chord = 105,\n bichord = 106,\n perpendicular = 107,\n cutoff = 108,\n extend = 109,\n parallel = 110,\n similar = 111,\n proportion = 112,\n meanProportional = 113\n}\n\n\nexport enum CircleConstructions {\n radius = 201,\n circumcircle = 202,\n invert = 203,\n intersection = 204\n}\n\n\nexport enum PolygonConstructions {\n square = 301,\n triangle = 302,\n quadrilateral = 303,\n pentagon = 304,\n hexagon = 305,\n equilateralTriangle = 306,\n parallelogram = 307,\n regularPolygon = 308,\n starPolygon = 309,\n similar = 310,\n application = 311,\n octagon = 312,\n face = 313\n}\n\nexport enum SectorConstructions {\n sector = 401,\n arc = 402\n}\n\nexport enum PlaneConstructions {\n threePoints = 501,\n perpendicular = 502,\n parallel = 503,\n ambient = 504\n}\n\nexport enum SphereConstructions {\n radius = 601\n}\n\nexport enum PolyhedraConstructions {\n tetrahedron = 701,\n parallelepiped = 702,\n prism = 703,\n pyramid = 704\n}\n\nexport function getConstructionName(cm: AllConstructions) : String {\n if(cm < 100) {\n return \"Point.\" + PointConstructions[cm];\n } else if (100 < cm && cm < 200) {\n return \"Line.\" + LineConstructions[cm];\n } else if (300 < cm && cm < 400) {\n return \"Polygon.\" + PolygonConstructions[cm];\n } else if (400 < cm && cm < 500) {\n return \"Sector.\" + SectorConstructions[cm];\n } else if (500 < cm && cm < 600) {\n return \"Plane.\" + PlaneConstructions[cm];\n } else if (600 < cm && cm < 700) {\n return \"Sphere.\" + SphereConstructions[cm];\n } else if (700 < cm && cm < 800) {\n return \"Polyhedra.\" + PolyhedraConstructions[cm];\n }\n\n return \"<Not Valid Construction>\";\n}\n\nexport var E = {\n Point : PointConstructions,\n Line : LineConstructions,\n Circle: CircleConstructions,\n Polygon: PolygonConstructions,\n Sector: SectorConstructions,\n Plane: PlaneConstructions,\n Sphere: SphereConstructions,\n Polyhedra: PolyhedraConstructions\n};\n\nexport type AllConstructions =\n PointConstructions |\n LineConstructions |\n CircleConstructions |\n PlaneConstructions |\n PolygonConstructions |\n SectorConstructions |\n SphereConstructions |\n PolyhedraConstructions;\n\nexport type GeomElementsForUpdate = GeomElement[];\n\n// Type-sorted parameter arrays, matching Java's P[]/E[]/N[] dispatch.\n// P = PointElements (including LineElement endpoint expansions)\n// E = all other elements (Circle, Plane, Sphere, Polygon, Polyhedron)\n// N = integers (numbers)\nexport interface SortedParams {\n P: PointElement[];\n E: GeomElement[];\n N: number[];\n}\n\nexport interface ConstructionSignature {\n points: number;\n elements: number;\n integers: number;\n elementTypes?: Function[];\n}\n\nexport abstract class Construction {\n public abstract constructionMethod : AllConstructions;\n // Signature: type counts + element subtype list for E[] entries.\n // e.g. { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] }\n public abstract signature: ConstructionSignature;\n\n public abstract construct(screen: PlaneElement, P: PointElement[],\n E: GeomElement[], N: number[]) : [GeomElementsForUpdate, GeomElement];\n\n // Match by counting types (matching Java's selectDataChoice).\n // Position-independent: \"E,Vplane,D,B\" and \"E,D,B,Vplane\" both match\n // { points: 3, elements: 1, elementTypes: [PlaneElement] }.\n public validateSignature(cm: AllConstructions, sp: SortedParams) : boolean {\n if (cm != this.constructionMethod) return false;\n let sig = this.signature;\n if (sig.points !== sp.P.length) return false;\n if (sig.elements !== sp.E.length) return false;\n if (sig.integers !== sp.N.length) return false;\n // Check element subtypes if specified\n if (sig.elementTypes) {\n for (let i = 0; i < sig.elementTypes.length; i++) {\n if (!(sp.E[i] instanceof sig.elementTypes[i])) return false;\n }\n }\n return true;\n }\n}\n\n/***********************************************************************\n * Construction classes — organized by element type. *\n * Each type's constructions live in their own package file and export *\n * a pre-built Construction[] array. *\n * *\n * Point — point/PointConstructions.ts *\n * (also contains CircumcircleConstruction) *\n * Line — line/LineConstructions.ts *\n * Circle — circle/CircleConstructions.ts *\n * Polygon — polygon/PolygonConstructions.ts *\n * Sector — sector/SectorConstructions.ts *\n * Plane — plane/PlaneConstructions.ts *\n * Sphere — sphere/SphereConstructions.ts *\n * Polyhedron — polyhedron/PolyhedronConstructions.ts *\n ***********************************************************************/\n\nimport {pointConstructions} from \"./point/PointConstructions\";\nimport {lineConstructions} from \"./line/LineConstructions\";\nimport {circleConstructions} from \"./circle/CircleConstructions\";\nimport {polygonConstructions} from \"./polygon/PolygonConstructions\";\nimport {sectorConstructions} from \"./sector/SectorConstructions\";\nimport {planeConstructions} from \"./plane/PlaneConstructions\";\nimport {sphereConstructions} from \"./sphere/SphereConstructions\";\nimport {polyhedronConstructions} from \"./polyhedron/PolyhedronConstructions\";\n\n\nexport const constructions: Construction[] = [\n ...pointConstructions,\n ...lineConstructions,\n ...circleConstructions,\n ...sectorConstructions,\n ...polygonConstructions,\n ...planeConstructions,\n ...sphereConstructions,\n ...polyhedronConstructions,\n];\n","/*----------------------------------------------------------------------+\n| Title:\tGeomElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./point/PointElement\"\nimport {SlateCanvas} from \"../Slate\";\n\nexport enum Align {\n CENTRAL,\n LEFT,\n RIGHT,\n ABOVE,\n BELOW\n}\n\nexport abstract class GeomElement {\n\n constructor() {\n }\n\n protected _name: string;\n // True for elements that are references to existing elements (e.g.,\n // point;first returns P[0], point;vertex returns polygon.V[n-1]).\n // Preexisting elements are skipped during rotate/translate to avoid\n // double-movement. Matches Java's preexists[] array in Slate.java.\n public preexists: boolean = false;\n // All colors default to null (transparent) — matching Java's Element.java.\n // Named elements get their colors assigned by init() in index.ts, which\n // computes type-appropriate defaults. Internal/intermediate elements\n // created inside constructions stay null (invisible) unless explicitly set.\n private _nameColor: string = null;\n protected _vertexColor : string = null;\n private _edgeColor : string = null;\n private _faceColor : string = null;\n\n // Highlight defaults pick high-contrast values that read on the typical\n // cream / white backgrounds the library is used against. The previous\n // edge/vertex default of white was invisible on the Elements site's\n // theorem-box background (HSB 35,19,100 ≈ #FFE9CD). Web \"gold\"\n // (#FFD700) is brighter / more saturated than Material amber and\n // still reads against both cream and white.\n private _nameHighlightColor : string = '#FFD700';\n private _vertexHighlightColor : string = '#FFD700';\n private _edgeHighlightColor : string = '#FFD700';\n private _faceHighlightColor : string = '#FFD700';\n\n // Default matches Java: Font(\"TimesRoman\", Font.ITALIC, 18)\n protected static _font : string = \"italic 18px Times New Roman\";\n\n static setFont(fontName: string, fontSize: number): void {\n GeomElement._font = `italic ${fontSize}px ${fontName}`;\n }\n\n private _draggable : boolean;\n private _dimension : number;\n private _align : Align;\n\n private _shouldHighlight : boolean = false;\n // Per-element visibility flag honoured by every draw method. Default\n // true preserves existing consumer behaviour; flipping false makes\n // drawFace / drawEdge / drawVertex / drawName early-return so the\n // element disappears without being removed from _elements (so\n // dependents that read its coordinates still work). Used by\n // Slate.setVisibleNames + the slideshow Presentation overlay.\n private _visible : boolean = true;\n // One step above shouldHighlight: when the slideshow caption's\n // {NAME} ref is hovered or clicked, the matching element flips to\n // emphasized. drawEdge / drawVertex paint with the highlight colour\n // at an even thicker stroke / larger dot so the element pops out\n // from any other already-highlighted ones on the slide. Released on\n // mouseleave (or click-to-toggle for sticky).\n // Emphasis amount in [0, 1]. Boolean emphasized is a thin shim\n // that toggles between 0 and 1; the SlateAnimator fades the\n // amount smoothly from 1 → 0 after an animation finishes so the\n // visible \"shrink back to highlight thickness\" feels less jarring\n // when the underlying element is also slide-highlighted (e.g.\n // ABC polygon edges over the highlighted AB / AC / BC).\n private _emphasisAmount : number = 0;\n // Animation progress for the next slide-transition render. 1 means\n // \"fully drawn\" (the default and the existing behaviour). Values in\n // [0, 1) tell per-type draw methods to render a partial geometry —\n // a half-traced line, a 30° sweep of an arc, the first edge of a\n // polygon plus a fraction of the next. Driven by Animation\n // subclasses through SlateAnimator during slide transitions; flips\n // back to 1 on each animation's finalise() so the canvas returns\n // to the fully-rendered state when the transition completes or is\n // cancelled.\n private _drawProgress : number = 1;\n protected _pixelTolerance : number = 50;\n\n protected _getTextMetrics(ctx: CanvasRenderingContext2D, txt: string) : [number, number] {\n let textMetrics = ctx.measureText(txt);\n let w = textMetrics.width;\n // Use actual font metrics for height; fall back to ascent-based estimate\n let h = (textMetrics.actualBoundingBoxAscent != null)\n ? textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent\n : 16;\n return [w, h];\n }\n\n drawString(ix : number, iy : number, c: SlateCanvas, overrideAlign? : Align) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n if(this._nameColor == null) return;\n ctx.font = GeomElement._font;\n ctx.fillStyle = this._nameColor;\n let [w, h] = this._getTextMetrics(ctx, this._name);\n\n switch (overrideAlign || this._align) {\n case Align.LEFT:\n ix = ix - w - 6;\n iy = iy + h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.RIGHT:\n ix += 2;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.ABOVE:\n ix -= w/2;\n iy += -h/2 + 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.BELOW:\n ix -= w/2;\n iy += h/2 + 6;\n ctx.fillText(this._name, ix, iy);\n return;\n }\n // compute (dx,dy) coordinates relative to center of canvas\n // and normalized\n let cw = c.width;\n let ch = c.height;\n let dx = (ix - cw/2) * ch;\n let dy = (iy - ch/2) * cw;\n if (dy > dx) {\n if (dy >= -dx)\t// put name below\n {\n ix -= w/2;\n iy += h/2 + 6;\n ctx.fillText(this._name, ix, iy);\n }\n else \t\t// put name left\n {\n ix = ix - w - 6;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n }\n }\n else {\n if (dy >= -dx) {\t// put name right\n ix += 2;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n } else { \t\t// put name above\n ix -= w/2;\n iy += -h/2 + 4;\n ctx.fillText(this._name, ix, iy);\n }\n }\n }\n\n public get name() {\n return this._name;\n }\n\n public set name(n : string) {\n this._name = n;\n }\n\n public abstract update() : void;\n public reset() { this.update(); }\n public defined() : boolean { return false; }\n public drag(tox: number, toy: number) : boolean { return false; }\n // drag returns true when the element is actually dragged\n public abstract translate(dx: number, dy: number) : void;\n public abstract rotate(pivot : PointElement, ac : number, as: number) : void;\n public abstract drawName(c: SlateCanvas) : void;\n public abstract drawFace(c: SlateCanvas) : void;\n public abstract drawEdge(c: SlateCanvas) : void;\n public abstract drawVertex(c: SlateCanvas) : void;\n\n set nameColor(value: string) {\n this._nameColor = value;\n }\n\n set edgeColor(value: string) {\n this._edgeColor = value;\n }\n\n set faceColor(value: string) {\n this._faceColor = value;\n }\n\n set nameHighlightColor(value: string) {\n this._nameHighlightColor = value;\n }\n\n set vertexHighlightColor(value: string) {\n this._vertexHighlightColor = value;\n }\n\n set edgeHighlightColor(value: string) {\n this._edgeHighlightColor = value;\n }\n\n set faceHighlightColor(value: string) {\n this._faceHighlightColor = value;\n }\n\n set draggable(value: boolean) {\n this._draggable = value;\n }\n\n set dimension(value: number) {\n this._dimension = value;\n }\n\n set align(value: Align) {\n this._align = value;\n }\n\n set shouldHighlight(value: boolean) {\n this._shouldHighlight = value;\n }\n\n set visible(value: boolean) {\n this._visible = value;\n }\n\n set emphasized(value: boolean) {\n this._emphasisAmount = value ? 1 : 0;\n }\n\n set emphasisAmount(value: number) {\n this._emphasisAmount = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n\n set drawProgress(value: number) {\n // Clamp to [0, 1] — out-of-range values would push the partial\n // geometry past either endpoint, which is never what callers\n // mean. Animations tick this in [0, 1] and finalise to 1.\n this._drawProgress = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n\n get nameColor(): string {\n return this._nameColor;\n }\n\n get vertexColor(): string {\n return this._vertexColor;\n }\n\n set vertexColor(c : string) {\n this._vertexColor = c;\n }\n\n get edgeColor(): string {\n return this._edgeColor;\n }\n\n get faceColor(): string {\n return this._faceColor;\n }\n\n get nameHighlightColor(): string {\n return this._nameHighlightColor;\n }\n\n get vertexHighlightColor(): string {\n return this._vertexHighlightColor;\n }\n\n get edgeHighlightColor(): string {\n return this._edgeHighlightColor;\n }\n\n get faceHighlightColor(): string {\n return this._faceHighlightColor;\n }\n\n get draggable(): boolean {\n return this._draggable;\n }\n\n get dimension(): number {\n return this._dimension;\n }\n\n get align(): Align {\n return this._align;\n }\n\n get shouldHighlight(): boolean {\n return this._shouldHighlight;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n get emphasized(): boolean {\n return this._emphasisAmount > 0;\n }\n\n get emphasisAmount(): number {\n return this._emphasisAmount;\n }\n\n get drawProgress(): number {\n return this._drawProgress;\n }\n}\n","// Animations targeting CircleElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {CircleElement} from \"./CircleElement\";\n\n// Default sweep rate in radians/ms. Calibrated for unhurried teaching:\n// a full circle (2π) draws in ≈ 2 seconds at 0.003 rad/ms. Authors who\n// want a faster compass raise the rate via\n// slate.animationConfig.rates[\"Circle.compass\"].\nconst DEFAULT_ARC_RATE_RAD_PER_MS = 0.003;\n\n// A.Circle.compass — anchor at centre, pick up the pencil at the\n// radius-defining point B, sweep 2π back to the start. Args:\n// { startAngle?: number } — default is computed from the angle from\n// centre to B so the trace begins where a real compass would.\n//\n// Strict two-step sequence (mirrors A.Polygon.outlineAndFill):\n// 1. Edge sweep: drawProgress 0 → 1 over 2π / rate.\n// 2. Face fade-in: faceAlpha 0 → 1 over ~half the sweep duration.\n// The edge stays fully drawn through step 2 because drawProgress\n// finalises to 1 before the fade-in starts, and faceAlpha is the\n// independent driver for drawFace's globalAlpha.\nconst DEFAULT_CIRCLE_FILL_MS = 600;\nexport class CircleCompassAnimation extends Animation {\n public animationMethod = AllAnimations.CIRCLE_COMPASS;\n public name = \"Circle.compass\";\n public elementType = CircleElement;\n public defaultRate = DEFAULT_ARC_RATE_RAD_PER_MS;\n public defaultDurationMs = DEFAULT_CIRCLE_FILL_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const circle = target as CircleElement;\n const explicitStart = (args && typeof args.startAngle === \"number\")\n ? args.startAngle\n : Math.atan2(circle.B.y - circle.Center.y, circle.B.x - circle.Center.x);\n const sweepMs = (2 * Math.PI) / this.defaultRate;\n const fullRestore = () => {\n circle.faceAlpha = 1;\n circle.drawProgress = 1;\n circle.drawStartAngle = 0;\n circle.visible = true;\n };\n // Step 1 — edge sweep with the face hidden.\n const sweep: IAnimationStep = {\n durationMs: sweepMs,\n setup: () => {\n circle.drawStartAngle = explicitStart;\n circle.faceAlpha = 0;\n circle.drawProgress = 0;\n },\n tick: (progress) => { circle.drawProgress = progress; },\n finalise: () => { circle.drawProgress = 1; },\n };\n // A face-less circle has nothing to fade — scheduling the\n // fill step anyway would be pure dead time in the middle of\n // a cascade (#81). Run the sweep alone, with its finalise\n // doing the full restore.\n if (circle.faceColor == null) {\n sweep.finalise = fullRestore;\n return [sweep];\n }\n // Fill ~twice as fast as the sweep, capped by the class-level\n // default so a tiny circle doesn't yield a blink-of-an-eye fade.\n const fillMs = Math.min(sweepMs / 2, this.defaultDurationMs);\n return [\n sweep,\n // Step 2 — face fade-in over the now-complete arc.\n {\n durationMs: fillMs,\n tick: (progress) => { circle.faceAlpha = progress; },\n finalise: fullRestore,\n },\n ];\n }\n}\n\nregisterAnimation(new CircleCompassAnimation());\n","/*----------------------------------------------------------------------+\n| Circle construction classes — extracted from Constructions.ts |\n| Note: CircumcircleConstruction lives in point/PointConstructions.ts |\n| because CircumcenterConstruction extends it directly. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n CircleConstructions as CircleConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"./CircleElement\";\nimport {InvertCircleElement} from \"./InvertCircleElement\";\nimport {SphereIntersectionElement} from \"./SphereIntersectionElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\n\n/************************\n * Element Class Circle *\n ************************/\n\n// circle\n// radius — points A, B [, plane C = screen]\n// the circle with center A and radius AB in the plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java circle case 0 — new CircleElement(A,B,plane))\nexport class CircleRadiusCenterConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.radius;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircleElement({C:P[0], B:P[1], AP:plane});\n return [[g], g];\n }\n}\n\n// circle — radius (3-point) — points A, B, C [, plane D = screen]\n// the circle with center A and radius |BC| in the plane D\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// MUST be registered BEFORE the 2-point variant in the constructions array\n// (signature variant ordering rule: longer signature first)\n// (Java: Slate.java circle case 0 — new CircleElement(A,B,C,plane))\nexport class CircleRadius3PointConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.radius;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircleElement({C: P[0], A: P[1], B: P[2], AP: plane});\n return [[g], g];\n }\n}\n\n\n// circle\n// invert\n// circles A, B\n// the image of circle A inverted in circle B\n// (Java: InvertCircle.java — TS: InvertCircleElement.ts)\nexport class InvertCircleConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.invert;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [CircleElement, CircleElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new InvertCircleElement(E[0] as CircleElement, E[1] as CircleElement);\n return [[g], g];\n }\n}\n\n// circle\n// intersection\n// spheres A, B\n// the circle at the intersection of spheres A and B\n// (Java: IntersectionSS.java — TS: SphereIntersectionElement.ts)\nexport class SphereIntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.intersection;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [SphereElement, SphereElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new SphereIntersectionElement(E[0] as SphereElement, E[1] as SphereElement);\n return [[g], g];\n }\n}\n\nexport const circleConstructions: Construction[] = [\n new CircleRadius3PointConstruction(),\n new CircleRadiusCenterConstruction(),\n new InvertCircleConstruction(),\n new SphereIntersectionConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tCircleElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\n\nexport interface ICircleElementConstruction {\n C : PointElement; // center of the circle\n B : PointElement; // point defining one end of the radius segment\n A? : PointElement; // point defining the other end of the radius segment\n // (defaults to C — so radius = C.distance(B) in the 2-point form,\n // or A.distance(B) in the 3-point form where A ≠ C)\n AP : PlaneElement;\n}\n\nexport class CircleElement extends GeomElement {\n\n public Center : PointElement;\n public A : PointElement;\n public B : PointElement;\n public AP : PlaneElement;\n\n // Starting angle (radians) for the slide-transition arc sweep.\n // Default 0 keeps the existing closed-circle render path identical\n // when drawProgress is 1. Set by A.Circle.compass before sweeping\n // so the trace begins at the natural compass-point (the angle from\n // centre to the radius-defining B). Reset in finalise().\n private _drawStartAngle : number = 0;\n // Face fill alpha — drives drawFace's globalAlpha independent of\n // drawProgress (which only drives the edge sweep). Default 1 means\n // \"fully opaque\" — every existing render path behaves identically.\n private _faceAlpha : number = 1;\n\n set drawStartAngle(value: number) { this._drawStartAngle = value; }\n get drawStartAngle(): number { return this._drawStartAngle; }\n\n set faceAlpha(value: number) {\n this._faceAlpha = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n get faceAlpha(): number { return this._faceAlpha; }\n\n constructor(ice? : ICircleElementConstruction) {\n super();\n this.dimension = 2;\n if(ice == null) return;\n this.Center = ice.C;\n this.A = ice.A != null ? ice.A : this.Center;\n this.B = ice.B;\n this.AP = ice.AP;\n }\n\n get radius() {\n return this.A.distance(this.B);\n }\n\n get radius2() {\n return this.A.distance2(this.B);\n }\n\n public defined() : boolean {\n return true;\n //return this.Center.defined() && this.A.defined()\n // && this.B.defined() && this.AP.defined();\n }\n\n\n // drawEllipse and fillEllipse not necessary as they are provided\n // in the canvas api.\n\n // Shared geometry walk. `arcStart` / `arcEnd` let the caller render\n // either a partial arc (the slide-transition edge sweep) or a\n // full circle for fill purposes — the face never gets partial.\n private _drawCircleArc(ctx : CanvasRenderingContext2D, arcStart : number, arcEnd : number) : void {\n ctx.beginPath();\n let r2 : number = this.radius2;\n let r : number = Math.sqrt(r2);\n let amp2 : number = this.AP.S.z*this.AP.S.z + this.AP.T.z*this.AP.T.z;\n if (Math.abs(amp2) < 0.01) { // the circle is flat\n ctx.ellipse(\n this.Center.x,\n this.Center.y,\n r,\n r,\n 0,\n arcStart,\n arcEnd);\n return;\n }\n let h : number = r/Math.sqrt(amp2);\n // determine major and minor radius vectors (a,b) and (c,d)\n let rcos :number = h*this.AP.T.z;\n let rsin :number = -h*this.AP.S.z;\n let majorx :number = rcos*this.AP.S.x + rsin*this.AP.T.x;\n let majory :number = rcos*this.AP.S.y + rsin*this.AP.T.y;\n let factor :number = (amp2 < 1.0)? Math.sqrt(1.0-amp2) : 0.0;\n let minorx :number = -factor*majory;\n let minory :number = factor*majorx;\n let majorR : number = Math.sqrt(majorx*majorx + majory*majory);\n let minorR : number = Math.sqrt(minorx*minorx + minory*minory);\n // Degenerate case: ellipse is so thin it looks like a line.\n // (minorR <= majorR always since minorR = factor * majorR with\n // factor in [0,1], so we only need to check minorR.)\n if (minorR < 0.5) {\n ctx.moveTo(this.Center.x - majorx, this.Center.y - majory);\n ctx.lineTo(this.Center.x + majorx, this.Center.y + majory);\n return;\n }\n // Rotation angle of the major axis\n let rotation : number = Math.atan2(majory, majorx);\n ctx.ellipse(\n this.Center.x,\n this.Center.y,\n majorR,\n minorR,\n rotation,\n arcStart,\n arcEnd);\n }\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n // Pick the highlight color BEFORE the null bail, matching\n // LineElement / PolygonElement (#81). A circle with a null\n // edgeColor can still render in the highlight stroke while\n // emphasized or slide-highlighted — the \"invisible highlight\n // target\" pattern, and what lets a zero-color transitionary\n // circle show up during its compass animation (SlateAnimator\n // holds emphasisAmount = 1 on animating targets).\n const color = (this.emphasized || this.shouldHighlight)\n ? this.edgeHighlightColor\n : this.edgeColor;\n if (color == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = color;\n // Match LineElement: smooth interpolation between baseline (1 or 3)\n // and 6 via emphasisAmount. Always assigned explicitly so a\n // previous element's value doesn't leak.\n {\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n }\n // Edge sweep: partial arc from drawStartAngle through\n // 2π · drawProgress. Default progress = 1 yields a full circle.\n let arcStart = this.drawStartAngle;\n let arcEnd = arcStart + 2 * Math.PI * this.drawProgress;\n this._drawCircleArc(ctx, arcStart, arcEnd);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n // Face is independent of the edge sweep — always fills the\n // full circle (filling a partial arc would render a pie wedge\n // with a chord bleeding out, which is not what a compass sweep\n // should look like). Alpha is driven by the dedicated faceAlpha\n // field so an animation can fade the fill in after the edge\n // trace completes; default faceAlpha = 1 preserves the\n // fully-opaque behaviour for every consumer that doesn't animate.\n let a = this.faceAlpha;\n if (a <= 0) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.fillStyle = this.faceColor;\n this._drawCircleArc(ctx, 0, 2 * Math.PI);\n if (a < 1) {\n ctx.save();\n ctx.globalAlpha = a;\n ctx.fill();\n ctx.restore();\n } else {\n ctx.fill();\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.nameColor;\n ctx.font = GeomElement._font;\n let [w, h] = this._getTextMetrics(ctx, this.name);\n ctx.fillText(this._name, this.Center.x - w/2, this.Center.y - h/2);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tCircumcenter.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\n// import {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {CircleElement} from \"./CircleElement\";\n\nexport class CircumcircleElement extends CircleElement {\n\n /*--------------------------------------------------------------------+\n | This is the circle passing through the three points B, C, and D.\t|\n | It is assumed that all three points lie in the plane AP.\t\t|\n +--------------------------------------------------------------------*/\n public C : PointElement;\n public D : PointElement;\n\n constructor(B: PointElement, C : PointElement, D: PointElement, AP: PlaneElement) {\n super();\n this.dimension = 2;\n this.B = B;\n this.C = C;\n this.D = D;\n this.AP = AP;\n this.Center = new PointElement({AP:AP});\n this.A = this.Center;\n }\n\n update() : void { \n this.Center.toCircumcenter(this.B,this.C,this.D); \n }\n\n translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n }\n\n rotate(pivot: PointElement, c: number, s: number) {\n this.Center.rotate(pivot, c, s);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tInvertCircleElement.ts |\n| Originally: InvertCircle.java |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {CircleElement} from \"./CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class InvertCircleElement extends CircleElement {\n /*--------------------------------------------------------------------+\n | Invert the circle C in the circle D to get this circle. It is |\n | assumed that C and D lie in the same plane C.AP. |\n +--------------------------------------------------------------------*/\n\n private _C: CircleElement;\n private _D: CircleElement;\n\n constructor(C: CircleElement, D: CircleElement) {\n super();\n this.dimension = 2;\n this._C = C;\n this._D = D;\n this.AP = C.AP;\n this.Center = new PointElement({AP: this.AP});\n this.A = this.Center;\n this.B = new PointElement({AP: this.AP});\n }\n\n public update() {\n let d2 = this._C.Center.distance2(this._D.Center);\n let r2 = this._C.radius2;\n let factor = this._D.radius2 / (d2 - r2);\n this.Center.to(this._C.Center).minus(this._D.Center).times(factor).plus(this._D.Center);\n factor = 1.0 + Math.sqrt(r2 / d2);\n this.B.to(this.Center).minus(this._D.Center).times(factor).plus(this._D.Center);\n }\n\n public translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n this.B.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.Center.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSphereIntersectionElement.ts |\n| Originally: IntersectionSS.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {CircleElement} from \"./CircleElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PerpendicularPlane} from \"../plane/PerpendicularPlane\";\n\nexport class SphereIntersectionElement extends CircleElement {\n /*--------------------------------------------------------------------+\n | This circle is the intersection of two spheres S and T. The center |\n | of the circle is Center, which is A, lies in the plane AP, and |\n | has radius AB. |\n +--------------------------------------------------------------------*/\n\n private _S: SphereElement;\n private _T: SphereElement;\n\n constructor(S: SphereElement, T: SphereElement) {\n super();\n this.dimension = 2;\n this._S = S;\n this._T = T;\n this.Center = this.A = new PointElement();\n this.B = new PointElement();\n this.AP = new PerpendicularPlane({A: this.Center, E: T.Center});\n this.Center._AP = this.AP;\n }\n\n public update() {\n let d2 = this._T.Center.distance2(this._S.Center);\n let t2 = this._T.radius2();\n let factor = 0.5 + (t2 - this._S.radius2()) / (2.0 * d2);\n this.Center.to(this._S.Center).minus(this._T.Center).times(factor).plus(this._T.Center);\n let radius = Math.sqrt(t2 - this.Center.distance2(this._T.Center));\n this.B.to(this.Center);\n this.B.z += radius;\n this.AP.update();\n }\n\n public translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n this.B.translate(dx, dy);\n this.AP.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.Center.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n this.AP.rotate(pivot, ac, as);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tBichord.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {LineElement} from \"./LineElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\ninterface IBichordElementConstructor {\n C : CircleElement;\n D : CircleElement;\n}\n\nexport class Bichord extends LineElement {\n /*--------------------------------------------------------------------+\n | This line AB connects the two points where the two circles C and D |\n | meet. It is assumed that the two circles lie in the same plane, the |\n | plane of C. |\n +--------------------------------------------------------------------*/\n\n public C: CircleElement;\n public D: CircleElement;\n\n constructor(ibe? : IBichordElementConstructor) {\n super();\n this.dimension = 1;\n if (ibe == null) return;\n\n this._A = new PointElement();\n this._B = new PointElement();\n this.C = ibe.C;\n this.D = ibe.D;\n this._A._AP = this.C.AP;\n this._B._AP = this.C.AP;\n }\n\n public translate(dx: number, dy: number) {\n this._A.translate(dx, dy);\n this._B.translate(dx, dy);\n }\n\n public rotate(pivot : PointElement, ac : number, as : number) {\n this._A.rotate(pivot, ac, as);\n this._B.rotate(pivot, ac, as);\n }\n\n public update() {\n let r : number = this.C.radius;\n let s : number = this.D.radius;\n let d : number = this.C.Center.distance(this.D.Center);\n if (d > r + s) {\n let v = 0.0/0.0;\n this.A.x = v;\n this.A.y = v;\n this.A.z = v;\n this.B.x = v;\n this.B.y = v;\n this.B.z = v;\n return;\n }\n let costheta : number = (d*d + r*r - s*s) / (2.0 * d * r);\n let sintheta : number = Math.sqrt(1.0-costheta*costheta);\n this.A.to(this.D.Center).toCircle(this.C);\n this.B.to(this.A);\n this.A.rotate(this.C.Center,costheta,sintheta,this.C.AP);\n this.B.rotate(this.C.Center,costheta,-sintheta,this.C.AP);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tChord.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {LineElement} from \"./LineElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\ninterface IChordElementConstructor {\n D : PointElement;\n E : PointElement;\n C : CircleElement;\n}\n\nexport class Chord extends LineElement {\n /*--------------------------------------------------------------------+\n | This line AB is the segment of the line DE (extended) that |\n | intersects the circle C. It is assumed that DE and C lie in the |\n | same plane, namely that of C. |\n +--------------------------------------------------------------------*/\n\n public C: CircleElement;\n public D: PointElement;\n public E: PointElement;\n\n constructor(ice? : IChordElementConstructor) {\n super();\n this.dimension = 1;\n if (ice == null) return;\n\n this.C = ice.C;\n this.D = ice.D;\n this.E = ice.E;\n this._A = new PointElement({AP: this.C.AP});\n this._B = new PointElement({AP: this.C.AP});\n }\n\n public translate(dx: number, dy: number) {\n this._A.translate(dx, dy);\n this._B.translate(dx, dy);\n }\n\n public rotate(pivot : PointElement, ac : number, as : number) {\n this._A.rotate(pivot, ac, as);\n this._B.rotate(pivot, ac, as);\n }\n\n public update() {\n this._B.to(this.C.Center).toLine(this.D, this.E, false);\n let d2 : number = this.C.Center.distance2(this._B);\n let r2 : number = this.C.radius2;\n if (d2 > r2) {\n let v = 0.0/0.0;\n this._A.x = v;\n this._A.y = v;\n this._A.z = v;\n this._B.x = v;\n this._B.y = v;\n this._B.z = v;\n return;\n }\n let s : number = Math.sqrt(r2 - d2);\n let factor : number = s / this.D.distance(this._B);\n if (factor < 1e10) {\n this._A.to(this.D).minus(this._B).times(factor).plus(this._B);\n } else {\n factor = s / this.E.distance(this._B);\n this._A.to(this.E).minus(this._B).times(factor).plus(this._B);\n }\n this._B.times(2.0).minus(this._A);\n }\n\n}\n","// Animations targeting LineElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\n\n// Default trace rate in px/ms. Calibrated for unhurried teaching: a\n// typical 100-px construction line draws over ~400 ms; 200-px lines\n// take ~800 ms. Authors who want snappier transitions raise the rate\n// via slate.animationConfig.rates[\"Line.straightEdgeConnect\"].\nconst DEFAULT_LINE_RATE_PX_PER_MS = 0.25;\n\n// Common helper: trace the target line from A toward B by driving\n// drawProgress. Used by both StraightEdgeConnect (the canonical\n// straightedge stroke between two existing points) and\n// StraightEdgeExtend (same shape, just visually framed as extending\n// past an endpoint instead of joining two existing ones).\nfunction traceLine(target: LineElement, rate: number): IAnimationStep {\n // duration = length / rate, clamped low so an extremely short\n // line still gets a perceptible draw.\n const dx = target.B.x - target.A.x;\n const dy = target.B.y - target.A.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const durationMs = Math.max(120, length / rate);\n return {\n durationMs,\n tick: (progress) => { target.drawProgress = progress; },\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n };\n}\n\n// A.Line.straightEdgeConnect — pencil stroke from A toward B.\n// Args: none. Duration = length × default rate (0.5 px/ms).\nexport class LineStraightEdgeConnectAnimation extends Animation {\n public animationMethod = AllAnimations.LINE_STRAIGHT_EDGE_CONNECT;\n public name = \"Line.straightEdgeConnect\";\n public elementType = LineElement;\n public defaultRate = DEFAULT_LINE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [traceLine(target as LineElement, this.defaultRate)];\n }\n}\n\n// A.Line.straightEdgeExtend — for Line.extend constructions where one\n// endpoint sits on an existing line and the other is the projected\n// new endpoint. v1 renders the same trace as StraightEdgeConnect;\n// future richer variants might pivot a straightedge guide against the\n// existing line first.\nexport class LineStraightEdgeExtendAnimation extends Animation {\n public animationMethod = AllAnimations.LINE_STRAIGHT_EDGE_EXTEND;\n public name = \"Line.straightEdgeExtend\";\n public elementType = LineElement;\n public defaultRate = DEFAULT_LINE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [traceLine(target as LineElement, this.defaultRate)];\n }\n}\n\nregisterAnimation(new LineStraightEdgeConnectAnimation());\nregisterAnimation(new LineStraightEdgeExtendAnimation());\n","/*----------------------------------------------------------------------+\n| Line construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions, LineConstructions as LineConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {PointPerpendicular1Construction, PointPerpendicular2Construction,\n PointPerpendicular3Construction, PointPerpendicular4Construction,\n PointPerpendicular5Construction} from \"../point/PointConstructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {Foot} from \"../point/Foot\";\nimport {PlaneFootElement} from \"../point/PlaneFootElement\";\nimport {LineElement} from \"./LineElement\";\nimport {Perpendicular} from \"./Perpendicular\";\nimport {PlanePerpendicularLine} from \"./PlanePerpendicularLine\";\nimport {Bichord} from \"./Bichord\";\nimport {Chord} from \"./Chord\";\nimport {SimilarElement} from \"../point/SimilarElement\";\nimport {ProportionElement} from \"../point/ProportionElement\";\nimport {AngleDividerElement} from \"../point/AngleDividerElement\";\nimport {MeanProportionalElement} from \"../point/MeanProportionalElement\";\n\n/**********************\n * Element Class Line *\n **********************/\n\n// line\n// connect\n// points A, B\n// the line AB connecting two points A and B\n// (Java: Slate.java line case 0 — new LineElement(A,B))\nexport class LineConnectConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.connect;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new LineElement({A:P[0], B: P[1]});\n\n return [[g], g];\n }\n}\n\n// line\n// angleBisector — points B, A, C [, plane D = screen]\n// line from A to the bisector point of angle BAC on line BC\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java line case 1 — AngleDivider(B,A,C,plane,2) + LineElement(A,result))\nexport class AngleBisectorLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.angleBisector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let ad = new AngleDividerElement(P[0], P[1], P[2], plane, 2);\n let g = new LineElement({A: P[1], B: ad});\n return [[ad, g], g];\n }\n}\n\n// line\n// angleDivider — points B, A, C, integer n [, plane D = screen]\n// line from A to the n-th division point of angle BAC on line BC\n// 2D: 3 points, 0 elements, 1 integer — uses screen plane\n// 3D: 3 points, 1 PlaneElement, 1 integer — uses explicit plane\n// (Java: Slate.java line case 2 — AngleDivider(B,A,C,plane,n) + LineElement(A,result))\nexport class AngleDividerLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.angleDivider;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let ad = new AngleDividerElement(P[0], P[1], P[2], plane, N[0]);\n let g = new LineElement({A: P[1], B: ad});\n return [[ad, g], g];\n }\n}\n\n// line\n// foot (2D variant)\n// 3 points A, B, C\n// the line AD from A to the foot of the perpendicular from A to line BC\n// (Java: Slate.java case 3, choice 0 — Foot(A,B,C) + LineElement(A,foot).\n// Foot class already IMPL at src/elements/point/Foot.ts.)\nexport class LineFootConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.foot;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let fo = new Foot(P[0], P[1], P[2]);\n let g = new LineElement({A: P[0], B: fo});\n return [[fo, g], g];\n }\n}\n\n// *Solid Geometry Only*\n// line\n// foot\n// point A plane B\n// the line AD drawn perpendicular to plane B with the point D lying on B\n// (Java: PlaneFoot.java — TS: PlaneFootElement.ts, renamed for clarity)\nexport class PlaneFootLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.foot;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const fo = new PlaneFootElement(P[0], E[0] as PlaneElement);\n const g = new LineElement({A: P[0], B: fo});\n return [[fo, g], g];\n }\n}\n\n// line\n// chord\n// points A, B, circle C\n// the chord of circle C cut by the line AB\n// (post-LineElement-expansion: A, B are the two endpoints of the input line)\n// (Java: Slate.java line case 4 — new Chord(A,B,C). Java: Chord.java)\nexport class ChordConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.chord;\n signature = { points: 2, elements: 1, integers: 0, elementTypes: [CircleElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new Chord({D: P[0], E: P[1], C: E[0] as CircleElement});\n return [[g], g];\n }\n}\n\n// line\n// bichord\n// circles A, B\n// the common chord connecting the two intersection points of the circles A and B\n// (Java: Slate.java line case 5 — new Bichord(A,B). Java: Bichord.java)\nexport class BichordConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.bichord;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [CircleElement, CircleElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Bichord({C: E[0] as CircleElement, D: E[1] as CircleElement});\n return [[g], g];\n }\n}\n\n// Line perpendicular constructions — all 5 variants share the same\n// construct() pattern: call the parent point-perpendicular construct(),\n// then return the Perpendicular LineElement (first in elementsForUpdate).\n// (Java: Slate.java line case 6 — all choices dispatch to a Perpendicular\n// or PlanePerpendicular, then return the LineElement directly.)\nfunction wrapPointAsLine(es: [GeomElementsForUpdate, GeomElement]): [GeomElementsForUpdate, GeomElement] {\n return [es[0], es[0][0]];\n}\n\n// line — perpendicular variant 1: points A, B [plane C (screen)]\n// the line from A to the point D so that AD is equal and perpendicular to AB in plane C\n// (Java: Slate.java line case 6, choice 0 — Perpendicular(A,B,screen,A,B))\nexport class LinePerpendicular1Construction extends PointPerpendicular1Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 2: points A, B, plane C\n// (Java: Slate.java line case 6, choice 1 — Perpendicular(A,B,C,A,B))\nexport class LinePerpendicular2Construction extends PointPerpendicular2Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 3: points A, B, D, E [plane C (screen)]\n// (Java: Slate.java line case 6, choice 2 — Perpendicular(A,B,screen,D,E))\nexport class LinePerpendicular3Construction extends PointPerpendicular3Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 4: points A, B, plane C, points D, E\n// (Java: Slate.java line case 6, choice 3 — Perpendicular(A,B,C,D,E))\nexport class LinePerpendicular4Construction extends PointPerpendicular4Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 5: point A, plane B, points C, D\n// (Java: Slate.java line case 6, choice 4 — PlanePerpendicularLine(A,B,C,D))\nexport class LinePerpendicular5Construction extends PointPerpendicular5Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line\n// cutoff\n// points A, B, C, D\n// the line AE equal to CD along the line AB\n// (Java: Slate.java line case 7 — Layoff(A,A,B,C,D) + LineElement(A,layoff))\nexport class LineCutoffConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.cutoff;\n signature = { points: 4, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[0], P[1], P[2], P[3]);\n let g = new LineElement({A: P[0], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// extend\n// points A, B, C, D\n// the line BE equal to CD so that A, B, and C are collinear with B between A and C\n// (Java: Slate.java line case 8 — Layoff(B,A,B,C,D) + LineElement(B,layoff))\nexport class LineExtendConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.extend;\n signature = { points: 4, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[1], P[0], P[1], P[2], P[3]);\n let g = new LineElement({A: P[1], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// parallel\n// points A, B, C\n// the line AD through A parallel and equal to BC, so D = A + (C - B)\n// (no dedicated Java class — Slate.java case 9 dispatches to a Layoff\n// trick: Layoff(A, B, C, B, C) gives D = A + (C-B), then wraps a fresh\n// LineElement(A, D). Same pattern as LineExtendConstruction above.)\nexport class LineParallelConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.parallel;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n let g = new LineElement({A: P[0], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the line AH so that triangle ABH is similar to triangle DEF\n// 2D: 5 points, 0 elements — uses screen plane for both\n// 3D: 5 points, 2 PlaneElements — uses explicit planes\n// (Java: Slate.java line case 10 — Similar(A,B,C,D,E,F,G) + LineElement(A,H))\nexport class SimilarLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let sim = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n let g = new LineElement({A: P[0], B: sim});\n return [[sim, g], g];\n }\n}\n\n// line\n// proportion\n// 8 points A, B, C, D, E, F, G, H\n// the line GI along GH so that AB:CD = EF:GI\n// (Java: Slate.java line case 11 — Proportion + LineElement(G, result))\nexport class ProportionLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.proportion;\n signature = { points: 8, elements: 0, integers: 0 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let prop = new ProportionElement(P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7]);\n let g = new LineElement({A: P[6], B: prop});\n return [[prop, g], g];\n }\n}\n\n// line\n// meanProportional\n// 6 points S0, S1, T0, T1, U0, U1\n// the line U0U' along U0U1 so that S:U' = U':T\n// (Java: Slate.java line case 12 — MeanProportional + LineElement(U0, result))\nexport class MeanProportionalLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.meanProportional;\n signature = { points: 6, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let mp = new MeanProportionalElement(P[0], P[1], P[2], P[3], P[4], P[5]);\n let g = new LineElement({A: P[4], B: mp});\n return [[mp, g], g];\n }\n}\n\nexport const lineConstructions: Construction[] = [\n new LineConnectConstruction(),\n new LineExtendConstruction(),\n new LinePerpendicular1Construction(),\n new LinePerpendicular2Construction(),\n new LinePerpendicular3Construction(),\n new LinePerpendicular4Construction(),\n new LinePerpendicular5Construction(),\n new BichordConstruction(),\n new ChordConstruction(),\n new LineParallelConstruction(),\n new LineCutoffConstruction(),\n new PlaneFootLineConstruction(),\n new LineFootConstruction(),\n new SimilarLineConstruction(),\n new ProportionLineConstruction(),\n new AngleBisectorLineConstruction(),\n new AngleDividerLineConstruction(),\n new MeanProportionalLineConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tLineElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {GeomElement} from \"../GeomElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\ninterface ILineElementConstructor {\n A : PointElement;\n B : PointElement;\n}\n\nexport class LineElement extends GeomElement {\n protected _A : PointElement;\n\n get A() : PointElement { return this._A; }\n\n protected _B : PointElement;\n get B() : PointElement { return this._B; }\n\n constructor(ile?: ILineElementConstructor) {\n super();\n this.dimension = 1;\n this._A = ile && ile.A || null;\n this._B = ile && ile.B || null;\n }\n\n public drawEdge(c: HTMLCanvasElement, color?: string): void {\n if (!this.visible) return;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.edgeHighlightColor;\n } else {\n color = this.edgeColor;\n }\n }\n\n if (color == null) return;\n\n let ctx = c.getContext(\"2d\");\n ctx.strokeStyle = color;\n // Stroke weight scales smoothly. Baseline is 1 (normal) or 3\n // (slide-highlight); emphasisAmount interpolates up to 6 for\n // full emphasis. emphasisAmount = 0 → baseline; 1 → 6 px;\n // animator fades 1 → 0 over ~250 ms at the end of a transition\n // so the post-animation settle isn't a hard pop.\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n // Slide-transition animation: drawProgress < 1 traces only the\n // first `progress` fraction of the line A → B. Default 1 keeps\n // the full-line behaviour every existing consumer relies on.\n let p = this.drawProgress;\n let endX = this._A.x + (this._B.x - this._A.x) * p;\n let endY = this._A.y + (this._B.y - this._A.y) * p;\n ctx.beginPath();\n ctx.moveTo(this._A.x, this._A.y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor == null || this.name == null) return;\n if (this._A == null || !this._A.defined()) return;\n if (this._B == null || !this._B.defined()) return;\n const ix = Math.round((this._A.x + this._B.x) / 2);\n const iy = Math.round((this._A.y + this._B.y) / 2);\n this.drawString(ix, iy, c);\n }\n\n public drawVertex(c: SlateCanvas): void {\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPerpendicular.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport interface IPerpendicularElementConstructor {\n C : PointElement;\n D : PointElement;\n P : PlaneElement;\n E : PointElement;\n F : PointElement;\n}\n\nexport class Perpendicular extends LineElement {\n // draw perpendicular to CD in the plane P. A is the proj of\n // C onto P, while AB is perpendicular to CD and equals EF.\n\n protected _C : PointElement;\n protected _D : PointElement;\n protected _E : PointElement;\n protected _F : PointElement;\n protected _P : PlaneElement;\n\n constructor(ipe?: IPerpendicularElementConstructor) {\n super();\n this.dimension = 1;\n if(ipe == null) return;\n this._P = ipe.P;\n this._A = new PointElement({AP: ipe.P});\n this._B = new PointElement({AP: ipe.P});\n this._C = ipe.C;\n this._D = ipe.D;\n this._E = ipe.E;\n this._F = ipe.F;\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.A.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n\n public translate(dx: number, dy: number): void {\n this.A.translate(dx,dy);\n this.B.translate(dx,dy);\n }\n\n public update(): void {\n this._A.to(this._C).toPlane(this._P);\n this._B.to(this._D).minus(this._A);\n let Bs : number = PointElement.dot(this.B,this._P.S);\n let Bt : number = PointElement.dot(this.B,this._P.T);\n let factor : number = Math.sqrt(this._E.distance2(this._F)/(Bs*Bs+Bt*Bt));\n Bs = -Bs/factor;\n Bt /= factor;\n this._B.x = Bt*this._P.S.x + Bs*this._P.T.x + this._A.x;\n this._B.y = Bt*this._P.S.y + Bs*this._P.T.y + this._A.y;\n this._B.z = Bt*this._P.S.z + Bs*this._P.T.z + this._A.z;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlanePerpendicularLine.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2023, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {IPerpendicularElementConstructor} from \"./Perpendicular\";\n\nexport interface IPlanePerpendicularLineConstructor {\n C : PointElement;\n P : PlaneElement;\n D : PointElement;\n E : PointElement;\n}\n\nexport class PlanePerpendicularLine extends LineElement {\n \n // draw perpendicular at C to the plane P. A is the proj of C onto P, while\n // AB is perpendicular to P and equal to DE\n\n protected _C : PointElement;\n protected _P : PlaneElement;\n protected _D : PointElement;\n protected _E : PointElement;\n \n // The line AB will be perpendicular to the plane P. A will be the projection\n // of C on to the plane P. AB will equal DE.\n\n constructor(ipe?: IPlanePerpendicularLineConstructor) {\n super();\n this.dimension = 1;\n if(ipe == null) return;\n this._A = new PointElement({AP: ipe.P});\n this._B = new PointElement();\n this._C = ipe.C;\n this._D = ipe.D;\n this._E = ipe.E;\n this._P = ipe.P;\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.A.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n\n public translate(dx: number, dy: number): void {\n this.A.translate(dx,dy);\n this.B.translate(dx,dy);\n }\n\n public update(): void {\n this._A.to(this._C).toPlane(this._P);\n this._B.toCross(this._P.S, this._P.T);\n this._B.times(this._D.distance(this._E)).plus(this._A)\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tParallelPlane.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PlaneElement} from \"./PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class ParallelPlane extends PlaneElement {\n /*--------------------------------------------------------------------+\n | this is the plane parallel to the plane P passing through the |\n | point A |\n +--------------------------------------------------------------------*/\n\n private _P: PlaneElement;\n\n constructor(P: PlaneElement, A: PointElement) {\n super();\n this.dimension = 2;\n this._P = P;\n this.A = A;\n this.B = new PointElement();\n this.C = new PointElement();\n this.S = P.S;\n this.T = P.T;\n this.U = P.U;\n }\n\n public translate(dx: number, dy: number) {\n this.B.translate(dx, dy);\n this.C.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.B.rotate(pivot, ac, as);\n this.C.rotate(pivot, ac, as);\n }\n\n public update() {\n this.B.to(this._P.B).minus(this._P.A).plus(this.A);\n this.C.to(this._P.C).minus(this._P.A).plus(this.A);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPerpendicularPlane.ts |\n| Originally: PerpendicularPL.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"./PlaneElement\";\n\nexport interface IPerpendicularPlaneElementConstruction {\n A : PointElement;\n E : PointElement;\n}\n\nexport class PerpendicularPlane extends PlaneElement {\n\n // this is the plane perpendicular to the line AE at the point A\n\n public E : PointElement;\n\n constructor(ippe? : IPerpendicularPlaneElementConstruction) {\n super();\n this.A = ippe.A;\n this.E = ippe.E;\n this.B = new PointElement({AP: this});\n this.C = new PointElement({AP: this});\n this.S = new PointElement();\n this.T = new PointElement();\n }\n\n translate(dx: number, dy: number) : void {\n this.B.translate(dx, dy);\n this.C.translate(dx, dy);\n }\n\n rotate(pivot : PointElement, ac: number, as: number) {\n this.B.rotate(pivot, ac, as);\n this.C.rotate(pivot, ac, as);\n super.update();\n }\n\n update() {\n this.U = PointElement.difference(this.E,this.A);\n let len : number = this.U.length();\n // TODO: Check division by 0?\n this.U.times(1.0/len);\n let lxy : number = Math.sqrt(this.U.x*this.U.x + this.U.y*this.U.y);\n if(lxy >= 0.000001) {\n this.S.x = -this.U.y/lxy;\n this.S.y = this.U.x/lxy;\n this.T.toCross(this.U,this.S);\n } else {\n this.S.x = 1.0;\n this.S.y = 0.0;\n this.S.z = 0.0;\n this.T.x = 0.0;\n this.T.y = 1.0;\n this.T.z = 0.0;\n }\n this.B.to(this.S).times(len).plus(this.A);\n this.C.to(this.T).times(len).plus(this.A);\n }\n}\n","/*----------------------------------------------------------------------+\n| Plane construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n PlaneConstructions as PlaneConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"./PlaneElement\";\nimport {PerpendicularPlane} from \"./PerpendicularPlane\";\nimport {ParallelPlane} from \"./ParallelPlane\";\n\n// plane — 3points — points A, B, C\n// (Java: Slate.java plane case 0 — new PlaneElement(A, B, C))\nexport class Plane3PointsConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.threePoints;\n signature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlaneElement({A: P[0], B: P[1], C: P[2]});\n return [[g], g];\n }\n}\n\n// plane — perpendicular — points A, B\n// (Java: Slate.java plane case 1 — new PerpendicularPL(A,B))\nexport class PerpendicularPlaneConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.perpendicular;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PerpendicularPlane({A: P[0], E: P[1]});\n return [[g], g];\n }\n}\n\n// plane — parallel — plane P, point A\n// (Java: ParallelP.java — 26 lines, line-for-line port)\nexport class PlaneParallelConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.parallel;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new ParallelPlane(E[0] as PlaneElement, P[0]);\n return [[g], g];\n }\n}\n\n// plane — ambient (point variant) — point A\n// (Java: Slate.java plane case 3, choice 0 — returns P[0].AP)\nexport class AmbientPlanePointConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.ambient;\n signature = { points: 1, elements: 0, integers: 0 };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[P[0]._AP], P[0]._AP];\n }\n}\n\n// plane — ambient (circle variant) — circle A\n// (Java: Slate.java plane case 3, choice 1 — returns ((CircleElement)E[0]).AP)\nexport class AmbientPlaneCircleConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.ambient;\n signature = { points: 0, elements: 1, integers: 0, elementTypes: [CircleElement] };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const c = E[0] as CircleElement;\n return [[c.AP], c.AP];\n }\n}\n\nexport const planeConstructions: Construction[] = [\n new Plane3PointsConstruction(),\n new PerpendicularPlaneConstruction(),\n new PlaneParallelConstruction(),\n new AmbientPlanePointConstruction(),\n new AmbientPlaneCircleConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\n\nexport interface IPlaneElementConstruction {\n A : PointElement;\n B : PointElement;\n C : PointElement;\n}\n\ntype iplec = IPlaneElementConstruction\n\nexport class PlaneElement extends GeomElement {\n\n /*--------------------------------------------------------------------+\n | The plane is represented by three points on it. It's displayed as |\n | a parallelogram with three vertices A, B, and C,projected onto the |\n | xy-plane. S is a unit vector in the direction AB, T is a |\n | perpendicular unit in the plane, and U is perpendicular to both. |\n +--------------------------------------------------------------------*/\n public A : PointElement;\n public B : PointElement;\n public C : PointElement;\n public S : PointElement;\n public T : PointElement;\n public U : PointElement;\n\n public pivot : PointElement; // pivot point for the plane, if any\n public isScreen : boolean; // set true only for initial screen plane\n\n constructor(ip? : IPlaneElementConstruction) {\n super();\n this.dimension = 2;\n this.isScreen = false;\n if (ip != null) {\n this.A = ip.A;\n this.B = ip.B;\n this.C = ip.C;\n this.S = new PointElement();\n this.T = new PointElement();\n this.U = new PointElement();\n }\n }\n\n public defined(): boolean {\n return this.A != null && this.B != null && this.C != null;\n }\n\n // A plane renders as a parallelogram with corners A, B, D, C\n // where D = B + C - A (the 4th corner in the plane of A, B, C).\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.strokeStyle = this.edgeColor;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.moveTo(this.A.x, this.A.y);\n ctx.lineTo(this.B.x, this.B.y);\n ctx.lineTo(dx, dy);\n ctx.lineTo(this.C.x, this.C.y);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.fillStyle = this.faceColor;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.moveTo(this.A.x, this.A.y);\n ctx.lineTo(this.B.x, this.B.y);\n ctx.lineTo(dx, dy);\n ctx.lineTo(this.C.x, this.C.y);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor == null || this.name == null || !this.defined()) return;\n // Label placed at midpoint of BC, matching Java PlaneElement.drawName\n let ix = Math.round((this.B.x + this.C.x) / 2.0);\n let iy = Math.round((this.B.y + this.C.y) / 2.0);\n this.drawString(ix, iy, c);\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor == null || !this.defined()) return;\n // Draw vertex at D = B + C - A (the 4th parallelogram corner).\n // A, B, C are drawn by their own drawVertex calls in Slate.\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.fillStyle = this.vertexColor;\n ctx.arc(dx, dy, 2, 0, 2*Math.PI, false);\n ctx.fill();\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.update();\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n if (this.isScreen && (this.A.z!=0.0 || this.B.z!=0.0 || this.C.z!=0.0))\n this.isScreen = false;\n // update the frame S,T,U\n this.S.to(this.B).minus(this.A);\n this.T.to(this.C).minus(this.A);\n this.S.times(1.0/this.S.length());\n let st : number = PointElement.dot(this.T, this.S);\n this.T.x -= st*this.S.x;\n this.T.y -= st*this.S.y;\n this.T.z -= st*this.S.z;\n this.T.times(1.0/this.T.length());\n this.U.toCross(this.S,this.T);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tAngleDividerElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class AngleDividerElement extends PointElement {\n /*--------------------------------------------------------------------+\n | n-sect angle BAC in the ambient plane AP |\n +--------------------------------------------------------------------*/\n\n private _A: PointElement; // vertex of the angle\n private _B: PointElement; // first ray point\n private _C: PointElement; // second ray point\n private _n: number; // divisor (2 = bisector)\n\n constructor(B: PointElement, A: PointElement, C: PointElement,\n AP: PlaneElement, n: number) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._C = C;\n this._AP = AP;\n this._n = n;\n }\n\n public update() {\n let theta : number = this._A.angle(this._B, this._C, this._AP) / this._n;\n let cos : number = Math.cos(theta);\n let sin : number = Math.sin(theta);\n if (this._AP.isScreen) {\n this._x = this._A.x + cos * (this._B.x - this._A.x) - sin * (this._B.y - this._A.y);\n this._y = this._A.y + sin * (this._B.x - this._A.x) + cos * (this._B.y - this._A.y);\n this._z = 0.0;\n } else {\n this.to(this._B).rotate(this._A, cos, sin, this._AP);\n }\n this.toIntersection(this, this._A, this._B, this._C, this._AP);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tCircleSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\n\nexport class CircleSlider extends PointElement {\n _C : CircleElement;\n _initx : number;\n _inity : number;\n _initz : number;\n\n _newP : PointElement = new PointElement();\n\n constructor(C: CircleElement,\n x: number, y: number, z: number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._C = C;\n this._x = x;\n this._initx = x;\n this._y = y;\n this._inity = y;\n this._z = z;\n this._initz = z;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toCircle(this._C);\n }\n\n public update() {\n this.toCircle(this._C);\n }\n\n public drag(tox: number, toy: number): boolean {\n this._x = tox;\n this._y = toy;\n if (!this.defined()) this._z = this._initz;\n this._newP.to(this).uptoPlane(this._C.AP);\n if (!this._newP.defined())\t// vertical plane\n this._newP.to(this).toPlane(this._C.AP);\n this._newP.toSphere(this._C.Center, this._C.radius);\n if ((this._newP.x-this.x)*(this._newP.x-this.x) +\n (this._newP.y-this.y)*(this._newP.y-this.y) < 0.5)\n return false;\n this.to(this._newP);\n return true;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tFixedPoint.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement, IPointElementConstruction} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class FixedPoint extends PointElement {\n\n protected _initx : number;\n protected _inity : number;\n protected _initz : number;\n\n constructor(ip? : IPointElementConstruction) {\n super(ip);\n this._initx = this._x;\n this._inity = this._y;\n this._initz = this._z;\n }\n\n public reset() : void {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tFoot.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class Foot extends PointElement {\n _A : PointElement;\n _B : PointElement;\n _C : PointElement;\n\n constructor(A: PointElement, B: PointElement, C: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._C = C;\n if (this._B.AP == this._C.AP) {\n this._AP = this._B.AP;\n }\n }\n\n public update() : void {\n this.to(this._A).toLine(this._B, this._C, false)\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tHarmonicElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class HarmonicElement extends PointElement {\n /*--------------------------------------------------------------------+\n | The harmonic conjugate A of B with respect to the points C and D. |\n | If B,C,D are collinear, then A also lies on that line; if not, |\n | A lies on the circumcircle through B,C,D. |\n +--------------------------------------------------------------------*/\n\n private _B: PointElement;\n private _C: PointElement;\n private _D: PointElement;\n private _E: PointElement;\n private _F: PointElement;\n private _M: PointElement;\n\n constructor(B: PointElement, C: PointElement, D: PointElement) {\n super();\n this.dimension = 0;\n this._B = B;\n this._C = C;\n this._D = D;\n this._E = new PointElement();\n this._F = new PointElement();\n this._M = new PointElement();\n }\n\n public update() {\n if (this._B.z === 0.0 && this._C.z === 0.0 && this._D.z === 0.0) {\n // 2D case: treat B,C,D as complex numbers\n // A = (C(B-D) + D(B-C)) / ((B-D) + (B-C))\n let Ex = this._B.x - this._C.x, Ey = this._B.y - this._C.y;\n let Fx = this._B.x - this._D.x, Fy = this._B.y - this._D.y;\n let BFx = this._C.x * Fx - this._C.y * Fy;\n let BFy = this._C.x * Fy + this._C.y * Fx;\n let DEx = this._D.x * Ex - this._D.y * Ey;\n let DEy = this._D.x * Ey + this._D.y * Ex;\n let den = (Fx + Ex) * (Fx + Ex) + (Fy + Ey) * (Fy + Ey);\n let numx = (BFx + DEx) * (Fx + Ex) + (BFy + DEy) * (Fy + Ey);\n let numy = -(BFx + DEx) * (Fy + Ey) + (BFy + DEy) * (Fx + Ex);\n this._x = numx / den;\n this._y = numy / den;\n } else {\n // 3D case\n this._M.to(this._C).plus(this._D).times(0.5); // M = (C+D)/2\n this._F.to(this._C).minus(this._M); // F = C-M\n this._E.to(this._B).minus(this._M); // E = B-M\n let rB2 = 1.0 / this._E.length2();\n let C2 = this._F.length2();\n this.to(this._F)\n .times(2.0 * PointElement.dot(this._E, this._F))\n .minus(this._E.times(C2))\n .times(rB2)\n .plus(this._M);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tIntersection.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class Intersection extends PointElement {\n \n A : PointElement;\n B : PointElement;\n C : PointElement;\n D : PointElement;\n\n constructor(A: PointElement,\n B: PointElement,\n C: PointElement,\n D: PointElement,\n AP: PlaneElement) {\n super({AP: AP});\n this.dimension = 0;\n this.A = A;\n this.B = B;\n this.C = C;\n this.D = D;\n }\n\n update(): void {\n this.toIntersection(this.A, this.B, this.C, this.D, this.AP);\n }\n}\n\n\n","/*----------------------------------------------------------------------+\n| Title:\tInvertPointElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\n\nexport class InvertPointElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Invert the point A in the circle C to get this point |\n +--------------------------------------------------------------------*/\n\n private _A: PointElement;\n private _C: CircleElement;\n\n constructor(A: PointElement, C: CircleElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._C = C;\n this._AP = C.AP;\n }\n\n public update() {\n this.toInvertPoint(this._A, this._C);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tLayoff.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class Layoff extends PointElement {\n\n // Lay off a line AB with endpoint A given, so that AB is parallel to CD\n // and equal to EF. (this is B)\n\n protected _A : PointElement;\n protected _C : PointElement;\n protected _D : PointElement;\n protected _E : PointElement;\n protected _F : PointElement;\n\n\n constructor(A: PointElement,\n C: PointElement,\n D: PointElement,\n E: PointElement,\n F: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._C = C;\n this._D = D;\n this._E = E;\n this._F = F;\n if (A.AP == C.AP && A.AP == D.AP) {\n this._AP = A.AP;\n }\n }\n\n public update() {\n let factor : number = this._E.distance(this._F) / this._C.distance(this._D);\n this.to(this._D).minus(this._C);\n this.times(factor).plus(this._A);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tLineSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class LineSlider extends PointElement {\n _A : PointElement;\n _B : PointElement;\n _initx : number;\n _inity : number;\n _initz : number;\n _segment : boolean;\n\n constructor(A: PointElement, B: PointElement,\n x: number, y: number, z: number, segment: boolean) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._A = A;\n this._B = B;\n this._x = x;\n this._initx = x;\n this._y = y;\n this._inity = y;\n this._z = z;\n this._initz = z;\n this._segment = segment;\n if(this._A.AP == this._B.AP) this._AP = this._A.AP;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toLine(this._A, this._B, this._segment);\n }\n\n public update() {\n this.toLine(this._A, this._B, this._segment);\n }\n\n public drag(tox: number, toy: number): boolean {\n tox -= this._A.x;\n toy -= this._A.y;\n let dx : number = this._B.x - this._A.x;\n let dy : number = this._B.y - this._A.y;\n let factor : number = (tox*dx + toy*dy)/(dx*dx + dy*dy);\n if (this._segment) {\n if (factor < 0.0) factor = 0.0;\n else if (factor > 1.0) factor = 1.0;\n }\n tox = this._A.x + dx*factor;\n toy = this._A.y + dy*factor;\n if ((tox-this._x)*(tox-this._x) + (tox-this._y)*(tox-this._y) < 0.5) return false;\n // now drag this point\n this._x = tox;\n this._y = toy;\n this._z = this._A.z + (this._B.z-this._A.z)*factor;\n return true;\n }\n}","/*----------------------------------------------------------------------+\n| Title:\tMeanProportionalElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class MeanProportionalElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Given lines S,T,U cut off from U a mean proportional U' so that |\n | S:U'=U':T |\n +--------------------------------------------------------------------*/\n\n private _S0: PointElement;\n private _S1: PointElement;\n private _T0: PointElement;\n private _T1: PointElement;\n private _U0: PointElement;\n private _U1: PointElement;\n\n constructor(S0: PointElement, S1: PointElement, T0: PointElement,\n T1: PointElement, U0: PointElement, U1: PointElement) {\n super();\n this.dimension = 0;\n this._S0 = S0; this._S1 = S1;\n this._T0 = T0; this._T1 = T1;\n this._U0 = U0; this._U1 = U1;\n if (U0._AP === U1._AP) {\n this._AP = U0._AP;\n }\n }\n\n public update() {\n let factor : number = Math.sqrt(this._S0.distance2(this._S1) * this._T0.distance2(this._T1));\n factor = Math.sqrt(factor / this._U0.distance2(this._U1));\n this.to(this._U1).minus(this._U0);\n this.times(factor).plus(this._U0);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tMidpoint.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class Midpoint extends PointElement {\n _A : PointElement;\n _B : PointElement;\n\n constructor(A: PointElement, B: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n if (this._A.AP == this._B.AP) {\n this._AP = this._A.AP;\n }\n }\n\n public update() : void {\n this._x = (this._A.x + this._B.x) / 2.0;\n this._y = (this._A.y + this._B.y) / 2.0;\n this._z = (this._A.z + this._B.z) / 2.0;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneFootElement.ts |\n| Originally: PlaneFoot.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneFootElement extends PointElement {\n // foot of perpendicular from point A to the ambient plane AP\n\n private _A: PointElement;\n\n constructor(A: PointElement, P: PlaneElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._AP = P;\n }\n\n public update() {\n this.to(this._A).toPlane(this._AP);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneIntersection.ts |\n| Originally: IntersectionPL.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n| |\n| NOTE: This file was previously a copy of Intersection.ts |\n| (line-line intersection). Rewritten 2026-04-12 to implement the |\n| actual plane-line intersection via toIntersectionPL(). |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneIntersection extends PointElement {\n // this point is the intersection of the ambient plane AP and the line AB\n\n private _A: PointElement;\n private _B: PointElement;\n\n constructor(AP: PlaneElement, A: PointElement, B: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._AP = AP;\n }\n\n update(): void {\n this.toIntersectionPL(this._AP, this._A, this._B);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneSlider extends PointElement {\n\n // this point can be dragged anywhere on the ambient plane AP\n\n protected _initx : number;\n protected _inity : number;\n protected _initz : number;\n\n protected _newP : PointElement = new PointElement();\n\n constructor(Qval : PlaneElement, xVal : number, yVal : number, zVal : number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._AP = Qval;\n this._x = this._initx = xVal;\n this._y = this._inity = yVal;\n this._z = this._initz = zVal;\n }\n\n public update() : void {\n this.toPlane(this._AP);\n }\n\n public reset() : void {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toPlane(this._AP);\n }\n\n public drag(tox : number, toy : number) : boolean {\n this._x = tox;\n this._y = toy;\n if (!this.defined()) { this._z = this._initz; }\n this._newP.to(this).uptoPlane(this._AP);\n if(this._newP.defined()) {\n this.to(this._newP);\n } else {\n this.toPlane(this._AP);\n }\n\n return true;\n }\n\n\n\n}\n","// Animations targeting PointElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {PointElement} from \"./PointElement\";\n\n// A.Point.appear — the marker radius scales from 0 to its final value\n// over a short duration. Args: none. Used as the simplest reveal for a\n// point that lands at a constructed position (e.g. Joyce's \"point C at\n// which the circles cut\").\nexport class PointAppearAnimation extends Animation {\n public animationMethod = AllAnimations.POINT_APPEAR;\n public name = \"Point.appear\";\n public elementType = PointElement;\n public defaultDurationMs = 350;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [{\n durationMs: this.defaultDurationMs,\n tick: (progress) => {\n target.drawProgress = progress;\n },\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n }];\n }\n}\n\nregisterAnimation(new PointAppearAnimation());\n","/*----------------------------------------------------------------------+\n| Point construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions, PointConstructions,\n CircleConstructions, GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {CircumcircleElement} from \"../circle/CircumcircleElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"./PointElement\";\nimport {FixedPoint} from \"./FixedPoint\";\nimport {PlaneSlider} from \"./PlaneSlider\";\nimport {Midpoint} from \"./Midpoint\";\nimport {Intersection} from \"./Intersection\";\nimport {PlaneIntersection} from \"./PlaneIntersection\";\nimport {LineSlider} from \"./LineSlider\";\nimport {Layoff} from \"./Layoff\";\nimport {Foot} from \"./Foot\";\nimport {PlaneFootElement} from \"./PlaneFootElement\";\nimport {CircleSlider} from \"./CircleSlider\";\nimport {SimilarElement} from \"./SimilarElement\";\nimport {ProportionElement} from \"./ProportionElement\";\nimport {AngleDividerElement} from \"./AngleDividerElement\";\nimport {MeanProportionalElement} from \"./MeanProportionalElement\";\nimport {HarmonicElement} from \"./HarmonicElement\";\nimport {InvertPointElement} from \"./InvertPointElement\";\nimport {SphereSliderElement} from \"./SphereSliderElement\";\nimport {Perpendicular} from \"../line/Perpendicular\";\nimport {PlanePerpendicularLine} from \"../line/PlanePerpendicularLine\";\nimport {SphereElement} from \"../sphere/SphereElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\n\n/***********************\n * Element Class Point *\n ***********************/\n\n/* point\n * free\n * integers x, y\n * a freely dragable point in the screen plane with initial coordinates (x,y,0)\n * (Java: Slate.java point case 0 — new PlaneSlider(screen, x, y, 0))\n */\nexport class FreePointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.free;\n signature: ConstructionSignature = { points: 0, elements: 0, integers: 2 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlaneSlider(screen, N[0], N[1], 0);\n\n return [[g], g];\n }\n\n}\n\n// point\n// midpoint\n// points A, B\n// the midpoint of a line AB\n// (Java: Slate.java point case 1 — new Midpoint(A, B))\nexport class MidPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.midpoint;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Midpoint(P[0], P[1]);\n\n return [[g], g];\n }\n}\n\n// point\n// intersection\n// points A, B, C, D [, plane E = screen]\n// the intersection of two lines AB and CD in the plane E\n// (Java: Slate.java point case 2 — new Intersection(A,B,C,D,E))\nexport class IntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.intersection;\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 4 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new Intersection(P[0], P[1], P[2], P[3], plane);\n return [[g], g];\n }\n}\n\n// point\n// intersection (plane-line variant)\n// plane A, points B, C\n// the intersection of the plane A and the line BC\n// (Java: IntersectionPL.java — TS: PlaneIntersection.ts, renamed for clarity)\nexport class PlaneIntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.intersection;\n signature: ConstructionSignature = { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneIntersection(E[0] as PlaneElement, P[0], P[1]);\n return [[g], g];\n }\n}\n\n// point\n// first\n// points A, B\n// the first end A of the line AB\n// (Java: Slate.java point case 3 — returns P[0], preexists=true)\nexport class FirstPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.first;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], P[0]];\n }\n\n}\n\n// point\n// last\n// points A, B\n// the last end B of the line AB\n// (Java: Slate.java point case 4 — returns P[1], preexists=true)\nexport class LastPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.last;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], P[1]];\n }\n}\n\n// point\n// center\n// circle A\n// the center of the circle A\n// (Java: Slate.java point case 5, choice 0 — returns ((CircleElement)E[0]).Center)\nexport class CircleCenterConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.center;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 0, elementTypes: [CircleElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], (E[0] as CircleElement).Center as PointElement];\n }\n}\n\n// point\n// center (sphere variant)\n// sphere A\n// the center of the sphere A\n// (Java: Slate.java point case 5, choice 1 — returns ((SphereElement)E[0]).Center)\nexport class SphereCenterConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.center;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 0, elementTypes: [SphereElement] };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], (E[0] as SphereElement).Center as PointElement];\n }\n}\n\n// point\n// lineSlider\n// points A, B, integers x, y, [z=0]\n// a point that slides along a line AB with initial coordinates (x,y,z)\n// (Java: Slate.java point case 6 — new LineSlider(A,B,x,y,z,false))\nexport class LineSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.lineSlider;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 2 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.E.length === 0 && (sp.N.length === 2 || sp.N.length === 3);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = this.createSlider(P[0], P[1], N[0], N[1], N.length > 2 ? N[2] : 0);\n return [[g], g];\n }\n protected createSlider(a: PointElement, b: PointElement, x: number, y: number, z: number) {\n return new LineSlider(a, b, x, y, z, false);\n }\n}\n\n// point\n// circleSlider\n// circle A, integers x, y, [z=0]\n// a point that slides along a circle A with given initial coordinates (x,y,z)\n// (Java: Slate.java point case 7 — new CircleSlider(E[0], x, y, z))\nexport class CircleSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.circleSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 2, elementTypes: [CircleElement] };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 0 && sp.E.length === 1 && (sp.N.length === 2 || sp.N.length === 3)\n && sp.E[0] instanceof CircleElement;\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new CircleSlider(E[0] as CircleElement, N[0], N[1], N.length > 2 ? N[2] : 0);\n return [[g], g];\n }\n}\n\n// circle\n// circumcircle — points A, B, C [, plane D = screen]\n// the circle passing through 3 points A, B, and C in the plane D\n// (Java: Slate.java circle case 1 — new Circumcircle(A,B,C,D))\nexport class CircumcircleConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructions.circumcircle;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircumcircleElement(P[0], P[1], P[2], plane);\n return [[g], g];\n }\n}\n\n// point\n// circumcenter — points A, B, C [, plane D = screen]\n// the center of a circle ABC passing through 3 points A, B, and C in the plane D\n// (Java: Slate.java point case 8 — new Circumcircle(A,B,C,D), returns circ.Center)\nexport class CircumcenterConstruction extends CircumcircleConstruction {\n constructionMethod: AllConstructions = PointConstructions.circumcenter;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let es = super.construct(screen, P, E, N);\n let g : CircleElement = es[1] as CircleElement;\n es[0].push(g.Center);\n return [es[0], g.Center];\n }\n}\n\n/* point\n * foot\n * points A, B, C\n * the foot of a perpendicular drawn from A to a line BC\n */\n// (Java: Slate.java point case 10, choice 0 — new Foot(A,B,C))\nexport class FootPointConstruction extends Construction {\n constructionMethod : AllConstructions = PointConstructions.foot;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) : [GeomElementsForUpdate, GeomElement] {\n let g = new Foot(P[0], P[1], P[2]);\n\n return [[g], g];\n }\n}\n\n// point\n// foot (plane variant — solid geometry)\n// point A plane B\n// the foot of a perpendicular drawn from A to a plane B\n// (Java: PlaneFoot.java — TS: PlaneFootElement.ts, renamed for clarity)\nexport class PlaneFootPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.foot;\n signature: ConstructionSignature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneFootElement(P[0], E[0] as PlaneElement);\n return [[g], g];\n }\n}\n\n// point\n// layoff used for extend and cutoff\nexport abstract class LayoffConstruction extends Construction {\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = this._createLayoff(P);\n return [[g], g];\n }\n\n protected abstract _createLayoff(ps: PointElement[]) : GeomElement;\n}\n\n// point\n// cutoff\n// points A, B, C, D\n// the point E on a line AB so that AE = CD\n// (Java: Slate.java point case 11 — new Layoff(A,A,B,C,D))\nexport class CutoffConstruction extends LayoffConstruction {\n constructionMethod: AllConstructions = PointConstructions.cutoff;\n protected _createLayoff(ps: PointElement[]) : GeomElement {\n return new Layoff(ps[0], ps[0], ps[1], ps[2], ps[3]);\n }\n}\n\n// point\n// extend\n// points A, B, C, D\n// the point E on a line AB so that BE = CD\n// (Java: Slate.java point case 12 — new Layoff(B,A,B,C,D))\nexport class ExtendConstruction extends LayoffConstruction {\n constructionMethod: AllConstructions = PointConstructions.extend;\n protected _createLayoff(ps: PointElement[]) : GeomElement {\n return new Layoff(ps[1], ps[0], ps[1], ps[2], ps[3]);\n }\n}\n\n// point\n// parallelogram\n// points C, A, B\n// the 4th vertex D' of the parallelogram C-A-B-D' given 3 vertices C, A, B\n// D' = C + (B - A) [reuses Layoff with equal direction and length vectors]\n// (Java: Slate.java point case 13 — new Layoff(C,A,B,A,B))\nexport class ParallelogramConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.parallelogram;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// point\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the point H so that triangle ABH in plane C is similar to triangle DEF in plane G\n// (Java: Slate.java point case 14 — Similar.java)\nexport class SimilarPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let g = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n return [[g], g];\n }\n}\n\n// point perpendicular constructions\nexport abstract class PointPerpendicularConstruction extends Construction {\n constructionMethod : AllConstructions = PointConstructions.perpendicular;\n}\n\n\n/* point\n * perpendicular\n * points A, B, [plane C (screen)]\n * the point D so that AD is equal and perpendicular to AB in plane C\n * (Java: Slate.java point case 15, choice 0 — new Perpendicular(A,B,screen,A,B))\n */\nexport class PointPerpendicular1Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:screen, E:P[0], F:P[1]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, plane C\n * the point D so that AD is equal and perpendicular to AB in plane C\n * (Java: Slate.java point case 15, choice 1 — new Perpendicular(A,B,C,A,B))\n */\nexport class PointPerpendicular2Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:E[0] as PlaneElement, E:P[0], F:P[1]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, D, E [plane C (screen)]\n * the point F so that AF is perpendicular to AB in plane C and equals DE\n * (Java: Slate.java point case 15, choice 2 — new Perpendicular(A,B,screen,D,E))\n */\nexport class PointPerpendicular3Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:screen, E:P[2], F:P[3]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, plane C, points D, E\n * the point F so that AF is perpendicular to AB in plane C and equals DE\n * (Java: Slate.java point case 15, choice 3 — new Perpendicular(A,B,C,D,E))\n */\nexport class PointPerpendicular4Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 4, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:E[0] as PlaneElement, E:P[2], F:P[3]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * point A, plane B, points C, D\n * the point E on the line perpendicular to plane B passing through\n * A so that the distance from E to B equals CD\n * (Java: Slate.java point case 15, choice 4 — new PlanePerpendicular(A,B,C,D))\n */\nexport class PointPerpendicular5Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 3, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlanePerpendicularLine({C:P[0], P:E[0] as PlaneElement, D:P[1], E:P[2]});\n return [[g], g.B];\n }\n}\n\n\n// point\n// proportion\n// 8 points S0, S1, T0, T1, U0, U1, V0, V1\n// the point V' on V0V1 so that |S0S1|:|T0T1| = |U0U1|:|V0V'|\n// (Java: Proportion.java — 26 lines, line-for-line port)\nexport class ProportionPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.proportion;\n signature: ConstructionSignature = { points: 8, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new ProportionElement(P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7]);\n return [[g], g];\n }\n}\n\n// point\n// invert\n// point A circle B\n// the image of a point A inverted in the circle B\n// (Java: InvertPoint.java — 16 lines, calls toInvertPoint(A, C))\nexport class InvertPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.invert;\n signature: ConstructionSignature = { points: 1, elements: 1, integers: 0, elementTypes: [CircleElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new InvertPointElement(P[0], E[0] as CircleElement);\n return [[g], g];\n }\n}\n\n// point\n// meanProportional\n// 6 points S0, S1, T0, T1, U0, U1\n// the point U' on U0U1 so that S:U' = U':T (geometric mean)\n// (Java: MeanProportional.java — 23 lines, line-for-line port)\nexport class MeanProportionalPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.meanProportional;\n signature: ConstructionSignature = { points: 6, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new MeanProportionalElement(P[0], P[1], P[2], P[3], P[4], P[5]);\n return [[g], g];\n }\n}\n\n// point\n// planeSlider\n// plane A integers x, y, z\n// a point that slides on the plane A with initial coordinates (x,y,z)\n// (Java: Slate.java point case 19 — new PlaneSlider((PlaneElement)E[0], N[0], N[1], N[2]).\n// PlaneSlider.ts already has the full constructor + update() + drag().)\nexport class PlaneSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.planeSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 3, elementTypes: [PlaneElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneSlider(E[0] as PlaneElement, N[0], N[1], N[2]);\n return [[g], g];\n }\n}\n\n// point\n// sphereSlider\n// sphere A integers x, y, z\n// a point that slides on the sphere A with initial coordinates (x,y,z)\n// (Java: SphereSlider.java — 43 lines, line-for-line port)\nexport class SphereSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.sphereSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 3, elementTypes: [SphereElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new SphereSliderElement(E[0] as SphereElement, N[0], N[1], N[2]);\n return [[g], g];\n }\n}\n\n// point\n// angleBisector — points B, A, C [, plane D = screen]\n// bisect angle BAC — the point on BC where the bisector from A meets BC\n// (Java: AngleDivider.java with n=2, Slate.java point case 21)\nexport class AngleBisectorPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.angleBisector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new AngleDividerElement(P[0], P[1], P[2], plane, 2);\n return [[g], g];\n }\n}\n\n// point\n// angleDivider — points B, A, C, integer n [, plane D = screen]\n// n-sect angle BAC — the point on BC where the 1/n ray from A meets BC\n// (Java: AngleDivider.java with variable n, Slate.java point case 22)\nexport class AngleDividerPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.angleDivider;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new AngleDividerElement(P[0], P[1], P[2], plane, N[0]);\n return [[g], g];\n }\n}\n\n// point\n// fixed\n// integers x, y [, z=0]\n// the fixed point with coordinates (x, y, z). z defaults to 0 if not provided.\n// (Java: Slate.java point case 23 — new FixedPoint(x,y,z))\nexport class FixedPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.fixed;\n signature: ConstructionSignature = { points: 0, elements: 0, integers: 2 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 0 && sp.E.length === 0 && (sp.N.length === 2 || sp.N.length === 3);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new FixedPoint({x:N[0], y:N[1], z: N.length > 2 ? N[2] : 0});\n return [[g], g];\n }\n}\n\n// point\n// lineSegmentSlider\n// points A, B, integers x, y, [z]\n// a point that slides along within the line segment AB with initial coordinates (x,y,z)\n// (Java: Slate.java point case 24 — new LineSlider(A,B,x,y,z,true))\nexport class LineSliderSegmentConstruction extends LineSliderConstruction {\n constructionMethod: AllConstructions = PointConstructions.lineSegmentSlider;\n protected createSlider(a: PointElement, b: PointElement, x: number, y: number, z: number) {\n return new LineSlider(a, b, x, y, z, true);\n }\n}\n\n\n// point\n// harmonic\n// points B, C, D\n// the harmonic conjugate of B with respect to C and D\n// (Java: Harmonic.java — 43 lines, line-for-line port.\n// Slate.java point case 25 — new Harmonic(P[0], P[1], P[2]))\nexport class HarmonicPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.harmonic;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new HarmonicElement(P[0], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// point\n// vertex\n// polygon A, integer n\n// the nth vertex (1-based) of polygon A\n// (Java: Slate.java point case 9 — returns ((PolygonElement)E[0]).V[n-1])\nexport class VertexConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.vertex;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 1, elementTypes: [PolygonElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const poly = E[0] as PolygonElement;\n const vertex = poly.V[N[0] - 1];\n return [[vertex], vertex];\n }\n}\n\nexport const pointConstructions: Construction[] = [\n new FreePointConstruction(),\n new FixedPointConstruction(),\n new FirstPointConstruction(),\n new LastPointConstruction(),\n new CircleCenterConstruction(),\n new CircumcenterConstruction(),\n new MidPointConstruction(),\n new IntersectionConstruction(),\n new FootPointConstruction(),\n new PlaneFootPointConstruction(),\n new ExtendConstruction(),\n new CutoffConstruction(),\n new ParallelogramConstruction(),\n new SimilarPointConstruction(),\n new ProportionPointConstruction(),\n new AngleBisectorPointConstruction(),\n new AngleDividerPointConstruction(),\n new MeanProportionalPointConstruction(),\n new PlaneSliderConstruction(),\n new SphereSliderConstruction(),\n new HarmonicPointConstruction(),\n new InvertPointConstruction(),\n new PlaneIntersectionConstruction(),\n new SphereCenterConstruction(),\n new CircumcircleConstruction(),\n new LineSliderConstruction(),\n new LineSliderSegmentConstruction(),\n new CircleSliderConstruction(),\n new PointPerpendicular1Construction(),\n new PointPerpendicular2Construction(),\n new PointPerpendicular3Construction(),\n new PointPerpendicular4Construction(),\n new PointPerpendicular5Construction(),\n new VertexConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPointElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport interface IPointElementConstruction {\n x? : number;\n y? : number;\n z? : number;\n AP? : PlaneElement;\n}\n\nexport class PointElement extends GeomElement {\n\n protected _x : number;\n protected _y : number;\n protected _z : number;\n _AP : PlaneElement;\n\n constructor(ip? : IPointElementConstruction) {\n super();\n this.dimension = 0;\n this._x = ip && ip.x || 0;\n this._y = ip && ip.y || 0;\n this._z = ip && ip.z || 0;\n this._AP = ip && ip.AP || null;\n }\n\n get x() { return this._x }\n set x(value: number) { this._x = value }\n get y() { return this._y }\n set y(value: number) { this._y = value }\n get z() { return this._z }\n set z(value: number) { this._z = value }\n\n get AP() { return this._AP; }\n set AP(v : PlaneElement) { this._AP = v; }\n\n\n public defined() : boolean {\n return !isNaN(this._x) && !isNaN(this._y) && !isNaN(this._z)\n && this._x != null && true && this._y != null && true && this._z != null;\n }\n\n to(B : PointElement ) : PointElement {this._x = B._x; this._y = B._y; this._z= B._z; return this;}\n plus(B : PointElement ) : PointElement {this._x += B._x; this._y += B._y; this._z+= B._z; return this;}\n minus(B : PointElement) : PointElement {this._x -= B._x; this._y -= B._y; this._z-= B._z; return this;}\n times(a : number) : PointElement {this._x *= a; this._y *= a; this._z *= a; return this;}\n\n static difference(A : PointElement, B : PointElement) : PointElement {\n return new PointElement({x:A.x-B.x, y:A.y-B.y, z:A.z-B.z, AP: null});\n }\n\n static product(a : number, B : PointElement) : PointElement {\n return new PointElement({x:a*B.x, y:a*B.y, z:a*B.z, AP: null});\n }\n\n static dot(A : PointElement, B : PointElement) : number {\n return A.x * B.x + A.y * B.y + A.z * B.z;\n }\n\n public length2() : number {\n return this._x * this._x + this._y * this._y + this._z * this._z;\n }\n\n public length() : number {\n return Math.sqrt(this.length2());\n }\n\n public distance2(B : PointElement) : number {\n return (this._x-B.x)*(this._x-B.x) +\n (this._y-B.y)*(this._y-B.y) +\n (this._z-B.z)*(this._z-B.z);\n }\n\n public distance(B : PointElement) : number {\n return Math.sqrt(this.distance2(B));\n }\n\n public toCross(A : PointElement, B : PointElement) : PointElement {\n // set to the cross product of A and B\n this._x = A.y*B.z - A.z*B.y;\n this._y = A.z*B.x - A.x*B.z;\n this._z = A.x*B.y - A.y*B.x;\n return this;\n }\n\n public static cross(A: PointElement, B: PointElement) : PointElement {\n // return the cross product of A and B\n return new PointElement({x: A.y*B.z - A.z*B.y,\n y: A.z*B.x - A.x*B.z,\n z: A.x*B.y - A.y*B.x,\n AP: null});\n }\n\n public static triple(A: PointElement, B: PointElement, C: PointElement) : number {\n // return the triple product of A, B, and C\n return A.x*(B.y*C.z - B.z*C.y) +\n B.x*(C.y*A.z - C.z*A.y) +\n C.x*(A.y*B.z - A.z*B.y);\n }\n\n toLine(A: PointElement, B: PointElement, segment: boolean) : PointElement{\n /*---------------------------------------------------------------------+\n | Project this point to the foot of the perpendicular from it to the |\n | line determined by the points A and B. If A were the origin, then |\n | the foot would be at ((this dot B)/B^2) B. When segment is true |\n | and the foot is beyond A or B, then move the point to the closer |\n | of A and B. |\n +---------------------------------------------------------------------*/\n let V : PointElement = PointElement.difference(B,A);\n this.minus(A);\n let factor : number= PointElement.dot(V,this)/V.length2();\n if (segment) {\n if (factor < 0.0) factor = 0.0;\n else if (factor > 1.0) factor = 1.0;\n }\n V.times(factor);\n return this.to(V).plus(A);\n }\n\n\n public toPlane (P : PlaneElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Project this point to the foot of the perpendicular from it to the |\n | plane P. |\n +---------------------------------------------------------------------*/\n if (P.isScreen) {\n this._z = 0.0;\n } else {\n this.minus(P.A);\n let s : number = PointElement.dot(this, P.S);\n let t = PointElement.dot(this, P.T);\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n uptoPlane(P : PlaneElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Project this point to the point on the plane P where the vertical |\n | line through this meets P. |\n +---------------------------------------------------------------------*/\n if (P.isScreen) {\n this._z = 0.0;\n } else {\n this.minus(P.A);\n let den : number = P.S.x*P.T.y - P.S.y*P.T.x;\n let s : number = (this.x*P.T.y - this.y*P.T.x) / den;\n let t : number = (this.y*P.S.x - this.x*P.S.y) / den;\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n\n toCircumcenter (A: PointElement, B: PointElement, C: PointElement) : PointElement{\n /*---------------------------------------------------------------------+\n | Move this point to the center of the circle passing through the |\n | points A, B, and C. |\n +---------------------------------------------------------------------*/\n if (A.z == 0.0 && B.z == 0.0 && C.z == 0.0) {\n let u : number = ((A.x-B.x)*(A.x+B.x) + (A.y-B.y)*(A.y+B.y)) / 2.0;\n let v : number = ((B.x-C.x)*(B.x+C.x) + (B.y-C.y)*(B.y+C.y)) / 2.0;\n let den : number = (A.x-B.x)*(B.y-C.y) - (B.x-C.x)*(A.y-B.y);\n this._x = (u * (B.y-C.y) - v*(A.y-B.y)) / den;\n this._y = (v * (A.x-B.x) - u*(B.x-C.x)) / den;\n this._z = 0.0;\n } else {\n let BmA : PointElement = PointElement.difference(B,A)\n let CmA : PointElement = PointElement.difference(C,A);\n let BC : number = PointElement.dot(BmA,CmA);\n let B2 : number = BmA.length2();\n let C2 : number = CmA.length2();\n //double BC2 = BC*BC;\n let den : number = 2.0*(B2*C2-BC*BC);\n let s : number = C2*(B2-BC)/den;\n let t : number = B2*(C2-BC)/den;\n this.to(A).plus(BmA.times(s)).plus(CmA.times(t));\n }\n return this;\n }\n\n toCircle (C: CircleElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Move this point to the nearest point on the circle C. |\n +---------------------------------------------------------------------*/\n if (C.AP.isScreen) {\n let factor : number = C.radius / this.distance(C.Center);\n this._x = C.Center.x + factor*(this._x - C.Center.x);\n this._y = C.Center.y + factor*(this._y - C.Center.y);\n this._z = 0.0;\n } else { // 3d case: project to plane of circle then move to sphere of circle\n this.toPlane(C.AP);\n this.toSphere(C.Center,C.radius);\n }\n return this;\n }\n\n toSphere (Center : PointElement, radius : number) : PointElement{\n /*---------------------------------------------------------------------+\n | Move this point to the nearest point on the sphere S. |\n +---------------------------------------------------------------------*/\n let factor : number = radius / this.distance(Center);\n this._x = Center.x + factor*(this._x - Center.x);\n this._y = Center.y + factor*(this._y - Center.y);\n this._z = Center.z + factor*(this._z - Center.z);\n return this;\n }\n\n public static area(A: PointElement, B: PointElement, C: PointElement) {\n // return the area of the triangle ABC\n let U : PointElement = PointElement.difference(B,A);\n let V : PointElement = PointElement.difference(C,A);\n return this.cross(U,V).length()/2.0;\n }\n\n public angle(B: PointElement, C: PointElement, P: PlaneElement) : number {\n // Determine the angle BAC in the plane P where this is A.\n // The angle lies between -pi and pi (-180 degrees and 180 degrees)\n let Bx : number = B.x - this._x, Cx = C.x - this._x;\n let By : number = B.y - this._y, Cy = C.y - this._y;\n if (P.isScreen) {\n return Math.atan2 (Bx*Cy - By*Cx, Bx*Cx + By*Cy);\n } else { // 3d case. First get P-coordinates for B and C\n let Bz : number = B.z -this._z, Cz = C.z -this._z;\n let Bs : number = Bx * P.S.x + By * P.S.y + Bz * P.S.z;\n let Bt : number = Bx * P.T.x + By * P.T.y + Bz * P.T.z;\n let Cs : number = Cx * P.S.x + Cy * P.S.y + Cz * P.S.z;\n let Ct : number = Cx * P.T.x + Cy * P.T.y + Cz * P.T.z;\n return Math.atan2(Bs * Ct - Bt * Cs, Bs * Cs + Bt * Ct);\n }\n }\n\n toIntersection (\n A: PointElement,\n B: PointElement,\n C: PointElement,\n D: PointElement,\n P: PlaneElement) : PointElement {\n if (P.isScreen) {\n // move this point to where the two lines AB and CD meet\n let d0 : number = A.x*B.y - A.y*B.x;\n let d1 : number = C.x*D.y - C.y*D.x;\n let den : number = (B.y-A.y)*(C.x-D.x) - (A.x-B.x)*(D.y-C.y);\n this._x = (d0*(C.x-D.x) - d1*(A.x-B.x)) / den;\n this._y = (d1*(B.y-A.y) - d0*(D.y-C.y)) / den;\n } else { // 3d case\n let AmA : PointElement = PointElement.difference(A,P.A);\n let BmA : PointElement = PointElement.difference(B,P.A);\n let CmA : PointElement = PointElement.difference(C,P.A);\n let DmA : PointElement = PointElement.difference(D,P.A);\n let Ax = PointElement.dot(AmA,P.S);\n let Ay = PointElement.dot(AmA,P.T);\n let Bx = PointElement.dot(BmA,P.S);\n let By = PointElement.dot(BmA,P.T);\n let Cx = PointElement.dot(CmA,P.S);\n let Cy = PointElement.dot(CmA,P.T);\n let Dx = PointElement.dot(DmA,P.S);\n let Dy = PointElement.dot(DmA,P.T);\n let d0 = Ax*By - Ay*Bx;\n let d1 = Cx*Dy - Cy*Dx;\n let den = (By-Ay)*(Cx-Dx) - (Ax-Bx)*(Dy-Cy);\n let s = (d0*(Cx-Dx) - d1*(Ax-Bx)) / den;\n let t = (d1*(By-Ay) - d0*(Dy-Cy)) / den;\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n toIntersectionPL (\n P: PlaneElement,\n D: PointElement,\n E: PointElement) : PointElement {\n // move this point to where the plane P meets the line DE\n this.to(E).minus(D);\n let DmA : PointElement = PointElement.difference(D,P.A);\n let u : number = -PointElement.triple(P.S,P.T,DmA)\n / PointElement.triple(P.S,P.T,this);\n return this.times(u).plus(D);\n }\n\n toInvertPoint (A: PointElement, C: CircleElement) : PointElement {\n // move this point to the inversion of the point A in the circle C\n let factor : number = C.radius2 / A.distance2(C.Center);\n return this.to(A).minus(C.Center).times(factor).plus(C.Center);\n }\n\n toSimilar (\n A: PointElement,\n B: PointElement,\n P : PlaneElement,\n D: PointElement,\n E: PointElement,\n F: PointElement,\n Q: PlaneElement) : PointElement {\n // move this point to the location C so that triangle ABC is similar\n // to triangle DEF.\n let theta : number = D.angle(E,F,Q);\n let co : number = Math.cos(theta), si : number = Math.sin(theta);\n let factor : number = D.distance(F) / D.distance(E);\n if (P.isScreen) {\n this._x = B.x;\n this._y = B.y;\n this.rotate(A,co,si,P);\n this._x = A.x + factor*(this._x - A.x);\n this._y = A.y + factor*(this._y - A.y);\n this._z = 0.0;\n } else {\n let BmA : PointElement = PointElement.difference(B,A);\n let s : number = PointElement.dot(BmA,P.S);\n let t : number = PointElement.dot(BmA,P.T);\n let ss : number = factor*(co*s - si*t);\n let tt : number = factor*(si*s + co*t);\n this._x = ss*P.S.x + tt*P.T.x + A.x;\n this._y = ss*P.S.y + tt*P.T.y + A.y;\n this._z = ss*P.S.z + tt*P.T.z + A.z;\n }\n return this;\n }\n\n public rotate ( pivot : PointElement,\n ac : number,\n as : number,\n plane?: PlaneElement) : void {\n /*--------------------------------------------------------------------------+\n | Scale and rotate this point around the axis through the pivot and\t\t|\n | perpendicular to the plane. Scale by a factor of a, and rotate by the\t|\n | angle theta where ac = a cos theta, and as = a sin theta.\t\t\t|\n +--------------------------------------------------------------------------*/\n if (plane == null) plane = pivot._AP;\n if (this == pivot) return;\n if (plane.isScreen) {\n let dx : number = this.x - pivot.x;\n let dy : number = this.y - pivot.y;\n this._x = pivot.x + ac*dx - as*dy;\n this._y = pivot.y + as*dx + ac*dy;\n } else {\n this.minus(pivot);\n let S : PointElement = plane.S;\n let T : PointElement = plane.T;\n let U : PointElement = plane.U;\n let s : number = PointElement.dot(this,S);\n let t : number = PointElement.dot(this,T);\n let z1 : number = PointElement.dot(this,U);\n let x1 : number = ac*s - as*t;\n let y1 : number = as*s + ac*t;\n this._x = pivot.x + x1*S.x + y1*T.x + z1*U.x;\n this._y = pivot.y + x1*S.y + y1*T.y + z1*U.y;\n this._z = pivot.z + x1*S.z + y1*T.z + z1*U.z;\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n this.drawString(Math.round(this.x), Math.round(this.y), c)\n }\n }\n\n public drawVertex(c: SlateCanvas, color?: string): void {\n if (!this.visible) return;\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.vertexHighlightColor;\n } else {\n color = this.vertexColor;\n }\n }\n if (color == null) return;\n // Radius interpolates by emphasisAmount: baseline 2 (normal) or\n // 4 (highlight) → 6 at full emphasis. drawProgress then scales\n // the result so A.Point.appear can pulse the marker in from 0.\n const baseR = this.shouldHighlight ? 4 : 2;\n let r = baseR + this.emphasisAmount * (6 - baseR);\n r *= this.drawProgress;\n if (r < 0.5) return; // avoid degenerate sub-pixel arcs\n ctx.beginPath();\n ctx.fillStyle = color;\n ctx.arc(this._x, this._y, r, 0, 2*Math.PI, false);\n ctx.fill();\n }\n\n\n public translate(dx: number, dy: number): void {\n this._x += dx;\n this._y += dy;\n }\n\n public update(): void {\n }\n\n public drawEdge(c: SlateCanvas): void {\n }\n\n public drawFace(c: SlateCanvas): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tProportionElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class ProportionElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Given lines S(S0,S1), T(T0,T1), U(U0,U1), V(V0,V1), cut off from |\n | V a fourth proportional V' so that S:T = U:V'. |\n +--------------------------------------------------------------------*/\n\n private _S0: PointElement;\n private _S1: PointElement;\n private _T0: PointElement;\n private _T1: PointElement;\n private _U0: PointElement;\n private _U1: PointElement;\n private _V0: PointElement;\n private _V1: PointElement;\n\n constructor(S0: PointElement, S1: PointElement, T0: PointElement,\n T1: PointElement, U0: PointElement, U1: PointElement,\n V0: PointElement, V1: PointElement) {\n super();\n this.dimension = 0;\n this._S0 = S0; this._S1 = S1;\n this._T0 = T0; this._T1 = T1;\n this._U0 = U0; this._U1 = U1;\n this._V0 = V0; this._V1 = V1;\n if (V0._AP === V1._AP) {\n this._AP = V0._AP;\n }\n }\n\n public update() {\n let factor : number = this._T0.distance2(this._T1) * this._U0.distance2(this._U1)\n / (this._S0.distance2(this._S1) * this._V0.distance2(this._V1));\n factor = Math.sqrt(factor);\n this.to(this._V1).minus(this._V0);\n this.times(factor).plus(this._V0);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSimilarElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class SimilarElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Construct a triangle AB(this) in the plane AP similar to the |\n | triangle DEF in the plane Q. |\n +--------------------------------------------------------------------*/\n\n private _parentA: PointElement;\n private _parentB: PointElement;\n private _D: PointElement;\n private _E: PointElement;\n private _F: PointElement;\n private _Q: PlaneElement;\n\n constructor(A: PointElement, B: PointElement, AP: PlaneElement,\n D: PointElement, E: PointElement, F: PointElement,\n Q: PlaneElement) {\n super();\n this.dimension = 0;\n this._parentA = A;\n this._parentB = B;\n this._AP = AP;\n this._D = D;\n this._E = E;\n this._F = F;\n this._Q = Q;\n }\n\n public update() {\n this.toSimilar(this._parentA, this._parentB, this._AP,\n this._D, this._E, this._F, this._Q);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSphereSliderElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\n\nexport class SphereSliderElement extends PointElement {\n\n private _S: SphereElement;\n private _initx: number;\n private _inity: number;\n private _initz: number;\n\n constructor(S: SphereElement, x: number, y: number, z: number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._S = S;\n this._x = this._initx = x;\n this._y = this._inity = y;\n this._z = this._initz = z;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toSphere(this._S.Center, this._S.radius());\n }\n\n public update() {\n this.toSphere(this._S.Center, this._S.radius());\n }\n\n public drag(tox: number, toy: number): boolean {\n let dist2 = (this._S.Center.x - tox) * (this._S.Center.x - tox)\n + (this._S.Center.y - toy) * (this._S.Center.y - toy);\n let r2 = this._S.radius2();\n if (dist2 <= r2) {\n this._x = tox;\n this._y = toy;\n if (this._z > this._S.Center.z)\n this._z = this._S.Center.z + Math.sqrt(r2 - dist2);\n else\n this._z = this._S.Center.z - Math.sqrt(r2 - dist2);\n } else {\n // beyond shadow of sphere\n tox -= this._S.Center.x;\n toy -= this._S.Center.y;\n let factor = Math.sqrt((tox * tox + toy * toy) / r2);\n tox = tox / factor + this._S.Center.x;\n toy = toy / factor + this._S.Center.y;\n if ((tox - this._x) * (tox - this._x) + (toy - this._y) * (toy - this._y) < 0.5)\n return false;\n this._x = tox;\n this._y = toy;\n this._z = this._S.Center.z;\n }\n return true;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tApplicationElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolygonElement} from \"./PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class ApplicationElement extends PolygonElement {\n /*--------------------------------------------------------------------+\n | Apply a polygon P to get a parallelogram |\n | with a side AB in an angle CAB |\n +--------------------------------------------------------------------*/\n\n private _P: PolygonElement;\n private _C: PointElement;\n\n constructor(P: PolygonElement, A: PointElement, B: PointElement, C: PointElement) {\n super();\n this.dimension = 2;\n this._P = P;\n this._C = C;\n this.V = new Array(4);\n this.V[0] = A;\n this.V[1] = B;\n this.V[2] = new PointElement();\n this.V[3] = new PointElement();\n if (A._AP === B._AP && A._AP === C._AP) {\n this.V[2]._AP = A._AP;\n this.V[3]._AP = A._AP;\n }\n }\n\n public translate(dx: number, dy: number) {\n this.V[2].translate(dx, dy);\n this.V[3].translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.V[2].rotate(pivot, ac, as);\n this.V[3].rotate(pivot, ac, as);\n }\n\n public update() {\n let factor : number = this._P.area() / (2.0 * PointElement.area(this.V[0], this.V[1], this._C));\n factor = Math.abs(factor);\n this.V[3].x = this.V[0].x + factor * (this._C.x - this.V[0].x);\n this.V[3].y = this.V[0].y + factor * (this._C.y - this.V[0].y);\n this.V[3].z = this.V[0].z + factor * (this._C.z - this.V[0].z);\n this.V[2].x = this.V[1].x + this.V[3].x - this.V[0].x;\n this.V[2].y = this.V[1].y + this.V[3].y - this.V[0].y;\n this.V[2].z = this.V[1].z + this.V[3].z - this.V[0].z;\n }\n}\n","// Animations targeting PolygonElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {PolygonElement} from \"./PolygonElement\";\n\n// Default per-edge trace rate matches LineAnimations so a polygon's\n// edges feel like the same instrument tracing each side in turn.\nconst DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS = 0.25;\nconst DEFAULT_POLYGON_FILL_MS = 500;\n\n// Total perimeter (closed if V.length > 2, otherwise open) — used to\n// compute the outline duration from edge rate.\nfunction perimeter(poly: PolygonElement): number {\n const n = poly.V.length;\n if (n < 2) return 0;\n let total = 0;\n const closed = n > 2;\n const edgeCount = closed ? n : n - 1;\n for (let i = 0; i < edgeCount; i++) {\n const a = poly.V[i];\n const b = poly.V[(i + 1) % n];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n total += Math.sqrt(dx * dx + dy * dy);\n }\n return total;\n}\n\n// A.Polygon.outline — cascade-trace each edge in V[] order.\n// PolygonElement.drawEdge already partitions drawProgress over edges\n// so a single step driving drawProgress 0 → 1 traces every edge in\n// sequence with the right per-edge proportion.\nexport class PolygonOutlineAnimation extends Animation {\n public animationMethod = AllAnimations.POLYGON_OUTLINE;\n public name = \"Polygon.outline\";\n public elementType = PolygonElement;\n public defaultRate = DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const poly = target as PolygonElement;\n const durationMs = Math.max(180, perimeter(poly) / this.defaultRate);\n return [{\n durationMs,\n tick: (progress) => { poly.drawProgress = progress; },\n finalise: () => {\n poly.drawProgress = 1;\n poly.visible = true;\n },\n }];\n }\n}\n\n// A.Polygon.outlineAndFill — strict sequence: outline-trace step\n// completes first, then a separate fill-fade step. PolygonElement\n// now has two independent fields driving this — drawProgress for the\n// edge trace (consumed by drawEdge) and faceAlpha for the fill\n// (consumed by drawFace). The outline step finalises drawProgress to\n// 1 (full edges) before the fill step starts ticking faceAlpha\n// 0 → 1; the edges remain stable at full while the face fades in.\n//\n// The fade duration is intentionally shorter than the outline trace\n// — the eye has already absorbed the polygon's shape from the trace,\n// so the fill should land quickly. v1: half the outline's runtime,\n// capped by defaultDurationMs.\nexport class PolygonOutlineAndFillAnimation extends Animation {\n public animationMethod = AllAnimations.POLYGON_OUTLINE_AND_FILL;\n public name = \"Polygon.outlineAndFill\";\n public elementType = PolygonElement;\n public defaultRate = DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS;\n public defaultDurationMs = DEFAULT_POLYGON_FILL_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const poly = target as PolygonElement;\n const outlineMs = Math.max(180, perimeter(poly) / this.defaultRate);\n const fullRestore = () => {\n poly.faceAlpha = 1;\n poly.drawProgress = 1;\n poly.visible = true;\n };\n // Step 1 — outline trace.\n const outline: IAnimationStep = {\n durationMs: outlineMs,\n setup: () => {\n poly.drawProgress = 0;\n poly.faceAlpha = 0; // hide fill until step 2\n },\n tick: (progress) => { poly.drawProgress = progress; },\n finalise: () => { poly.drawProgress = 1; },\n };\n // A face-less polygon has nothing to fade — scheduling the\n // fill step anyway would be pure dead time in the middle of\n // a cascade (#81). Run the outline alone, with its finalise\n // doing the full restore.\n if (poly.faceColor == null) {\n outline.finalise = fullRestore;\n return [outline];\n }\n // Fill ~twice as fast as the outline, capped at the\n // class-level default so a giant polygon doesn't yield a\n // glacial fade.\n const fillMs = Math.min(outlineMs / 2, this.defaultDurationMs);\n return [\n outline,\n // Step 2 — face fade-in over the already-traced outline.\n {\n durationMs: fillMs,\n tick: (progress) => { poly.faceAlpha = progress; },\n finalise: fullRestore,\n },\n ];\n }\n}\n\nregisterAnimation(new PolygonOutlineAnimation());\nregisterAnimation(new PolygonOutlineAndFillAnimation());\n","/*----------------------------------------------------------------------+\n| Polygon construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n PolygonConstructions as PolygonConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {SimilarElement} from \"../point/SimilarElement\";\nimport {PolygonElement} from \"./PolygonElement\";\nimport {RegularPolygonElement} from \"./RegularPolygonElement\";\nimport {ApplicationElement} from \"./ApplicationElement\";\nimport {PolyhedronElement} from \"../polyhedron/PolyhedronElement\";\n\n/*************************\n * Element Class Polygon *\n *************************/\n\nexport abstract class PolyConstruction extends Construction {\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PolygonElement(P);\n return [[g],g];\n }\n}\n\n// polygon\n// square — points A, B [, plane C = screen]\n// the square on a side AB in plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: RegularPolygon.java with n=4 — same class as equilateralTriangle)\nexport class SquarePolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.square;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, 4);\n return [[g], g];\n }\n}\n\n// polygon\n// triangle\n// points A, B, C\n// the triangle ABC given 3 vertices A, B, and C\n// (Java: Slate.java polygon case 1 — new PolygonElement(A,B,C))\nexport class TrianglePolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.triangle;\n signature = { points: 3, elements: 0, integers: 0 };\n}\n\n// polygon\n// quadrilateral\n// points A, B, C, D\n// the quadrilateral ABCD given 4 vertices A, B, C, and D\n// (Java: Slate.java polygon case 2 — new PolygonElement(A,B,C,D))\nexport class QuadrilateralPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.quadrilateral;\n signature = { points: 4, elements: 0, integers: 0 };\n}\n\n// polygon\n// pentagon\n// points A, B, C, D, E\n// the pentagon given 5 vertices (free points, not a regular pentagon)\n// (Java: Slate.java polygon case 3 — new PolygonElement(A,B,C,D,E))\nexport class PentagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.pentagon;\n signature = { points: 5, elements: 0, integers: 0 };\n}\n\n// polygon\n// hexagon\n// points A, B, C, D, E, F\n// the hexagon given 6 vertices (free points)\n// (Java: Slate.java polygon case 4 — new PolygonElement(A,B,C,D,E,F))\nexport class HexagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.hexagon;\n signature = { points: 6, elements: 0, integers: 0 };\n}\n\n// polygon\n// equilateralTriangle — points A, B [, plane C = screen]\n// the equilateral triangle on side AB in the plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java polygon case 5 — new RegularPolygon(A,B,plane,3))\nexport class EquilateralTriangleConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.equilateralTriangle;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, 3);\n return [[g], g];\n }\n}\n\n// polygon\n// parallelogram\n// points A, B, C\n// the parallelogram ABCD given A, B, and C, where D = A + (C - B)\n// (no dedicated Java class — Slate.java case 6 dispatches to a Layoff\n// trick identical to the point;parallelogram and line;parallel patterns)\nexport class ParallelogramPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.parallelogram;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n let g = new PolygonElement([P[0], P[1], P[2], lo]);\n return [[lo, g], g];\n }\n}\n\n// polygon\n// regularPolygon — points A, B, integer n [, plane C = screen]\n// the regular n-gon on side AB in the plane C\n// 2D: 2 points, 0 elements, 1 integer — uses screen plane\n// 3D: 2 points, 1 PlaneElement, 1 integer — uses explicit plane\n// (Java: Slate.java polygon case 7 — RegularPolygon(A,B,plane,n))\nexport class RegularPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.regularPolygon;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, N[0]);\n return [[g], g];\n }\n}\n\n// polygon\n// starPolygon (2D variant)\n// points A, B, integers n, d\n// the star polygon {n/d} on side AB in the screen plane\n// (Java: Slate.java polygon case 8 — new RegularPolygon(A,B,screen,n,d))\nexport class StarPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.starPolygon;\n signature = { points: 2, elements: 0, integers: 2 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new RegularPolygonElement(P[0], P[1], screen, N[0], N[1]);\n return [[g], g];\n }\n}\n\n\n// polygon\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the triangle ABH where H is the similar point so triangle ABH ~ triangle DEF\n// 2D: 5 points, 0 elements — uses screen plane for both\n// 3D: 5 points, 2 PlaneElements — uses explicit planes\n// (Java: Slate.java polygon case 9 — Similar(A,B,C,D,E,F,G) + PolygonElement(A,B,H))\nexport class SimilarPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let sim = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n let g = new PolygonElement([P[0], P[1], sim]);\n return [[sim, g], g];\n }\n}\n\n// polygon\n// application\n// polygon A points B, C, D\n// the parallelogram equal to the given polygon A with one side BC and one angle BCD\n// (Java: Application.java — parallelogram with area = P.area(), side BC, angle DCB)\nexport class ApplicationPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.application;\n signature = { points: 3, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new ApplicationElement(E[0] as PolygonElement, P[0], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// polygon\n// octagon\n// 8 points A, B, C, D, E, F, G, H\n// the octagon given 8 vertices (free points, pass-through)\n// (Java: Slate.java polygon case 11 — new PolygonElement(A,B,C,D,E,F,G,H))\nexport class OctagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.octagon;\n signature = { points: 8, elements: 0, integers: 0 };\n}\n\n// polygon\n// face\n// polyhedron A integer n\n// the nth face (1-based) of polyhedron A\n// (Java: Slate.java polygon case 12 — ((PolyhedronElement)E[0]).P[N[0]-1])\n// Same pattern as point;vertex (returns polygon from polyhedron, not point from polygon)\nexport class FacePolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.face;\n signature = { points: 0, elements: 1, integers: 1, elementTypes: [PolyhedronElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const polyhedron = E[0] as PolyhedronElement;\n const face = polyhedron.P[N[0] - 1];\n return [[face], face];\n }\n}\n\nexport const polygonConstructions: Construction[] = [\n new TrianglePolygonConstruction(),\n new StarPolygonConstruction(),\n new RegularPolygonConstruction(),\n new SquarePolygonConstruction(),\n new EquilateralTriangleConstruction(),\n new ParallelogramPolygonConstruction(),\n new QuadrilateralPolygonConstruction(),\n new OctagonPolygonConstruction(),\n new PentagonPolygonConstruction(),\n new HexagonPolygonConstruction(),\n new SimilarPolygonConstruction(),\n new ApplicationPolygonConstruction(),\n new FacePolygonConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tLineElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {GeomElement} from \"../GeomElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport class PolygonElement extends GeomElement {\n\n public V : PointElement[];\n\n // Face fill alpha — drives drawFace's globalAlpha independent of\n // drawProgress (which drives the edge trace). Lets an animation\n // run the outline to completion at drawProgress = 1 first, then\n // separately fade the fill in by ticking faceAlpha 0 → 1. Default\n // 1 means \"fully opaque\" — every existing render path behaves\n // identically.\n private _faceAlpha : number = 1;\n\n set faceAlpha(value: number) {\n this._faceAlpha = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n get faceAlpha(): number { return this._faceAlpha; }\n\n constructor(ps?: PointElement[]) {\n super();\n this.dimension = 2;\n if (ps == null) {\n this.V = [];\n return;\n }\n this.V = ps;\n }\n\n public area() : number {\n // Ported from PolygonElement.java area() — 2026-04-12\n // Compute the area of this polygon (assuming it's planar & convex).\n // Uses fan triangulation from V[0].\n let sum = 0.0;\n for (let i = 0; i < this.V.length - 2; ++i) {\n sum += PointElement.area(this.V[0], this.V[i + 1], this.V[i + 2]);\n }\n return sum;\n }\n\n public drawEdge(c: HTMLCanvasElement, color?: string): void {\n if (!this.visible) return;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.edgeHighlightColor;\n } else {\n color = this.edgeColor;\n }\n }\n\n if (color == null) return;\n if (this.V.length <= 1) return;\n\n let ctx = c.getContext(\"2d\");\n ctx.beginPath();\n ctx.strokeStyle = color;\n {\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n }\n // Edge enumeration: a closed polygon (>2 verts) has V.length\n // edges including the closing one; an open polyline has\n // V.length - 1. Each integer step of drawProgress · edgeCount\n // advances one full edge; the fractional remainder partially\n // traces the next. drawProgress = 1 (default) reproduces the\n // pre-animation full-trace behaviour bit-for-bit.\n let n = this.V.length;\n let isClosed = n > 2;\n let edgeCount = isClosed ? n : n - 1;\n let p = this.drawProgress;\n let totalProgress = p * edgeCount;\n let fullEdges = Math.floor(totalProgress);\n let fractionalEdge = totalProgress - fullEdges;\n\n ctx.moveTo(this.V[0].x, this.V[0].y);\n for (let i = 0; i < fullEdges; i++) {\n let to = this.V[(i + 1) % n];\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n }\n if (fractionalEdge > 0 && fullEdges < edgeCount) {\n let from = this.V[fullEdges];\n let to = this.V[(fullEdges + 1) % n];\n let px = from.x + (to.x - from.x) * fractionalEdge;\n let py = from.y + (to.y - from.y) * fractionalEdge;\n ctx.lineTo(px, py);\n ctx.stroke();\n }\n }\n\n public defined() : boolean {\n if (this.V.length == 0) return false;\n for(let v of this.V) {\n if (!v.defined()) return false;\n }\n return true;\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if(this.faceColor != null && this.defined() && this.V.length > 2) {\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.beginPath();\n ctx.fillStyle = this.faceColor;\n let firstPoint = this.V[0];\n let rest = this.V.slice(1);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n for(let vertex of rest)\n ctx.lineTo(vertex.x, vertex.y);\n ctx.closePath();\n // Animate the fill via the dedicated faceAlpha field so\n // outline-then-fill animations can run the edge trace to\n // completion at drawProgress = 1 first, then independently\n // tick faceAlpha from 0 to 1 for the fade-in. Default\n // faceAlpha = 1 preserves the fully-opaque behaviour for\n // every consumer that doesn't animate.\n let a = this.faceAlpha;\n if (a < 1) {\n if (a <= 0) return; // fully transparent — skip\n ctx.save();\n ctx.globalAlpha = a;\n ctx.fill();\n ctx.restore();\n } else {\n ctx.fill();\n }\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n let x : number = 0;\n let y : number = 0;\n for(let v of this.V) {\n x += v.x;\n y += v.y;\n }\n let n : number = this.V.length;\n x = x / n;\n y = y / n;\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n let [w, h] = this._getTextMetrics(ctx, this._name);\n ctx.beginPath();\n ctx.fillStyle = this.nameColor;\n ctx.fillText(this._name, x - w/2., y + h/4.);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor != null && this.defined() ) {\n for(let v of this.V) {\n v.drawVertex(c, this.vertexColor);\n }\n }\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tRegularPolygonElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolygonElement} from \"./PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class RegularPolygonElement extends PolygonElement {\n\n private _cos: number;\n private _sin: number;\n private _P: PlaneElement;\n\n constructor(A: PointElement, B: PointElement, plane: PlaneElement, n: number, d: number = 1) {\n super();\n this._P = plane;\n const theta = Math.PI * d * (n - 2) / n;\n this._cos = Math.cos(theta);\n this._sin = Math.sin(theta);\n this.V = new Array(n);\n this.V[0] = A;\n this.V[1] = B;\n for (let i = 2; i < n; i++) {\n this.V[i] = new PointElement({ AP: plane });\n }\n }\n\n update(): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].to(this.V[i - 2]);\n this.V[i].rotate(this.V[i - 1], this._cos, this._sin, this._P);\n }\n }\n\n translate(dx: number, dy: number): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].translate(dx, dy);\n }\n }\n\n rotate(pivot: PointElement, ac: number, as: number): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].rotate(pivot, ac, as, this._P);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Polyhedron construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n PolyhedraConstructions as PolyhedraConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PyramidElement} from \"./PyramidElement\";\nimport {PrismElement} from \"./PrismElement\";\n\n// polyhedron — tetrahedron — points A, B, C, D\n// (Java: Slate.java polyhedron case 0 — PolygonElement(A,B,C) + Pyramid(base,D))\nexport class TetrahedronConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.tetrahedron;\n signature = { points: 4, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let base = new PolygonElement([P[0], P[1], P[2]]);\n let g = new PyramidElement(base, P[3]);\n return [[base, g], g];\n }\n}\n\n// polyhedron — parallelepiped — points A, B, C, D\n// (Java: Slate.java polyhedron case 1 — Layoff(B,A,C,A,C) + PolygonElement(B,A,C,fourth) + Prism(base,A,D))\nexport class ParallelepipedConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.parallelepiped;\n signature = { points: 4, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let fourth = new Layoff(P[1], P[0], P[2], P[0], P[2]);\n let base = new PolygonElement([P[1], P[0], P[2], fourth]);\n let g = new PrismElement(base, P[0], P[3]);\n return [[fourth, base, g], g];\n }\n}\n\n// polyhedron — prism — polygon A, points B, C\n// (Java: Prism.java — 41 lines, line-for-line port)\nexport class PrismConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.prism;\n signature = { points: 2, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PrismElement(E[0] as PolygonElement, P[0], P[1]);\n return [[g], g];\n }\n}\n\n// polyhedron — pyramid — polygon A, point B\n// (Java: Pyramid.java — 11 lines, line-for-line port)\nexport class PyramidConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.pyramid;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PyramidElement(E[0] as PolygonElement, P[0]);\n return [[g], g];\n }\n}\n\nexport const polyhedronConstructions: Construction[] = [\n new TetrahedronConstruction(),\n new ParallelepipedConstruction(),\n new PrismConstruction(),\n new PyramidConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPolyhedronElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport class PolyhedronElement extends GeomElement {\n\n public P: PolygonElement[]; // array of face polygons\n\n constructor() {\n super();\n this.dimension = 2;\n this.P = [];\n }\n\n public defined(): boolean {\n for (let i = 0; i < this.P.length; ++i) {\n if (!this.P[i].defined()) return false;\n }\n return true;\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n let x = 0, y = 0, ct = 0;\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n x += this.P[j].V[i].x;\n y += this.P[j].V[i].y;\n ++ct;\n }\n }\n x /= ct;\n y /= ct;\n this.drawString(Math.round(x), Math.round(y), c);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor != null && this.defined()) {\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n this.P[j].V[i].drawVertex(c, this.vertexColor);\n }\n }\n }\n }\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.edgeColor != null && this.defined()) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.edgeColor;\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n let a = this.P[j].V[i];\n let b = this.P[j].V[(i + 1) % this.P[j].V.length];\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n }\n }\n }\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor != null && this.defined()) {\n for (let j = 0; j < this.P.length; ++j) {\n // Pass the polyhedron's faceColor to each face polygon,\n // matching Java's P[j].drawFace(g, faceColor)\n let savedColor = this.P[j].faceColor;\n this.P[j].faceColor = this.faceColor;\n this.P[j].drawFace(c);\n this.P[j].faceColor = savedColor;\n }\n }\n }\n\n public update(): void {}\n public translate(dx: number, dy: number): void {}\n public rotate(pivot: PointElement, ac: number, as: number): void {}\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPrismElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolyhedronElement} from \"./PolyhedronElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class PrismElement extends PolyhedronElement {\n\n // The base is given as well as a line segment CD for the sides to be\n // parallel to.\n\n private _C: PointElement;\n private _D: PointElement;\n\n constructor(Base: PolygonElement, C: PointElement, D: PointElement) {\n super();\n this.dimension = 2;\n this._C = C;\n this._D = D;\n let baseN = Base.V.length;\n let n = 2 + baseN;\n this.P = new Array(n);\n this.P[0] = Base;\n // create the top — vertices translated by (D-C) from base\n let topVerts : PointElement[] = new Array(baseN);\n for (let j = 0; j < baseN; ++j) {\n topVerts[j] = new PointElement();\n topVerts[j].to(Base.V[j]).plus(D).minus(C);\n }\n this.P[1] = new PolygonElement(topVerts);\n // create the sides — quadrilaterals connecting base and top edges\n for (let i = 2; i < n; ++i) {\n this.P[i] = new PolygonElement([\n Base.V[i - 2],\n Base.V[(i - 1) % baseN],\n this.P[1].V[(i - 1) % baseN],\n this.P[1].V[i - 2]\n ]);\n }\n }\n\n public translate(dx: number, dy: number) {\n for (let i = 0; i < this.P[1].V.length; ++i) {\n this.P[1].V[i].translate(dx, dy);\n }\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n for (let i = 0; i < this.P[1].V.length; ++i) {\n this.P[1].V[i].rotate(pivot, ac, as);\n }\n }\n\n public update() {\n for (let j = 0; j < this.P[1].V.length; ++j) {\n this.P[1].V[j].to(this.P[0].V[j]).plus(this._D).minus(this._C);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPyramidElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolyhedronElement} from \"./PolyhedronElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class PyramidElement extends PolyhedronElement {\n\n constructor(Base: PolygonElement, Apex: PointElement) {\n super();\n this.dimension = 2;\n let n = 1 + Base.V.length;\n this.P = new Array(n);\n this.P[0] = Base;\n for (let i = 1; i < n; ++i) {\n this.P[i] = new PolygonElement([Apex, Base.V[i - 1], Base.V[i % Base.V.length]]);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tArcElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {SectorElement} from \"./SectorElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\n/**\n * Port of geom_applet/source/Arc.java — an arc through three points.\n *\n * Given points A, M, B (with M on the arc between A and B), draws the\n * arc of the unique circle passing through all three. The circle's\n * center is recomputed on every update() as circumcenter(A, M, B) and\n * stored in the inherited _Center field; SectorElement.drawEdge then\n * sweeps the arc from A to B using the inherited angle math.\n *\n * _Center is an internal bare PointElement, not registered on the\n * slate. Arc.update() writes into it directly, so it stays in sync\n * with A, M, B without needing a separate elementsForUpdate entry.\n *\n * translate / rotate are overridden so that grabbing and moving the\n * arc (either via a drag or via a global pivot rotation) perturbs\n * only the inherited _Center; A, M, B are independent slate elements\n * and are moved by their own handlers. This mirrors Java Arc.java\n * exactly — see geom_applet/source/Arc.java lines 19-23.\n */\nexport class ArcElement extends SectorElement {\n\n _M : PointElement; // the \"through\" point on the arc between A and B\n\n constructor(A: PointElement, M: PointElement, B: PointElement, P: PlaneElement) {\n super();\n this.dimension = 2;\n this._Center = new PointElement();\n this._A = A;\n this._M = M;\n this._B = B;\n this._P = P;\n }\n\n update(): void {\n // Java Arc.update() explicitly calls P.update() first. The TS\n // slate already updates elements in dependency order, so this\n // is arguably redundant — but we keep it for parity with Java\n // in case some emergent behavior depends on it.\n this._P.update();\n this._Center.toCircumcenter(this._A, this._M, this._B);\n }\n\n translate(dx: number, dy: number): void {\n this._Center.translate(dx, dy);\n }\n\n rotate(pivot: PointElement, ac: number, as: number): void {\n this._Center.rotate(pivot, ac, as);\n }\n}\n","/*----------------------------------------------------------------------+\n| Sector construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n SectorConstructions as SectorConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SectorElement} from \"./SectorElement\";\nimport {ArcElement} from \"./ArcElement\";\n\n// sector — points A, B, C [, plane D = screen]\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java sector case 0 — new SectorElement(A,B,C,plane))\nexport class SectorConstruction extends Construction {\n constructionMethod: AllConstructions = SectorConstructionsEnum.sector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new SectorElement({O:P[0], A:P[1], B:P[2], P: plane});\n return [[g], g];\n }\n}\n\n// sector — arc — points A, M, B [, plane D = screen]\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java sector case 1 — new ArcElement(A,M,B,plane))\nexport class ArcConstruction extends Construction {\n constructionMethod: AllConstructions = SectorConstructionsEnum.arc;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new ArcElement(P[0], P[1], P[2], plane);\n return [[g], g];\n }\n}\n\nexport const sectorConstructions: Construction[] = [\n new SectorConstruction(),\n new ArcConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tSectorElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {Midpoint} from \"../point/Midpoint\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport interface ISectorElementConstruction {\n O: PointElement;\n A: PointElement;\n B: PointElement;\n P: PlaneElement;\n}\n\nexport class SectorElement extends GeomElement {\n\n _Center : PointElement;\n _A : PointElement;\n _B : PointElement;\n // A and B are two points on a circle with the given center\n\n _P : PlaneElement; // plane of the circle\n\n _angle : number = null;\n\n constructor(isec?: ISectorElementConstruction) {\n super();\n this.dimension = 2;\n if(isec != null) {\n this._Center = isec.O;\n this._A = isec.A;\n this._B = isec.B;\n this._P = isec.P;\n }\n }\n\n radius() : number {\n return this._Center.distance(this._A);\n }\n\n defined() {\n return this._A.defined() && this._B.defined() && this._Center.defined();\n }\n\n\n // Here, we differ from the original implementation.\n // Since A and B are on the circle, we find the midpoint M between them.\n // Then we calculate a radius distance along the line from Center M\n // as the \"through\" point.\n\n _updateThroughPoint() : void {\n let r = this.radius();\n if(r == 0) { // degenerate circle\n return;\n }\n this._angle = Math.atan2(this._B.y - this._A.y, this._B.x - this._A.x) -\n Math.atan2(this._Center.y - this._A.y, this._Center.x - this._A.x);\n let x = this._Center.x + Math.cos(this._angle/2) * r;\n let y = this._Center.y + Math.sin(this._angle/2) * r;\n }\n\n drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.edgeColor;\n ctx.beginPath();\n let r = this.radius();\n let d = 2 * r;\n let startAngle = Math.atan2(\n this._A.y - this._Center.y,\n this._A.x - this._Center.x);\n let arcAngle = this._Center.angle(this._A, this._B, this._P);\n let endAngle = startAngle + arcAngle;\n ctx.arc(this._Center.x, this._Center.y, r, startAngle, endAngle, true);\n ctx.stroke();\n }\n\n drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.fillStyle = this.faceColor;\n ctx.beginPath();\n let r = this.radius();\n let d = 2 * r;\n let startAngle = Math.atan2(\n this._A.y - this._Center.y,\n this._A.x - this._Center.x);\n let arcAngle = this._Center.angle(this._A, this._B, this._P);\n let endAngle = startAngle + arcAngle;\n ctx.arc(this._Center.x, this._Center.y, r, startAngle, endAngle, true);\n ctx.moveTo(this._Center.x, this._Center.y);\n if(arcAngle <= 180.) {\n ctx.lineTo(this._A.x, this._A.y);\n ctx.lineTo(this._B.x, this._B.y);\n } else {\n ctx.lineTo(this._B.x, this._B.y);\n ctx.lineTo(this._A.x, this._A.y);\n }\n ctx.lineTo(this._Center.x, this._Center.y);\n ctx.fill();\n }\n\n drawName(c: SlateCanvas): void {\n }\n\n drawVertex(c: SlateCanvas): void {}\n\n rotate(pivot: PointElement, ac: number, as: number): void {}\n\n translate(dx: number, dy: number): void {}\n\n update(): void {\n this._updateThroughPoint();\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Sphere construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n SphereConstructions as SphereConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SphereElement} from \"./SphereElement\";\n\n// sphere — radius — points A, B\n// (Java: Slate.java sphere case 0 — new SphereElement(A, A, B))\nexport class SphereRadiusConstruction extends Construction {\n constructionMethod: AllConstructions = SphereConstructionsEnum.radius;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new SphereElement({Center: P[0], B: P[1]});\n return [[g], g];\n }\n}\n\n// sphere — radius (3-point) — points A, B, C — center A, radius |BC|\n// (Java: Slate.java sphere case 0, choice 1 — new SphereElement(A,B,C))\nexport class SphereRadius3PointConstruction extends Construction {\n constructionMethod: AllConstructions = SphereConstructionsEnum.radius;\n signature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new SphereElement({Center: P[0], A: P[1], B: P[2]});\n return [[g], g];\n }\n}\n\nexport const sphereConstructions: Construction[] = [\n new SphereRadius3PointConstruction(),\n new SphereRadiusConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tSphereElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\n\nimport {GeomElement, Align} from \"../GeomElement\"\nimport {SlateCanvas} from \"../../Slate\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport interface ISphereElementConstruction {\n Center? : PointElement;\n A? : PointElement; // radius is AB\n B? : PointElement; // A assumed to be Center unless provided\n}\n\nexport class SphereElement extends GeomElement {\n\n protected _Center : PointElement;\n protected _A : PointElement; // radius is AB\n protected _B : PointElement;\n\n get Center() : PointElement { return this._Center; }\n\n constructor(ip? : ISphereElementConstruction) {\n super();\n this.dimension = 2;\n this._Center = ip && ip.Center || new PointElement();\n this._A = ip && ip.A || this._Center;\n this._B = ip && ip.B || new PointElement();\n }\n\n public drawName(c: SlateCanvas) : void {\n if (!this.visible) return;\n if(this.nameColor != null && this.name != null && this.defined()) {\n this.drawString(Math.round(this._Center.x), Math.round(this._Center.y), c, Align.CENTRAL);\n }\n }\n\n public defined() : boolean {\n return true;\n }\n\n public drawEdge(c: SlateCanvas) : void {\n if (!this.visible) return;\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.strokeStyle = this.edgeColor;\n let r = this.radius();\n ctx.beginPath();\n // ellipse() takes (centerX, centerY, radiusX, radiusY, ...)\n ctx.ellipse(\n this._Center.x,\n this._Center.y,\n r,\n r,\n 0,\n 0,\n 2*Math.PI);\n ctx.stroke();\n ctx.restore();\n }\n\n public drawFace(c: SlateCanvas) : void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.fillStyle = this.faceColor;\n let r = this.radius();\n ctx.beginPath();\n ctx.ellipse(\n this._Center.x,\n this._Center.y,\n r,\n r,\n 0,\n 0,\n 2*Math.PI);\n ctx.fill();\n ctx.restore();\n }\n\n public radius() : number { return this._A.distance(this._B); }\n public radius2() : number { return this._A.distance2(this._B); }\n\n public drawVertex() {}\n public update(): void {}\n public translate(dx: number, dy: number): void {}\n public rotate(pivot: PointElement, ac: number, as : number, plane?: PlaneElement) : void {\n }\n\n}\n","import {GeomElement, Align as align} from \"./elements/GeomElement\"\nimport {AllConstructions, E as e} from \"./elements/Constructions\"\nimport {AllAnimations, A} from \"./elements/Animations\"\n// Per-type animation modules — imported for side effects so each\n// Animation subclass registers with the registry at module load. Adding\n// a new animation file is a one-line `import \"./elements/.../X\"` here.\nimport \"./elements/point/PointAnimations\";\nimport \"./elements/line/LineAnimations\";\nimport \"./elements/circle/CircleAnimations\";\nimport \"./elements/polygon/PolygonAnimations\";\nimport {PointElement} from \"./elements/point/PointElement\";\nimport {Slate} from \"./Slate\";\nimport {PlaneSlider} from \"./elements/point/PlaneSlider\";\nimport {colors, randomColor, lighten, darken, parseColor} from \"./Colors\";\nimport {createControls} from \"./SlateControls\";\n\nexport type IndexAllConstructions = AllConstructions;\nexport {align as Align};\nexport {e as E};\nexport {AllAnimations, A};\n\n// Build marker — bumped when behaviour-affecting changes ship so consumers\n// (e.g. the test pages used to investigate #55) can confirm which bundle\n// they're actually running.\nexport const BUILD_MARKER = \"pointer-events-refactor-v1 (Slate.ts #55)\";\n\nexport let slates : Slate[] = [];\n\nexport interface IConstructionInfo {\n name: string;\n construction: IndexAllConstructions;\n params: any[];\n nameColor?: string | number;\n vertexColor?: string | number;\n edgeColor?: string | number;\n faceColor?: string | number;\n}\n\n// Marginal-reference shape for slides. The `ref` is a symbolic label\n// such as \"I.Post.3\" or \"C.N.1\"; URL resolution happens via the\n// consumer-supplied resolveJustification callback so the data here\n// doesn't go stale if a referenced page moves on the consumer site.\nexport interface ISlideJust {\n ref: string;\n}\n\n// One step in the slideshow / presentation walk-through. The DSL is\n// declarative: each slide describes its full effective state, and the\n// Presentation controller computes the transitions between them.\n//\n// - visible inherits from the previous slide if omitted, so authors\n// only re-specify on state change.\n// - highlighted defaults to [] (clears between slides), so a\n// highlight only persists when re-specified on the next slide.\n// - Draggable elements (e.draggable === true) are auto-unioned into\n// the visible set by the Presentation controller; authors don't\n// need to list free construction points per slide.\n// - Highlighted elements are auto-unioned into visible — you can't\n// highlight what isn't drawn.\n// Per-element animation choice on one slide. Cascade order = the\n// array order. An element revealed by the slide but not listed here\n// pops in instantly. See A.* / AllAnimations for valid name values.\nexport interface ISlideAnimation {\n elem: string;\n name: AllAnimations | string;\n args?: any;\n durationMs?: number;\n}\n\nexport interface ISlideTransition {\n mode?: \"cascade\" | \"parallel\";\n animations?: ISlideAnimation[];\n}\n\nexport interface ISlide {\n text: string;\n visible?: string[];\n highlighted?: string[];\n justifications?: ISlideJust[];\n transition?: ISlideTransition;\n}\n\n// Slate-level animation tuning. No \"default animations\" — animations\n// are strictly opt-in per slide via slide.transition.animations. A\n// slate that never sets animationConfig keeps the 0.5.0 instant\n// behaviour everywhere.\nexport interface IAnimationConfig {\n // Per-animation rate overrides, keyed by animation name. Lets a\n // consumer dial all \"Line.straightEdgeConnect\" animations 30%\n // slower without touching individual slides.\n rates?: { [animationName: string]: number };\n // Per-animation duration overrides.\n durations?: { [animationName: string]: number };\n // Pause between cascaded steps; default 0.\n cascadeGapMs?: number;\n // Global multiplier; 1.0 default; 0 = jump-to-final.\n speedMultiplier?: number;\n // Default reads prefers-reduced-motion CSS media query at init().\n reducedMotion?: boolean;\n}\n\nexport interface IInitialization {\n background : string;\n title : string;\n align? : align;\n canvasid? : string;\n pivot?: string;\n font?: string;\n fontsize?: number;\n elements: (IConstructionInfo | string)[];\n // Secondary element names that resolve to a canonical element.\n // Lets prose name an element under any of the conventional\n // letter-permutations (e.g. \"circle BCD\" ≡ \"circle CDB\") without\n // forcing the canvas to carry an invisible duplicate per alias.\n // Resolved by Slate.lookupElement after a direct-name miss.\n aliases?: {[from: string]: string};\n // Optional slideshow walk-through. When provided + non-empty,\n // SlateControls renders a \"▶ Present\" button that opens the\n // Presentation overlay. Stays empty (no button, no behaviour\n // change) for consumers that don't opt in.\n slides?: ISlide[];\n // Consumer lookup that maps a justification ref (\"I.Post.3\") to\n // a URL string. Returning null/undefined renders the ref as\n // plain text. Sync; the lektor site wires this to a page-emitted\n // window.eucrefs map.\n resolveJustification?: (ref: string) => string | null | undefined;\n // Slide-transition animation config. Optional; without it, the\n // slideshow keeps the 0.5.0 instant behaviour. Animations are\n // also strictly per-slide opt-in — even with animationConfig set,\n // a slide without transition.animations pops in instantly.\n animationConfig?: IAnimationConfig;\n}\n\n// Map Java element class names to E object keys\nconst typeMap: {[key: string]: string} = {\n \"point\": \"Point\", \"line\": \"Line\", \"circle\": \"Circle\",\n \"polygon\": \"Polygon\", \"sector\": \"Sector\", \"plane\": \"Plane\",\n \"sphere\": \"Sphere\", \"polyhedron\": \"Polyhedra\"\n};\n\n// Parse a Java applet param value string into an IConstructionInfo.\n// Format: \"name;type;construction;arg1,arg2,...[;nameColor[;vertexColor[;edgeColor[;faceColor]]]]\"\n// Example: \"M;point;midpoint;A,B;0;0\" → { name: \"M\", construction: E.Point.midpoint, params: [\"A\",\"B\"], nameColor: \"0\", vertexColor: \"0\" }\nexport function parseParam(value: string): IConstructionInfo {\n let fields = value.split(\";\");\n if (fields.length < 4) {\n throw new Error(`parseParam: expected at least 4 semicolon-separated fields, got ${fields.length}: \"${value}\"`);\n }\n\n let name = fields[0];\n let type = fields[1];\n let construction = fields[2];\n let data = fields[3];\n\n // Look up the construction enum value\n let typeKey = typeMap[type];\n if (typeKey == null) {\n throw new Error(`parseParam: unknown element type \"${type}\" in \"${value}\"`);\n }\n let enumObj = (e as any)[typeKey];\n // Handle Java names that differ from TS enum keys\n let enumKey = construction === \"3points\" ? \"threePoints\" : construction;\n let constructionEnum = enumObj[enumKey];\n if (constructionEnum == null) {\n throw new Error(`parseParam: unknown construction \"${type};${construction}\" in \"${value}\"`);\n }\n\n // Parse params: split on comma, convert numeric strings to numbers\n let params: any[] = data.split(\",\").map(s => {\n let n = Number(s);\n return (s !== \"\" && !isNaN(n)) ? n : s;\n });\n\n // Parse optional color fields (positions 4-7)\n let result: IConstructionInfo = { name, construction: constructionEnum, params };\n if (fields.length > 4 && fields[4] !== undefined) result.nameColor = fields[4];\n if (fields.length > 5 && fields[5] !== undefined) result.vertexColor = fields[5];\n if (fields.length > 6 && fields[6] !== undefined) result.edgeColor = fields[6];\n if (fields.length > 7 && fields[7] !== undefined) result.faceColor = fields[7];\n\n return result;\n}\n\n// see https://stackoverflow.com/questions/4938346/canvas-width-and-height-in-html5\nfunction resizeCanvasToDisplaySize(canvas: HTMLCanvasElement) : void {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n\n if (canvas.width != width || canvas.height != height) {\n canvas.width = width;\n canvas.height = height;\n }\n}\n\n/**\n * If init() fails partway, the canvas stays blank and the user sees\n * nothing — the <noscript> tag won't fire because JS *is* running, it\n * just errored. This helper looks for a <noscript> sibling of the\n * canvas (the conventional location for the static-image fallback,\n * e.g. <noscript><img src=\"propI4.gif\"/></noscript>), reparses its\n * contents, inserts them as a visible sibling, and hides the canvas.\n *\n * Safe no-op if `canvas` is null, has no noscript sibling, or any\n * DOM operation throws. Exported so consumers can call it directly\n * if they have their own error-handling path.\n */\nexport function revealNoscriptFallback(canvas: HTMLCanvasElement | null): void {\n if (!canvas) return;\n try {\n // Scan up to ~5 element siblings forward — the <noscript> is\n // usually the immediate next, but the document may have other\n // markup interleaved.\n let sibling = canvas.nextElementSibling;\n let attempts = 0;\n while (sibling && attempts++ < 5 && sibling.tagName !== \"NOSCRIPT\") {\n sibling = sibling.nextElementSibling;\n }\n if (!sibling || sibling.tagName !== \"NOSCRIPT\") return;\n\n // With JS enabled, <noscript>'s contents are a single text node\n // holding the raw markup. Reparse via a wrapper div.\n let html = sibling.innerHTML;\n if (!html) return;\n let wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n sibling.parentNode?.insertBefore(wrapper, sibling);\n canvas.style.display = \"none\";\n } catch (_) {\n // Swallow: this is an emergency fallback. If we can't reveal it,\n // the user is no worse off than before this helper existed.\n }\n}\n\nexport function init(i : IInitialization) {\n let canvasid : string = i.canvasid != null ? i.canvasid : \"canvasid\";\n let canvas = document.getElementById(canvasid) as HTMLCanvasElement;\n try {\n initInner(i, canvas);\n } catch (err) {\n // Blank canvas + console error = silent failure from the\n // visitor's point of view. Reveal the conventional <noscript>\n // static-image fallback so they at least see the diagram, then\n // re-throw so callers / test harnesses can detect the failure.\n console.error(\"[geomlib] init failed:\", err);\n revealNoscriptFallback(canvas);\n throw err;\n }\n}\n\nfunction initInner(i: IInitialization, canvas: HTMLCanvasElement) {\n // Java defaults to CENTRAL (0) — dynamic placement based on\n // position relative to canvas center. Override with align param.\n let defaultAlign : align = i.align != null ? i.align : align.CENTRAL;\n\n resizeCanvasToDisplaySize(canvas);\n let slate : Slate = new Slate(canvas);\n slates.push(slate);\n\n // Set font — Java defaults: Font(\"TimesRoman\", Font.ITALIC, 18)\n let fontName = i.font != null ? i.font : \"Times New Roman\";\n let fontSize = i.fontsize != null ? i.fontsize : 18;\n GeomElement.setFont(fontName, fontSize);\n // Parse background through parseColor so HSB triples like \"35,19,100\"\n // are converted to valid CSS rgb() strings for ctx.fillStyle.\n slate.bgcolor = parseColor(i.background, \"#ffffff\", \"#ffffff\");\n for(let raw of i.elements) {\n let param: IConstructionInfo = typeof raw === \"string\" ? parseParam(raw) : raw;\n let element = slate.createElement(param.construction, param.params, param.name);\n\n element.align = defaultAlign;\n\n // Name string\n let defaultNameColor = element instanceof PointElement ? \"black\" : null;\n element.nameColor = parseColor(param.nameColor, defaultNameColor, slate.bgcolor);\n\n let defaultVertexColor = element.draggable ?\n ((element instanceof PlaneSlider) ?\n 'red' : 'orange')\n : 'black';\n element.vertexColor = parseColor(param.vertexColor, defaultVertexColor, slate.bgcolor);\n\n element.edgeColor = parseColor(param.edgeColor, \"black\", slate.bgcolor);\n\n let lighterColor = lighten(slate.bgcolor);\n let defaultFaceColor = element.dimension == 2 ? lighterColor : null;\n element.faceColor = parseColor(param.faceColor, defaultFaceColor, slate.bgcolor);\n }\n\n if (i.aliases != null) {\n slate.addAliases(i.aliases);\n }\n\n if (i.slides != null && i.slides.length > 0) {\n slate.slides = i.slides;\n }\n\n if (i.resolveJustification != null) {\n slate.resolveJustification = i.resolveJustification;\n }\n\n if (i.animationConfig != null) {\n slate.animationConfig = i.animationConfig;\n }\n\n if(i.pivot != null) {\n slate.setPivot(i.pivot);\n }\n\n slate.update();\n slate.updateCoordinates(0);\n\n // Add UI controls (reset, maximize, new window) if running in browser\n if (canvas && canvas.parentElement) {\n createControls(slate, canvas, i);\n }\n}\n\n","// Pure-data helpers for the slideshow presentation mode (issue #75).\n// Lives in its own module so SlideTest can exercise the state-machine\n// rules without any DOM, while SlateControls.ts owns the overlay.\n\nimport {Slate} from \"./Slate\";\nimport {ISlide} from \"./index\";\n\n// Compute the visible + highlighted name sets for slide `index` given:\n// - visible inherits from the previous slide if omitted;\n// \"hide all at start\" applies when no earlier slide ever declared\n// visible (initial state is the empty set).\n// - highlighted clears each slide (defaults to []).\n// - Every draggable element on the slate is auto-unioned into\n// visible — free construction points always stay interactive.\n// - Every highlighted name is auto-unioned into visible — you can't\n// highlight what isn't drawn.\nexport function computeSlideState(\n slate: Slate,\n slides: ISlide[],\n index: number,\n): { visible: Set<string>, highlighted: Set<string> } {\n // Walk back to find the most recent explicit `visible` array.\n let baseVisible: string[] = [];\n for (let i = index; i >= 0; i--) {\n if (slides[i].visible != null) {\n baseVisible = slides[i].visible;\n break;\n }\n }\n const visible = new Set<string>(baseVisible);\n\n const slide = slides[index];\n const highlighted = new Set<string>(slide.highlighted || []);\n\n for (const e of slate.elements) {\n if (e.draggable && e.name != null) visible.add(e.name);\n }\n highlighted.forEach(name => visible.add(name));\n\n return { visible, highlighted };\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["randomColor","c","HSVtoRGB","Math","random","r","g","b","brighter","col","rgb","parseRGB","FACTOR","threshold","ceil","min","floor","darker","m","match","parseInt","colors","hex","replace","test","n","parts","split","length","h","s","isNaN","v","i","f","p","q","t","round","val","dfault","bgcolor","str","String","canvas","_aliases","Map","_slides","_resolveJustification","_animationConfig","_animator","_ephemerals","_htmlCanvas","inTest","_itsNumSlate","Slate","numSlate","this","_elements","TypeError","_canvas","screen_origin","FixedPoint","x","y","z","name","screen_x","screen_y","screen","PlaneElement","A","B","C","nameColor","isScreen","_screen","_pick","e","vertexColor","vertexHighlightColor","faceColor","faceHighlightColor","push","slate","cnv","addEventListener","style","touchAction","activePointerId","ev","pointerId","setPointerCapture","_","_getCanvasPosition","clientX","clientY","_onMouseDown","_onMouseDrag","endPointer","_onMouseUp","releasePointerCapture","getBoundingClientRect","left","top","movePick","_bgcolor","value","lookupElement","elem","canonical","get","addAlias","from","to","set","addAliases","aliases","addEphemeral","removeEphemeral","indexOf","splice","clearEphemerals","_ensureAnimator","SlateAnimator","animateTo","targetVisible","targetHighlighted","slideAnimations","mode","run","setVisibleNames","names","visible","Set","has","clearVisibility","convertParams","params","P","E","N","param","PointElement","LineElement","findConstruction","cm","sp","constructions","validateSignature","createElement","cName","getConstructionName","construct","gs","preexists","reset","update","drawElements","w","width","height","ctx","getContext","clearRect","fillStyle","fillRect","drawFace","drawEdge","drawVertex","drawName","updateCoordinates","defined","translateCoordinates","dx","dy","translate","closestVisiblePoint","elements","tolerance","screenDist2","a","sortedDistanceElements","filter","map","sort","adcp","bdcp","bestDistPoint","sqrt","_getPick","d","currentPoint","setPivot","pointName","trim","piv","planeName","pivot","_AP","picki","abs","draggable","drag","AP","rotateCoordinates","pick","oldP","difference","newx","newy","S","T","olds","dot","oldt","den","news","newt","ac","as","rotate","HAS_RAF","requestAnimationFrame","NOW","performance","now","Date","groups","resolveCurrent","cascadeIndex","rafId","lastFrameMs","fadingOut","fadeStartMs","cancel","config","animationConfig","speedMul","speedMultiplier","reduced","reducedMotion","entry","target","animation","findAnimation","elementType","console","warn","constructor","drawProgress","resolvedSteps","build","args","step","durationMs","stepDefault","slideOverride","configOverride","durations","elapsedMs","started","finalised","steps","currentIndex","animatedTargets","willBeVisible","willBeHighlighted","shouldHighlight","setup","finalise","Promise","resolve","emphasized","_kickoff","_scheduleFrame","_clearAnimatedEmphasis","cancelAnimationFrame","_startGroupIndex","_startStep","idx","stepIdx","_frame","setTimeout","nowMs","cascadeGap","cascadeGapMs","rawDt","dt","_tickCascade","_tickParallel","_allFinalised","fadeElapsed","fp","ea","emphasisAmount","_tickStep","finishedAtMs","total","tick","parentElement","SlateControls","init","isCoarsePointer","window","matchMedia","matches","BTN_SIZE","BTN_GAP","BTN_MARGIN","trackWindowResize","callback","handler","removeEventListener","_maximized","_savedStyles","_stopTrackingResize","_presenting","_presentationIndex","_presentationOverlay","_presentationCaption","_presentationJusts","_presentationCounter","_presentationOnKey","_stickyRefSpan","_stickyRefElem","_slate","_config","_wrapper","createWrapper","createButtons","addKeyboardShortcuts","wrapper","document","position","display","insertBefore","appendChild","setAttribute","outline","buttons","draw","drawResetIcon","action","onReset","title","drawMaximizeIcon","onMaximize","drawNewWindowIcon","onNewWindow","slides","drawPresentIcon","onPresent","btn","right","padding","border","cursor","background","borderRadius","iconCanvas","stopPropagation","focus","_maxBtn","_maxIconCanvas","key","preventDefault","minimize","maximize","wrapperPosition","wrapperTop","wrapperLeft","wrapperWidth","wrapperHeight","wrapperZIndex","zIndex","wrapperBackground","canvasStyleWidth","canvasStyleHeight","canvasAttrWidth","canvasAttrHeight","resizeAndRedraw","updateMaximizeIcon","clientWidth","clientHeight","size","pad","strokeStyle","lineWidth","ax","ay","bx","by","beginPath","moveTo","lineTo","stroke","closePath","fill","drawMinimizeIcon","scripts","querySelectorAll","bundleSrc","src","newWinConfig","Object","assign","canvasid","configJSON","JSON","stringify","html","newWin","open","write","close","buildPresentationOverlay","bindPresentationKeys","showSlide","exitPresent","unbindPresentationKeys","clearStickyRef","removePresentationOverlay","overlay","className","bottom","margin","maxWidth","color","borderTop","boxShadow","fontFamily","boxSizing","textAlign","caption","fontSize","lineHeight","marginBottom","justs","opacity","minHeight","nav","gap","alignItems","justifyContent","prevBtn","makePresentationButton","counter","minWidth","nextBtn","exitBtn","marginLeft","documentElement","parentNode","removeChild","index","clamped","max","state","computeSlideState","slide","transition","animations","highlighted","renderCaptionText","text","textContent","innerHTML","resolveJustification","justifications","sep","ref","url","href","rel","span","host","re","lastIndex","exec","createTextNode","slice","buildCaptionRef","label","fontWeight","fontStyle","borderBottom","wasThis","setStickyRef","classList","remove","add","cx","cy","arc","PI","endAngle","cos","sin","a1","a2","ry","rw","rh","strokeRect","arrowStartX","arrowStartY","arrowEndX","arrowEndY","leftX","rightX","topY","bottomY","animationsByName","animationsByEnum","warnedUnknown","AllAnimations","Point","appear","POINT_APPEAR","intersect","POINT_INTERSECT","Line","straightEdgeConnect","LINE_STRAIGHT_EDGE_CONNECT","straightEdgeExtend","LINE_STRAIGHT_EDGE_EXTEND","compassTransfer","LINE_COMPASS_TRANSFER","Circle","compass","CIRCLE_COMPASS","compassExplicit","CIRCLE_COMPASS_EXPLICIT","Polygon","POLYGON_OUTLINE","outlineAndFill","POLYGON_OUTLINE_AND_FILL","instant","INSTANT","Animation","animationMethod","GeomElement","InstantAnimation","registerAnimation","ConstructionTypes","PointConstructions","LineConstructions","CircleConstructions","PolygonConstructions","SectorConstructions","PlaneConstructions","SphereConstructions","PolyhedraConstructions","Sector","Plane","Sphere","Polyhedra","constructionMethod","sig","signature","points","integers","elementTypes","Construction","pointConstructions","lineConstructions","circleConstructions","sectorConstructions","polygonConstructions","planeConstructions","sphereConstructions","polyhedronConstructions","Align","_nameColor","_vertexColor","_edgeColor","_faceColor","_nameHighlightColor","_vertexHighlightColor","_edgeHighlightColor","_faceHighlightColor","_shouldHighlight","_visible","_emphasisAmount","_drawProgress","_pixelTolerance","setFont","fontName","_font","_getTextMetrics","txt","textMetrics","measureText","actualBoundingBoxAscent","actualBoundingBoxDescent","drawString","ix","iy","overrideAlign","font","_name","_align","LEFT","fillText","RIGHT","ABOVE","BELOW","cw","ch","tox","toy","_draggable","_dimension","CircleElement","defaultRate","defaultDurationMs","circle","explicitStart","startAngle","atan2","Center","sweepMs","fullRestore","faceAlpha","drawStartAngle","sweep","progress","CircleCompassAnimation","radius","plane","CircleRadiusCenterConstruction","CircleRadius3PointConstruction","invert","InvertCircleElement","InvertCircleConstruction","intersection","SphereElement","SphereIntersectionElement","SphereIntersectionConstruction","ice","_drawStartAngle","_faceAlpha","dimension","distance","distance2","_drawCircleArc","arcStart","arcEnd","r2","radius2","amp2","ellipse","rcos","rsin","majorx","majory","factor","minorx","minory","majorR","minorR","rotation","edgeHighlightColor","edgeColor","baseW","save","globalAlpha","restore","D","toCircumcenter","CircumcircleElement","_C","_D","d2","minus","times","plus","_S","_T","PerpendicularPlane","t2","ibe","_A","_B","costheta","sintheta","toCircle","Bichord","toLine","Chord","traceLine","rate","LineStraightEdgeConnectAnimation","LineStraightEdgeExtendAnimation","connect","LineConnectConstruction","angleBisector","ad","AngleDividerElement","AngleBisectorLineConstruction","angleDivider","AngleDividerLineConstruction","foot","fo","Foot","LineFootConstruction","PlaneFootElement","PlaneFootLineConstruction","chord","ChordConstruction","bichord","wrapPointAsLine","es","BichordConstruction","perpendicular","PointPerpendicular1Construction","LinePerpendicular1Construction","PointPerpendicular2Construction","LinePerpendicular2Construction","PointPerpendicular3Construction","LinePerpendicular3Construction","PointPerpendicular4Construction","LinePerpendicular4Construction","PointPerpendicular5Construction","LinePerpendicular5Construction","cutoff","lo","Layoff","LineCutoffConstruction","extend","LineExtendConstruction","parallel","LineParallelConstruction","similar","g2","sim","SimilarElement","SimilarLineConstruction","proportion","prop","ProportionElement","ProportionLineConstruction","meanProportional","mp","MeanProportionalElement","MeanProportionalLineConstruction","ile","endX","endY","ipe","_P","_E","_F","F","toPlane","Bs","Bt","Perpendicular","toCross","PlanePerpendicularLine","U","ParallelPlane","ippe","len","lxy","threePoints","Plane3PointsConstruction","PerpendicularPlaneConstruction","PlaneParallelConstruction","ambient","AmbientPlanePointConstruction","AmbientPlaneCircleConstruction","ip","st","_n","theta","angle","_x","_y","_z","toIntersection","_newP","_initx","_inity","_initz","uptoPlane","toSphere","CircleSlider","_M","Ex","Ey","Fx","Fy","BFx","BFy","DEx","DEy","numx","numy","rB2","length2","C2","HarmonicElement","Intersection","toInvertPoint","InvertPointElement","segment","_segment","LineSlider","S0","S1","T0","T1","U0","U1","_S0","_S1","_T0","_T1","_U0","_U1","Midpoint","toIntersectionPL","PlaneIntersection","Qval","xVal","yVal","zVal","PlaneSlider","PointAppearAnimation","free","FreePointConstruction","midpoint","MidPointConstruction","IntersectionConstruction","PlaneIntersectionConstruction","first","FirstPointConstruction","last","LastPointConstruction","center","CircleCenterConstruction","SphereCenterConstruction","lineSlider","createSlider","LineSliderConstruction","circleSlider","CircleSliderConstruction","circumcircle","CircumcircleConstruction","circumcenter","CircumcenterConstruction","FootPointConstruction","PlaneFootPointConstruction","_createLayoff","LayoffConstruction","ps","CutoffConstruction","ExtendConstruction","parallelogram","ParallelogramConstruction","SimilarPointConstruction","PointPerpendicularConstruction","ProportionPointConstruction","InvertPointConstruction","MeanProportionalPointConstruction","planeSlider","PlaneSliderConstruction","sphereSlider","SphereSliderElement","SphereSliderConstruction","AngleBisectorPointConstruction","AngleDividerPointConstruction","fixed","FixedPointConstruction","lineSegmentSlider","LineSliderSegmentConstruction","harmonic","HarmonicPointConstruction","vertex","PolygonElement","V","VertexConstruction","product","cross","triple","u","BmA","CmA","BC","B2","area","Bx","Cx","By","Cy","Bz","Cz","Cs","Ct","d0","d1","AmA","DmA","Ax","Ay","Dx","Dy","toSimilar","Q","co","si","ss","tt","z1","x1","y1","baseR","V0","V1","_V0","_V1","_parentA","_parentB","_Q","dist2","Array","ApplicationElement","perimeter","poly","edgeCount","PolygonOutlineAnimation","outlineMs","PolygonOutlineAndFillAnimation","PolyConstruction","square","RegularPolygonElement","SquarePolygonConstruction","triangle","TrianglePolygonConstruction","quadrilateral","QuadrilateralPolygonConstruction","pentagon","PentagonPolygonConstruction","hexagon","HexagonPolygonConstruction","equilateralTriangle","EquilateralTriangleConstruction","ParallelogramPolygonConstruction","regularPolygon","RegularPolygonConstruction","starPolygon","StarPolygonConstruction","SimilarPolygonConstruction","application","ApplicationPolygonConstruction","octagon","OctagonPolygonConstruction","face","PolyhedronElement","FacePolygonConstruction","sum","totalProgress","fullEdges","fractionalEdge","px","py","firstPoint","rest","_cos","_sin","tetrahedron","base","PyramidElement","TetrahedronConstruction","parallelepiped","fourth","PrismElement","ParallelepipedConstruction","prism","PrismConstruction","pyramid","PyramidConstruction","ct","j","savedColor","Base","baseN","topVerts","Apex","M","_Center","SectorElement","ArcElement","sector","O","SectorConstruction","ArcConstruction","isec","_angle","_updateThroughPoint","arcAngle","SphereRadiusConstruction","SphereRadius3PointConstruction","CENTRAL","getElementById","defaultAlign","align","resizeCanvasToDisplaySize","slates","fontsize","parseColor","raw","parseParam","element","construction","defaultNameColor","defaultVertexColor","lighterColor","lighten","defaultFaceColor","createControls","initInner","err","error","revealNoscriptFallback","BUILD_MARKER","typeMap","fields","Error","type","data","typeKey","constructionEnum","result","Number","undefined","sibling","nextElementSibling","attempts","tagName","baseVisible","forEach","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call"],"sourceRoot":""}
1
+ {"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://geomlib/./src/Colors.ts","webpack://geomlib/./src/Slate.ts","webpack://geomlib/./src/SlateAnimator.ts","webpack://geomlib/./src/SlateControls.ts","webpack://geomlib/./src/elements/Animations.ts","webpack://geomlib/./src/elements/Constructions.ts","webpack://geomlib/./src/elements/GeomElement.ts","webpack://geomlib/./src/elements/circle/CircleAnimations.ts","webpack://geomlib/./src/elements/circle/CircleConstructions.ts","webpack://geomlib/./src/elements/circle/CircleElement.ts","webpack://geomlib/./src/elements/circle/CircumcircleElement.ts","webpack://geomlib/./src/elements/circle/InvertCircleElement.ts","webpack://geomlib/./src/elements/circle/SphereIntersectionElement.ts","webpack://geomlib/./src/elements/line/Bichord.ts","webpack://geomlib/./src/elements/line/Chord.ts","webpack://geomlib/./src/elements/line/LineAnimations.ts","webpack://geomlib/./src/elements/line/LineConstructions.ts","webpack://geomlib/./src/elements/line/LineElement.ts","webpack://geomlib/./src/elements/line/Perpendicular.ts","webpack://geomlib/./src/elements/line/PlanePerpendicularLine.ts","webpack://geomlib/./src/elements/plane/ParallelPlane.ts","webpack://geomlib/./src/elements/plane/PerpendicularPlane.ts","webpack://geomlib/./src/elements/plane/PlaneConstructions.ts","webpack://geomlib/./src/elements/plane/PlaneElement.ts","webpack://geomlib/./src/elements/point/AngleDividerElement.ts","webpack://geomlib/./src/elements/point/CircleSlider.ts","webpack://geomlib/./src/elements/point/FixedPoint.ts","webpack://geomlib/./src/elements/point/Foot.ts","webpack://geomlib/./src/elements/point/HarmonicElement.ts","webpack://geomlib/./src/elements/point/Intersection.ts","webpack://geomlib/./src/elements/point/InvertPointElement.ts","webpack://geomlib/./src/elements/point/Layoff.ts","webpack://geomlib/./src/elements/point/LineSlider.ts","webpack://geomlib/./src/elements/point/MeanProportionalElement.ts","webpack://geomlib/./src/elements/point/Midpoint.ts","webpack://geomlib/./src/elements/point/PlaneFootElement.ts","webpack://geomlib/./src/elements/point/PlaneIntersection.ts","webpack://geomlib/./src/elements/point/PlaneSlider.ts","webpack://geomlib/./src/elements/point/PointAnimations.ts","webpack://geomlib/./src/elements/point/PointConstructions.ts","webpack://geomlib/./src/elements/point/PointElement.ts","webpack://geomlib/./src/elements/point/ProportionElement.ts","webpack://geomlib/./src/elements/point/SimilarElement.ts","webpack://geomlib/./src/elements/point/SphereSliderElement.ts","webpack://geomlib/./src/elements/polygon/ApplicationElement.ts","webpack://geomlib/./src/elements/polygon/PolygonAnimations.ts","webpack://geomlib/./src/elements/polygon/PolygonConstructions.ts","webpack://geomlib/./src/elements/polygon/PolygonElement.ts","webpack://geomlib/./src/elements/polygon/RegularPolygonElement.ts","webpack://geomlib/./src/elements/polyhedron/PolyhedronConstructions.ts","webpack://geomlib/./src/elements/polyhedron/PolyhedronElement.ts","webpack://geomlib/./src/elements/polyhedron/PrismElement.ts","webpack://geomlib/./src/elements/polyhedron/PyramidElement.ts","webpack://geomlib/./src/elements/sector/ArcElement.ts","webpack://geomlib/./src/elements/sector/SectorAnimations.ts","webpack://geomlib/./src/elements/sector/SectorConstructions.ts","webpack://geomlib/./src/elements/sector/SectorElement.ts","webpack://geomlib/./src/elements/sphere/SphereConstructions.ts","webpack://geomlib/./src/elements/sphere/SphereElement.ts","webpack://geomlib/./src/index.ts","webpack://geomlib/./src/slideshow.ts","webpack://geomlib/webpack/bootstrap","webpack://geomlib/webpack/startup"],"sourcesContent":["/*----------------------------------------------------------------------+\n| Color parsing and manipulation. |\n| Matches the behavior of Java's Geometry.parseColor() exactly: |\n| 1. null / \"none\" / \"0\" / numeric 0 → null (transparent) |\n| 2. \"random\" → random pastel |\n| 3. \"background\" → bgcolor |\n| 4. \"brighter\" → brighter(bgcolor) |\n| 5. \"darker\" → darker(bgcolor) |\n| 6. Named color (13 names) → rgb string |\n| 7. Hex integer \"rrggbb\" → rgb string |\n| 8. HSB comma triple \"h,s,b\" → rgb string |\n| 9. Fallback → null |\n+----------------------------------------------------------------------*/\n\nexport const colors : {[colorName: string]: string} =\n{\n \"black\": \"rgb(0,0,0)\",\n \"blue\": \"rgb(0,0,255)\",\n \"cyan\": \"rgb(0,255,255)\",\n \"darkGray\": \"rgb(64,64,64)\",\n \"gray\": \"rgb(128,128,128)\",\n \"green\": \"rgb(0,255,0)\",\n \"lightGray\": \"rgb(192,192,192)\",\n \"magenta\": \"rgb(255,0,255)\",\n \"orange\": \"rgb(255,200,0)\",\n \"pink\": \"rgb(255,175,175)\",\n \"red\": \"rgb(255,0,0)\",\n \"white\": \"rgb(255,255,255)\",\n \"yellow\": \"rgb(255,255,0)\"\n};\n\nexport function parseColor(val: string | number, dfault: string, bgcolor: string) : string {\n // Handle numeric 0 (from IConstructionInfo where vertexColor: 0)\n if (val === 0) return null;\n // Handle null/undefined → use default\n if (val == null) return dfault;\n\n let str = String(val);\n // Transparent keywords\n if (str === \"none\" || str === \"0\" || str === \"\") return null;\n // Special keywords\n if (str === \"random\") return randomColor();\n if (str === \"background\") return bgcolor;\n if (str === \"brighter\") return brighter(bgcolor);\n if (str === \"darker\") return darker(bgcolor);\n // Named color lookup\n if (str in colors) return colors[str];\n // Hex color (e.g. \"ff0000\" or \"#ffe9cd\" → rgb(...))\n // Java does: new Color(Integer.parseInt(str, 16))\n // Also handle CSS #-prefixed hex which Java doesn't use but our\n // test pages do (e.g. background: '#ffe9cd')\n let hex = str.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]+$/.test(hex)) {\n let n = parseInt(hex, 16);\n if (!isNaN(n)) {\n let r = (n >> 16) & 0xFF;\n let g = (n >> 8) & 0xFF;\n let b = n & 0xFF;\n return `rgb(${r},${g},${b})`;\n }\n }\n // HSB comma triple (e.g. \"35,19,100\" → h=35/360, s=19/100, b=100/100)\n let parts = str.split(\",\");\n if (parts.length === 3) {\n let h = parseInt(parts[0]) / 360.0;\n let s = parseInt(parts[1]) / 100.0;\n let b = parseInt(parts[2]) / 100.0;\n if (!isNaN(h) && !isNaN(s) && !isNaN(b)) {\n let c = HSVtoRGB(h, s, b);\n return `rgb(${c.r},${c.g},${c.b})`;\n }\n }\n // Fallback — unrecognized\n return null;\n}\n\nexport function randomColor() : string {\n let c = HSVtoRGB(Math.random(), Math.random(), 1.0);\n return `rgb(${c.r},${c.g},${c.b})`;\n}\n\n// Java Color.brighter() — factor 0.7\n// Each component: if 0 → 3; elif < 3 → 3; else min(component/0.7, 255)\nexport function brighter(col: string) : string {\n let rgb = parseRGB(col);\n if (rgb == null) return col;\n let FACTOR = 0.7;\n let threshold = Math.ceil(1.0 / (1.0 - FACTOR)); // = 4\n let r = rgb.r === 0 ? threshold : Math.min(Math.floor(rgb.r / FACTOR), 255);\n let g = rgb.g === 0 ? threshold : Math.min(Math.floor(rgb.g / FACTOR), 255);\n let b = rgb.b === 0 ? threshold : Math.min(Math.floor(rgb.b / FACTOR), 255);\n if (r < threshold) r = threshold;\n if (g < threshold) g = threshold;\n if (b < threshold) b = threshold;\n return `rgb(${r},${g},${b})`;\n}\n\n// Java Color.darker() — factor 0.7\n// Each component: floor(component * 0.7)\nexport function darker(col: string) : string {\n let rgb = parseRGB(col);\n if (rgb == null) return col;\n let FACTOR = 0.7;\n let r = Math.floor(rgb.r * FACTOR);\n let g = Math.floor(rgb.g * FACTOR);\n let b = Math.floor(rgb.b * FACTOR);\n return `rgb(${r},${g},${b})`;\n}\n\n// Keep old names as aliases for backward compatibility with index.ts\nexport function lighten(col: string) : string {\n return brighter(col);\n}\n\nexport function darken(col: string) : string {\n return darker(col);\n}\n\n// Parse an rgb(...) string or hex color into {r, g, b} components.\n// Handles: \"rgb(r,g,b)\", \"#rrggbb\", \"rrggbb\", named colors, HSB triples\nfunction parseRGB(col: string) : {r: number, g: number, b: number} | null {\n if (col == null) return null;\n // rgb(r,g,b) format\n let m = col.match(/^rgb\\((\\d+),(\\d+),(\\d+)\\)$/);\n if (m) return {r: parseInt(m[1]), g: parseInt(m[2]), b: parseInt(m[3])};\n // Named color → resolve to rgb then re-parse\n if (col in colors) return parseRGB(colors[col]);\n // #rrggbb or rrggbb hex\n let hex = col.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{6}$/.test(hex)) {\n let n = parseInt(hex, 16);\n return {r: (n >> 16) & 0xFF, g: (n >> 8) & 0xFF, b: n & 0xFF};\n }\n // HSB comma triple — parse it to get RGB\n let parts = col.split(\",\");\n if (parts.length === 3) {\n let h = parseInt(parts[0]) / 360.0;\n let s = parseInt(parts[1]) / 100.0;\n let b = parseInt(parts[2]) / 100.0;\n if (!isNaN(h) && !isNaN(s) && !isNaN(b)) {\n return HSVtoRGB(h, s, b);\n }\n }\n return null;\n}\n\n// see https://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately\nfunction HSVtoRGB(h: number, s: number, v: number) : {r: number, g: number, b: number} {\n let r: number, g: number, b: number;\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n switch (i % 6) {\n case 0: r = v; g = t; b = p; break;\n case 1: r = q; g = v; b = p; break;\n case 2: r = p; g = v; b = t; break;\n case 3: r = p; g = q; b = v; break;\n case 4: r = t; g = p; b = v; break;\n case 5: r = v; g = p; b = q; break;\n }\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n}\n","import {GeomElement} from \"./elements/GeomElement\";\nimport {PlaneElement} from \"./elements/plane/PlaneElement\";\nimport {FixedPoint} from \"./elements/point/FixedPoint\";\nimport {AllConstructions, Construction, SortedParams, constructions, getConstructionName} from \"./elements/Constructions\";\nimport {PointElement} from \"./elements/point/PointElement\";\nimport {Canvas} from \"canvas\";\nimport {LineElement} from \"./elements/line/LineElement\";\nimport {ISlide, ISlideAnimation, IAnimationConfig} from \"./index\";\nimport {SlateAnimator} from \"./SlateAnimator\";\n\nexport type SlateCanvas = HTMLCanvasElement | Canvas;\n\nexport type ResolveJustification = (ref: string) => string | null | undefined;\n\nexport class Slate {\n\n protected _elements : GeomElement[];\n // Name aliases — secondary names that resolve to existing elements\n // without adding new ones to _elements. The original Geometry Applet\n // and Euclid's *Elements* refer to the same circle by every\n // permutation of its three named points (BCD ≡ CDB ≡ DBC ≡ …) and\n // to lines by either endpoint order (AB ≡ BA). Authors register\n // those equivalences here so the prose-side `{NAME}` shortcode can\n // light up the canonical element without needing a parallel\n // invisible duplicate per alias.\n private _aliases : Map<string, string> = new Map();\n // Optional slideshow walk-through; populated from init().slides.\n // Empty array means no presentation mode is available; SlateControls\n // skips the \"▶ Present\" button.\n private _slides : ISlide[] = [];\n // Consumer-supplied callback resolving a justification ref label\n // (e.g. \"I.Post.3\") to a URL. Returns null/undefined when the ref\n // isn't recognised, in which case the Presentation overlay renders\n // the ref as plain text. Undefined means no resolver was passed.\n private _resolveJustification : ResolveJustification | null = null;\n // Slide-transition animation config (rates, durations, modifiers).\n // The slate ships a default; init() merges in whatever the\n // consumer provides via IInitialization.animationConfig.\n private _animationConfig : IAnimationConfig = {};\n // The frame-driver. Lazy-created on first animateTo() so a\n // headless test slate that never animates doesn't allocate a\n // requestAnimationFrame loop.\n private _animator : SlateAnimator | null = null;\n // Ephemeral helper elements an animation can spawn for its\n // lifetime (compass arms, guide circles, straightedge bars).\n // Drawn on top of _elements in the same face → edge → vertex →\n // name order; never appear in lookupElement; cleared on\n // animator.cancel() as a safety net.\n private _ephemerals : GeomElement[] = [];\n protected _screen : PlaneElement;\n protected _pick : PointElement;\n protected _canvas : SlateCanvas;\n private _htmlCanvas : HTMLCanvasElement = null;\n protected _bgcolor : string;\n public inTest : boolean = false;\n private static numSlate : number = 0;\n private _itsNumSlate : number = -1;\n\n constructor(canvas: SlateCanvas) {\n Slate.numSlate += 1;\n this._itsNumSlate = Slate.numSlate;\n\n this._elements = [];\n if(canvas == null) {\n throw new TypeError(\"canvas cannot be null or undefined.\");\n }\n this._canvas = canvas;\n\n let screen_origin = new FixedPoint({x:0,y:0,z:0});\n screen_origin.name = \"screen_origin\";\n let screen_x = new FixedPoint({x:1,y:0,z:0});\n screen_x.name = \"screen_x\";\n let screen_y = new FixedPoint({x:0,y:1,z:0});\n screen_y.name = \"screen_y\";\n\n let screen = new PlaneElement({\n A: screen_origin,\n B: screen_x,\n C: screen_y\n });\n screen.name = \"screen\";\n screen.nameColor = null;\n screen.isScreen = true;\n this._screen = screen;\n this._pick = null;\n\n for(let e of [screen_origin, screen_x, screen_y, screen]) {\n e.nameColor = null;\n e.vertexColor = null;\n e.vertexHighlightColor = null;\n e.faceColor = null;\n e.faceHighlightColor = null;\n this._elements.push(e);\n }\n let slate = this;\n\n let cnv : HTMLCanvasElement = this._canvas as HTMLCanvasElement;\n this._htmlCanvas = cnv;\n\n if(this._htmlCanvas.addEventListener == null) return;\n\n // Pointer Events unify mouse / touch / stylus into one event model.\n // Setting touch-action: none here (rather than relying on\n // consumer-side CSS) tells the browser not to claim drag gestures\n // for scroll/zoom; calling setPointerCapture on pointerdown ensures\n // we keep getting move/up events even when the finger leaves the\n // canvas bounds. See issue #55 for the design rationale.\n this._htmlCanvas.style.touchAction = \"none\";\n\n // Only the primary pointer drives the drag pipeline for now.\n // Multi-touch (two-finger rotation etc.) is intentionally not yet\n // wired — design questions tracked in issue #57.\n let activePointerId: number | null = null;\n\n this._htmlCanvas.addEventListener(\"pointerdown\", (ev: PointerEvent) => {\n if (activePointerId !== null) return; // already tracking a primary\n activePointerId = ev.pointerId;\n try { slate._htmlCanvas.setPointerCapture(ev.pointerId); } catch (_) { /* ignore */ }\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDown(x, y);\n });\n\n this._htmlCanvas.addEventListener(\"pointermove\", (ev: PointerEvent) => {\n if (ev.pointerId !== activePointerId) return;\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDrag(x, y);\n });\n\n let endPointer = (ev: PointerEvent) => {\n if (ev.pointerId !== activePointerId) return;\n let [x, y] = slate._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseUp(x, y);\n try { slate._htmlCanvas.releasePointerCapture(ev.pointerId); } catch (_) { /* ignore */ }\n activePointerId = null;\n };\n\n this._htmlCanvas.addEventListener(\"pointerup\", endPointer);\n this._htmlCanvas.addEventListener(\"pointercancel\", endPointer);\n this._htmlCanvas.addEventListener(\"lostpointercapture\", (ev: PointerEvent) => {\n if (ev.pointerId === activePointerId) {\n // Browser revoked capture (e.g., system gesture); clear pick state.\n if (slate._pick != null) {\n slate._pick = null;\n }\n activePointerId = null;\n }\n });\n\n }\n\n _getCanvasPosition(x: number, y: number) : [number, number] {\n let r = this._htmlCanvas.getBoundingClientRect();\n return [x - r.left,\n y - r.top];\n }\n\n _onMouseDown(x: number, y: number) {\n this._pick = null;\n this.movePick(x, y);\n };\n\n _onMouseUp(x: number, y: number) {\n if (this._pick == null) return;\n this.movePick(x, y);\n this._pick = null;\n };\n\n _onMouseDrag(x: number, y: number) {\n if (this._pick == null) return;\n this.movePick(x, y);\n };\n\n get elements() : GeomElement[] {\n return this._elements;\n }\n\n set bgcolor(value: string ) {\n this._bgcolor = value;\n }\n\n get bgcolor() : string {\n return this._bgcolor;\n }\n\n // Public accessor for the underlying canvas. Consumer-side code on\n // multi-canvas pages (e.g. the {NAME} shortcode on euclids-elements.org)\n // needs to compare DOM positions of each slate's canvas against the\n // prose-side <span> to pick the right slate. Was protected before\n // 0.4.0; the few prior callers (s.canvas in elem-ref-highlight.js)\n // were just reading undefined and falling through to a brute-force\n // walk of geomlib.slates.\n get canvas() : SlateCanvas {\n return this._canvas;\n }\n\n lookupElement(name: string) : GeomElement {\n for (let elem of this._elements) {\n if (elem.name == name) {\n return elem;\n }\n }\n // Direct miss — follow the alias map and look up the canonical\n // name. One hop only: we don't chase chains because aliases are\n // expected to point at real element names, not at each other.\n let canonical = this._aliases.get(name);\n if (canonical != null) {\n for (let elem of this._elements) {\n if (elem.name == canonical) return elem;\n }\n }\n return null;\n }\n\n // Register a single secondary name → canonical name mapping. Idempotent.\n // Called by init() when the user passes an `aliases` field.\n addAlias(from: string, to: string) : void {\n this._aliases.set(from, to);\n }\n\n addAliases(aliases: {[from: string]: string}) : void {\n for (let from in aliases) this._aliases.set(from, aliases[from]);\n }\n\n get slides() : ISlide[] {\n return this._slides;\n }\n\n set slides(value: ISlide[]) {\n this._slides = value || [];\n }\n\n get resolveJustification() : ResolveJustification | null {\n return this._resolveJustification;\n }\n\n set resolveJustification(value: ResolveJustification | null) {\n this._resolveJustification = value;\n }\n\n get animationConfig() : IAnimationConfig {\n return this._animationConfig;\n }\n\n set animationConfig(value: IAnimationConfig) {\n this._animationConfig = value || {};\n }\n\n get animator() : SlateAnimator | null {\n return this._animator;\n }\n\n get ephemerals() : GeomElement[] {\n return this._ephemerals;\n }\n\n addEphemeral(e: GeomElement) : void {\n this._ephemerals.push(e);\n }\n\n removeEphemeral(e: GeomElement) : void {\n const i = this._ephemerals.indexOf(e);\n if (i >= 0) this._ephemerals.splice(i, 1);\n }\n\n clearEphemerals() : void {\n this._ephemerals.length = 0;\n }\n\n // Lazy-create the animator on first use. Each slate owns at most\n // one — cancel() preserves it for re-use across slide transitions.\n private _ensureAnimator() : SlateAnimator {\n if (this._animator == null) {\n this._animator = new SlateAnimator(this);\n }\n return this._animator;\n }\n\n // Public entry point for slideshow controllers. Diff the current\n // visibility / highlight state against the target, run any slide-\n // listed animations against the elements becoming visible. Newly-\n // visible elements without an explicit animation entry pop in\n // instantly (4b parity). Returns a Promise that resolves when the\n // animator completes the run or cancel() is called.\n animateTo(\n targetVisible: Set<string>,\n targetHighlighted: Set<string>,\n slideAnimations: ISlideAnimation[],\n mode: \"cascade\" | \"parallel\",\n ) : Promise<void> {\n return this._ensureAnimator().run(\n targetVisible, targetHighlighted, slideAnimations, mode,\n );\n }\n\n // Hide every named element whose name is not in the supplied set.\n // Names not matching any element are silently ignored; elements\n // without a name (intermediate construction outputs) are left alone.\n // Screen-helper elements (screen / screen_origin / screen_x /\n // screen_y) follow the same rule: their visible flag does flip, but\n // since they're created with all-null colours they never draw\n // visible pixels anyway. Called by the presentation overlay per\n // slide; consumers can call directly too.\n setVisibleNames(names: string[]) : void {\n const visible = new Set(names);\n for (let elem of this._elements) {\n if (elem.name == null) continue;\n elem.visible = visible.has(elem.name);\n }\n }\n\n // Restore every element's visible flag to true. Counterpart to\n // setVisibleNames; called on presentation exit so the canvas\n // returns to its inline default.\n clearVisibility() : void {\n for (let elem of this._elements) elem.visible = true;\n }\n\n // Sort params into P[] (points), E[] (other elements), N[] (integers),\n // matching Java's selectDataChoice (Slate.java lines 344-393).\n // LineElements are expanded into their two endpoint PointElements.\n convertParams(params: any[]) : SortedParams {\n let P: PointElement[] = [];\n let E: GeomElement[] = [];\n let N: number[] = [];\n for(let param of params) {\n switch(typeof(param)) {\n case \"string\":\n let g : GeomElement = this.lookupElement(param);\n if ( g == null )\n throw new TypeError(`Element with name ${param} not found.`);\n if (g instanceof PointElement) {\n P.push(g);\n } else if (g instanceof LineElement) {\n // LineElement expands to two PointElements (matching Java)\n P.push(g.A);\n P.push(g.B);\n } else {\n E.push(g);\n }\n break;\n case \"number\":\n N.push(param);\n break;\n default:\n throw new TypeError(\"Expecting only named elements (strings) or numbers.\");\n }\n }\n return {P, E, N};\n }\n\n findConstruction(cm : AllConstructions, sp: SortedParams) : Construction {\n for(let c of constructions) {\n if(c.validateSignature(cm, sp)) {\n return c;\n }\n }\n return null;\n }\n\n createElement(cm : AllConstructions, params: any[], name?: string) : GeomElement {\n let sp : SortedParams = this.convertParams(params);\n let c : Construction = this.findConstruction(cm, sp);\n if(c == null) {\n let cName : String = getConstructionName(cm);\n if (name == null) {\n name = \"\";\n }\n throw new TypeError(`Construction not found for \"${name}\" ${cName} with params P=[${sp.P}] E=[${sp.E}] N=[${sp.N}]`);\n }\n let [gs, g] = c.construct(this._screen, sp.P, sp.E, sp.N);\n // Mark as preexisting if this element was already in _elements\n // before this construction (e.g., point;first returns an existing\n // PointElement). Preexisting elements are skipped during\n // rotate/translate to avoid double-movement.\n // (Java: Slate.java preexists[] array)\n if (this._elements.indexOf(g) !== -1) {\n g.preexists = true;\n }\n if(name != null)\n g.name = name;\n for (let elem of gs) {\n if (this._elements.indexOf(elem) == -1)\n this._elements.push(elem);\n }\n if(this._elements.indexOf(g) == -1)\n this._elements.push(g);\n return g;\n }\n\n reset() : void {\n for (let element of this._elements) {\n element.reset();\n }\n this.update();\n }\n\n update() : void {\n for(let element of this._elements) element.update();\n this.drawElements();\n }\n\n drawElements(): void {\n if(this.inTest) return;\n // we draw all the elements first\n let w = this._canvas.width;\n let h = this._canvas.height;\n let ctx : CanvasRenderingContext2D = this._canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.clearRect(0,0,w,h);\n ctx.fillStyle = this._bgcolor;\n ctx.fillRect(0,0,w,h);\n for(let element of this._elements) element.drawFace(this._canvas);\n for(let element of this._elements) element.drawEdge(this._canvas);\n for(let element of this._elements) element.drawVertex(this._canvas);\n // and then draw their names.\n for(let element of this._elements)\n element.drawName(this._canvas);\n // Ephemeral animation helpers render on top of the permanent\n // figure (compass arms, guide circles, straightedge bars).\n // Same face → edge → vertex → name pass order so a guide arc\n // overlays correctly without re-clearing the canvas.\n for(let e of this._ephemerals) e.drawFace(this._canvas);\n for(let e of this._ephemerals) e.drawEdge(this._canvas);\n for(let e of this._ephemerals) e.drawVertex(this._canvas);\n for(let e of this._ephemerals) e.drawName(this._canvas);\n }\n\n // Update coordinates starting with element[i+1], matching Java's\n // Slate.java updateCoordinates (lines 808-814). Only elements AFTER\n // the picked element are recomputed — elements before it are left\n // untouched to avoid reprojection artifacts after rotation.\n updateCoordinates(i : number) {\n for(++i; i < this._elements.length; i++) {\n if(!this._elements[i].defined())\n this._elements[i].reset();\n this._elements[i].update();\n }\n this.drawElements();\n }\n\n translateCoordinates(dx : number, dy: number) {\n // translate all non-preexisting elements\n // (Java: Slate.java line 819 — if (!preexists[i]) element[i].translate(...))\n for(let i = 0; i < this._elements.length; i++) {\n let elem = this._elements[i];\n if (!elem.preexists)\n elem.translate(dx, dy);\n }\n this.update();\n }\n\n closestVisiblePoint(elements : GeomElement[], p : PointElement, tolerance : number = 30) : PointElement {\n // Use 2D screen distance (x,y only, ignoring z) for picking,\n // matching the Java applet's movePick() at Slate.java:887-889.\n // The canvas is a 2D projection; a 3D point at (x,y,z) renders\n // at screen position (x,y) regardless of z.\n let screenDist2 = (a: PointElement, b: PointElement) =>\n (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);\n let sortedDistanceElements = elements\n .filter(e => e instanceof PointElement)\n .map(e => e as PointElement)\n .filter(e => e.vertexColor != null)\n .sort((a,b) => {\n let adcp = screenDist2(a, p);\n let bdcp = screenDist2(b, p);\n if(adcp < bdcp) {\n return -1;\n } else if (bdcp < adcp) {\n return 1;\n }\n return 0;\n });\n if (sortedDistanceElements.length == 0) return null;\n let bestDistPoint = sortedDistanceElements[0];\n if(Math.sqrt(screenDist2(bestDistPoint, p)) > tolerance) return null;\n return bestDistPoint;\n }\n\n private _getPick(c: number, d: number) : PointElement {\n if (this._pick != null) return this._pick;\n let currentPoint = new PointElement({x:c,y:d});\n let closestVisiblePoint = this.closestVisiblePoint(this._elements, currentPoint);\n if(closestVisiblePoint == null) return;\n this._pick = closestVisiblePoint;\n return this._pick;\n }\n\n // Set the pivot point for scene rotation.\n // Format: \"pointName\" or \"pointName,planeName\"\n // Without a plane, the pivot is set on the screen plane.\n // With a plane, the pivot is set on that plane (for 3D rotation).\n // (Java: Slate.java setPivot, lines 787-801)\n setPivot(param : string) : void {\n let parts = param.split(\",\");\n let pointName = parts[0].trim();\n let e : GeomElement = this.lookupElement(pointName);\n if (e == null || !(e instanceof PointElement)) return;\n let piv : PointElement = e as PointElement;\n\n if (parts.length > 1) {\n // \"A,xyplane\" — set pivot on a specific plane\n let planeName = parts[1].trim();\n let p : GeomElement = this.lookupElement(planeName);\n if (p == null || !(p instanceof PlaneElement)) return;\n (p as PlaneElement).pivot = piv;\n } else {\n // \"A\" — set pivot on screen plane\n piv._AP = this._screen;\n this._screen.pivot = piv;\n }\n }\n\n movePick(c: number, d: number) : void {\n if(this._getPick(c, d) == null) return;\n let picki = this._elements.indexOf(this._pick);\n\n let w : number = this._canvas.width;\n if (c < 0) c = 0;\n else if (c > w) c = w;\n let h : number = this._canvas.height;\n if (d < 0) d = 0;\n else if (d > h) d = h;\n if (Math.abs(c - this._pick.x) + Math.abs(d - this._pick.y) < 1.0) {\n return; // no motion\n }\n if ( this._pick.draggable ) {\n if(this._pick.drag(c,d)) {\n this.updateCoordinates(picki);\n } else {\n return;\n }\n } else if (this._pick.AP != null \n && this._pick.AP.pivot != null\n && this._pick.AP.pivot != this._pick) { // rotate around the pivot\n this.rotateCoordinates(c,d);\n } else {\n let dx = c - this._pick.x;\n let dy = d - this._pick.y;\n this.translateCoordinates(dx,dy);\n }\n this.drawElements();\n }\n\n rotateCoordinates(c : number, d : number) : void {\n // rotate space according to how pick goes around pivot in the plane\n let pick : PointElement = this._pick;\n let piv : PointElement = pick.AP.pivot;\n // compute old and new pick's 3D coordinates relative to the pivot\n let oldP : PointElement = PointElement.difference(pick,piv);\n let newx : number = c-piv.x;\n let newy : number = d-piv.y;\t\t//(newz is irrelevant)\n // find their 2D coordinates on the plane\n let S : PointElement = pick.AP.S;\n let T : PointElement = pick.AP.T;\n let olds : number = PointElement.dot(oldP,S);\n let oldt : number = PointElement.dot(oldP,T);\n let den : number = S.x * T.y - S.y * T.x;\n let news : number = (newx*T.y - newy*T.x)/den;\n let newt : number = (newy*S.x - newx*S.y)/den;\n // compute the scale&rotation factors\n den = olds*olds + oldt*oldt;\n let ac : number = (news*olds + newt*oldt)/den;\n let as : number = (newt*olds - news*oldt)/den;\n // Rotate all non-preexisting elements directly.\n // (Java: Slate.java line 843-845)\n for (let elem of this._elements) {\n if (!elem.preexists)\n elem.rotate(piv, ac, as);\n }\n // After direct rotation, recompute derived elements from their (now\n // rotated) parents. Java doesn't need this because element[] carries\n // duplicate entries for shared objects — a Layoff created by\n // line;extend and re-referenced by point;last appears at two indices,\n // one with preexists=false that gets rotated directly. TS dedupes\n // _elements, so a shared object marked preexists=true is skipped,\n // which means Layoff-style points backed by bare LineElement wrappers\n // would never get moved directly (bare LineElement.rotate is a no-op).\n // Running update() rebuilds them from their (rotated) parents, which\n // produces the same result because rotation is a linear operation\n // and Layoff.update() derives its position from parent coords.\n this.update();\n }\n\n}\n","// Slide-transition animator. Drives Animation.build() steps over\n// time via requestAnimationFrame, calling slate.drawElements() each\n// frame so the per-element drawProgress drives the partial geometry.\n// Cascade mode plays one step at a time in slide order; parallel\n// mode runs them all concurrently.\n//\n// Owned lazily by a Slate (created on first animateTo() call) and\n// reused across transitions; cancel() resolves the in-flight promise\n// and finalises every active step so a rapid Next/Prev sequence\n// preempts the previous animation cleanly.\n\nimport {Slate} from \"./Slate\";\nimport {findAnimation, IAnimationStep, Animation} from \"./elements/Animations\";\nimport {GeomElement} from \"./elements/GeomElement\";\nimport {ISlideAnimation} from \"./index\";\n\n// Wrapped step with mutable progress state. The animator manages\n// these; concrete Animations don't see them.\ninterface ActiveStep {\n step: IAnimationStep;\n elapsedMs: number;\n started: boolean;\n finalised: boolean;\n}\n\n// Wrapped per-target group of steps. Each ISlideAnimation entry maps\n// to one Group, and Animation.build() returns the inner step list.\n// Cascade mode runs groups in order; within a group, steps are always\n// sequential (an Animation that wants edge-then-fade returns 2 steps).\ninterface ActiveGroup {\n target: GeomElement;\n steps: ActiveStep[];\n currentIndex: number; // which step is in flight; advances as each finalises\n finishedAtMs?: number; // when the last step finalised (for cascadeGapMs pacing)\n}\n\n// Time source: performance.now() when available (monotonic, high-res,\n// unaffected by NTP adjustments and not subject to wall-clock skew).\n// Falls back to Date.now() in headless environments without\n// performance.now(). dt is computed from the diff between consecutive\n// frames and clamped (see MAX_DT_MS) so background-tab pauses or\n// long single-frame stalls don't cause the next frame to advance by\n// a multi-second jump — hardware with different refresh rates\n// (60 Hz / 120 Hz / 144 Hz) all see the same total wall-clock\n// duration because progress is dt-driven, not frame-count driven.\nconst HAS_RAF = (typeof requestAnimationFrame === \"function\");\nconst NOW: () => number = (typeof performance !== \"undefined\" && performance.now)\n ? () => performance.now()\n : () => Date.now();\n// Clamp per-frame dt. Prevents a backgrounded tab's accumulated\n// pause-time from collapsing an entire animation into one frame on\n// resume; also smooths very long single-frame stalls (e.g. GC pause).\n// 100 ms = 6 frames at 60 Hz worth of catch-up — enough for normal\n// jitter, small enough that a hidden tab resuming after 30 s doesn't\n// blink through 30 s of construction in one paint.\nconst MAX_DT_MS = 100;\n\n// Duration of the post-animation emphasis fade-out. Trims the visible\n// \"snap from 6 px to highlight thickness\" into a smooth taper so the\n// settle isn't jarring when the underlying element is also slide-\n// highlighted (the polygon ABC over the highlighted AB / AC / BC is\n// the canonical case).\nconst EMPHASIS_FADE_OUT_MS = 250;\n\nexport class SlateAnimator {\n private slate: Slate;\n // The currently-running set of groups. Empty when idle.\n private groups: ActiveGroup[] = [];\n private mode: \"cascade\" | \"parallel\" = \"cascade\";\n private resolveCurrent: (() => void) | null = null;\n // For cascade, this index points at the group currently playing.\n private cascadeIndex: number = 0;\n private rafId: number | null = null;\n private lastFrameMs: number = 0;\n // Emphasis fade-out phase tracking. After every group's last step\n // finalises, the animator enters this phase and ticks each target's\n // emphasisAmount from 1 → 0 over EMPHASIS_FADE_OUT_MS before\n // resolving the promise.\n private fadingOut: boolean = false;\n private fadeStartMs: number = 0;\n\n constructor(slate: Slate) {\n this.slate = slate;\n }\n\n // Public entry point. Cancels any in-flight run, computes the\n // diff between current state and the target, builds steps for\n // every slide-listed animation, kicks off the rAF loop, and\n // returns a promise that resolves when every step has finalised\n // (or cancel() is called).\n run(\n targetVisible: Set<string>,\n targetHighlighted: Set<string>,\n slideAnimations: ISlideAnimation[],\n mode: \"cascade\" | \"parallel\",\n ): Promise<void> {\n // Preempt any in-flight run so the new transition starts cleanly.\n if (this.groups.length > 0) this.cancel();\n\n // Build the new groups from the slide's animation list, in\n // array order. Newly-visible elements without an explicit\n // animation entry pop in instantly (4b parity) — handled by\n // the caller before invoking run().\n const groups: ActiveGroup[] = [];\n const config = this.slate.animationConfig || {};\n const speedMul = config.speedMultiplier != null ? config.speedMultiplier : 1;\n const reduced = config.reducedMotion === true || speedMul === 0;\n for (const entry of slideAnimations || []) {\n const target = this.slate.lookupElement(entry.elem);\n if (target == null) continue;\n const animation: Animation | null = findAnimation(entry.name);\n if (animation == null) continue;\n // Type guard: console.warn-and-skip when the animation's\n // elementType doesn't match the actual target class.\n if (!(target instanceof (animation.elementType as any))) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n \"[geomlib] animation '\" + animation.name +\n \"' targets \" + (animation.elementType as any).name +\n \" but element '\" + entry.elem + \"' is \" +\n (target.constructor as any).name +\n \" — falling back to instant\"\n );\n }\n target.drawProgress = 1;\n target.visible = true;\n continue;\n }\n const builtSteps: IAnimationStep[] = animation.build(target, this.slate, entry.args || {}) || [];\n // Compute each step's resolved duration per the precedence\n // chain: entry.durationMs > config.durations[name] >\n // config.rates[name] > step.durationMs (already populated\n // by build() from the animation's defaults).\n const resolvedSteps: ActiveStep[] = builtSteps.map(step => ({\n step: {\n ...step,\n durationMs: resolveDuration(\n step.durationMs,\n entry.durationMs,\n config.durations && config.durations[animation.name],\n ),\n },\n elapsedMs: 0,\n started: false,\n finalised: false,\n }));\n groups.push({ target, steps: resolvedSteps, currentIndex: 0 });\n }\n\n // Visibility / highlight target state always applies — the\n // animation only governs HOW newly-visible elements appear.\n // Apply hidden / highlighted state synchronously; visible flips\n // are deferred for elements being animated because their setup\n // hook decides what to do with them.\n const animatedTargets = new Set<GeomElement>(groups.map(g => g.target));\n for (const e of this.slate.elements) {\n if (e.name == null) continue;\n const willBeVisible = targetVisible.has(e.name);\n const willBeHighlighted = targetHighlighted.has(e.name);\n if (animatedTargets.has(e)) {\n // Animation owns the visible flag during its run.\n // Deferred reveal (#83): the target stays hidden until\n // its own first step starts — drawProgress only gates\n // the edge, so a pre-revealed target would render its\n // face fill and name label at full strength while\n // earlier cascade steps play. _startStep flips it\n // visible; finalise() restores the final state on\n // every exit path.\n e.shouldHighlight = willBeHighlighted;\n e.drawProgress = 0;\n e.visible = false;\n } else {\n // Instant flip — matches 4b behaviour.\n e.visible = willBeVisible;\n e.shouldHighlight = willBeHighlighted;\n e.drawProgress = 1;\n }\n }\n\n // Reduced motion / speedMultiplier 0 / no groups: fast path.\n // Finalise everything synchronously and return a resolved\n // promise so the controller can flip the caption immediately.\n if (reduced || groups.length === 0) {\n for (const g of groups) {\n for (const as of g.steps) {\n if (as.step.setup && !as.started) as.step.setup();\n as.step.finalise();\n as.finalised = true;\n }\n }\n this.slate.clearEphemerals();\n this.slate.drawElements();\n return Promise.resolve();\n }\n\n // Mark every animating target as emphasized so its render pops\n // over any slide-highlighted underlying elements that share a\n // path (e.g. the polygon ABC animating over highlighted lines\n // AB / AC / BC). Cleared in _allFinalised / cancel().\n for (const g of groups) {\n g.target.emphasized = true;\n }\n\n this.groups = groups;\n this.mode = mode;\n this.cascadeIndex = 0;\n this.lastFrameMs = NOW();\n return new Promise<void>(resolve => {\n this.resolveCurrent = resolve;\n this._kickoff();\n this._scheduleFrame();\n });\n }\n\n // Drop the during-animation emphasis bumps from every group target.\n // Called once on completion or cancel so the slide settles back\n // into its plain highlight / not-highlighted steady state.\n private _clearAnimatedEmphasis(): void {\n for (const g of this.groups) {\n g.target.emphasized = false;\n }\n }\n\n // Cancel any in-flight run: finalise every step that started, wipe\n // ephemerals as a safety net, resolve the pending promise.\n cancel(): void {\n if (this.groups.length === 0) return;\n for (const g of this.groups) {\n for (let i = 0; i < g.steps.length; i++) {\n const as = g.steps[i];\n if (as.finalised) continue;\n // Run setup if we never got to it, so finalise sees a\n // consistent post-setup state.\n if (as.step.setup && !as.started) {\n as.step.setup();\n as.started = true;\n }\n as.step.finalise();\n as.finalised = true;\n }\n }\n this._clearAnimatedEmphasis();\n this.slate.clearEphemerals();\n this.slate.drawElements();\n this.groups = [];\n this.fadingOut = false;\n if (this.rafId != null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(this.rafId);\n }\n this.rafId = null;\n if (this.resolveCurrent) {\n this.resolveCurrent();\n this.resolveCurrent = null;\n }\n }\n\n // Fire any pending setup() hooks for the steps that are about to\n // tick on the very first frame.\n private _kickoff(): void {\n if (this.mode === \"cascade\") {\n this._startGroupIndex(0);\n } else {\n // Parallel: start the first step of every group at once.\n for (const g of this.groups) {\n this._startStep(g, 0);\n }\n }\n }\n\n private _startGroupIndex(idx: number): void {\n if (idx >= this.groups.length) return;\n this._startStep(this.groups[idx], 0);\n }\n\n private _startStep(g: ActiveGroup, stepIdx: number): void {\n if (stepIdx >= g.steps.length) return;\n const as = g.steps[stepIdx];\n if (as.started) return;\n // Deferred reveal (#83): the target was held invisible through\n // any earlier cascade steps; it appears the moment its own\n // first step begins. setup() runs after this, so an animation\n // that hides the target to render ephemeral proxies instead\n // can still do so.\n if (stepIdx === 0) g.target.visible = true;\n if (as.step.setup) as.step.setup();\n as.started = true;\n g.currentIndex = stepIdx;\n }\n\n private _scheduleFrame(): void {\n if (HAS_RAF) {\n this.rafId = requestAnimationFrame(now => this._frame(now));\n } else {\n // No rAF (tests, node): synthesize a frame ~16ms in the\n // future via setTimeout. Mocha tests stub this differently.\n const t = NOW() + 16;\n this.rafId = (setTimeout(() => this._frame(t), 16) as any);\n }\n }\n\n private _frame(nowMs: number): void {\n if (this.groups.length === 0) return;\n const config = this.slate.animationConfig || {};\n const speedMul = config.speedMultiplier != null ? config.speedMultiplier : 1;\n const cascadeGap = config.cascadeGapMs || 0;\n // Real elapsed wall-clock dt, clamped to MAX_DT_MS so a\n // backgrounded tab or long GC pause doesn't fast-forward\n // through the rest of the animation in a single frame.\n let rawDt = nowMs - this.lastFrameMs;\n if (rawDt < 0) rawDt = 0;\n if (rawDt > MAX_DT_MS) rawDt = MAX_DT_MS;\n const dt = rawDt * speedMul;\n this.lastFrameMs = nowMs;\n\n // Advance the active step(s).\n if (this.mode === \"cascade\") {\n this._tickCascade(dt, nowMs, cascadeGap);\n } else {\n this._tickParallel(dt, nowMs);\n }\n\n // Always redraw so partial geometry shows up. Ephemerals\n // drawn alongside permanent elements.\n this.slate.drawElements();\n\n // Once every step's tick has finalised, enter the fade-out\n // phase: tick each target's emphasisAmount from 1 → 0 over\n // EMPHASIS_FADE_OUT_MS, redrawing each frame. Only resolves\n // once the fade completes.\n if (this._allFinalised()) {\n if (!this.fadingOut) {\n this.fadingOut = true;\n this.fadeStartMs = nowMs;\n }\n const fadeElapsed = nowMs - this.fadeStartMs;\n const fp = fadeElapsed >= EMPHASIS_FADE_OUT_MS\n ? 1 : fadeElapsed / EMPHASIS_FADE_OUT_MS;\n const ea = 1 - fp;\n for (const g of this.groups) {\n g.target.emphasisAmount = ea;\n }\n this.slate.drawElements();\n if (fp >= 1) {\n this._clearAnimatedEmphasis();\n this.groups = [];\n this.fadingOut = false;\n this.rafId = null;\n if (this.resolveCurrent) {\n this.resolveCurrent();\n this.resolveCurrent = null;\n }\n return;\n }\n this._scheduleFrame();\n return;\n }\n this._scheduleFrame();\n }\n\n private _tickCascade(dt: number, nowMs: number, cascadeGap: number): void {\n // Advance the current cascade group's current step. When it\n // finalises, optionally wait cascadeGapMs before advancing\n // either to the next step in the same group or to the next\n // group's first step.\n while (this.cascadeIndex < this.groups.length) {\n const g = this.groups[this.cascadeIndex];\n const as = g.steps[g.currentIndex];\n if (!as) {\n this.cascadeIndex += 1;\n if (this.cascadeIndex < this.groups.length) {\n this._startStep(this.groups[this.cascadeIndex], 0);\n }\n continue;\n }\n // Honour cascadeGap between groups.\n if (as.finalised) {\n if (g.finishedAtMs == null) g.finishedAtMs = nowMs;\n if (nowMs - g.finishedAtMs < cascadeGap) return;\n // Advance.\n if (g.currentIndex + 1 < g.steps.length) {\n this._startStep(g, g.currentIndex + 1);\n } else {\n this.cascadeIndex += 1;\n if (this.cascadeIndex < this.groups.length) {\n this._startStep(this.groups[this.cascadeIndex], 0);\n }\n }\n continue;\n }\n // Tick this step.\n this._tickStep(g.target, as, dt, nowMs);\n return; // one step per frame in cascade mode\n }\n }\n\n private _tickParallel(dt: number, nowMs: number): void {\n for (const g of this.groups) {\n const as = g.steps[g.currentIndex];\n if (!as) continue;\n if (as.finalised) {\n if (g.currentIndex + 1 < g.steps.length) {\n this._startStep(g, g.currentIndex + 1);\n }\n continue;\n }\n this._tickStep(g.target, as, dt, nowMs);\n }\n }\n\n private _tickStep(target: GeomElement, as: ActiveStep, dt: number, nowMs: number): void {\n if (!as.started) {\n if (as.step.setup) as.step.setup();\n as.started = true;\n }\n as.elapsedMs += dt;\n const total = as.step.durationMs;\n let p = total > 0 ? as.elapsedMs / total : 1;\n if (p > 1) p = 1;\n if (p < 0) p = 0;\n as.step.tick(p, dt, as.elapsedMs);\n if (p >= 1) {\n as.step.finalise();\n as.finalised = true;\n }\n }\n\n private _allFinalised(): boolean {\n for (const g of this.groups) {\n for (const as of g.steps) {\n if (!as.finalised) return false;\n }\n }\n return true;\n }\n}\n\n// Resolution order, top-down, returning the first defined non-undefined.\nfunction resolveDuration(stepDefault: number, slideOverride?: number, configOverride?: number): number {\n if (slideOverride != null) return slideOverride;\n if (configOverride != null) return configOverride;\n return stepDefault;\n}\n","/*----------------------------------------------------------------------+\n| Title: SlateControls.ts |\n| UI overlay for geometry diagrams: reset, maximize, new window. |\n| Buttons are canvas-drawn icons overlaid on each Slate canvas. |\n| Keyboard shortcuts match the original Java applet: |\n| r / space → reset |\n| u / return → new window |\n| m → maximize/minimize |\n+----------------------------------------------------------------------*/\n\nimport {Slate} from \"./Slate\";\nimport {computeSlideState} from \"./slideshow\";\n\ninterface IInitConfig {\n background: string;\n title: string;\n align?: number;\n canvasid?: string;\n pivot?: string;\n elements: any[];\n}\n\n// Slate-controls icon sizing. The historical default is 20 px; touch\n// devices (coarse pointer) get a slightly tighter 15-px row per author\n// preference — small enough to stay out of the diagram, still hittable\n// with a fingertip.\nfunction isCoarsePointer(): boolean {\n return typeof window !== \"undefined\"\n && typeof window.matchMedia === \"function\"\n && window.matchMedia(\"(pointer: coarse)\").matches;\n}\nconst BTN_SIZE = isCoarsePointer() ? 18 : 20;\nconst BTN_GAP = isCoarsePointer() ? 4 : 4;\nconst BTN_MARGIN = isCoarsePointer() ? 7 : 8;\n\n// Minimal event-target interface so this helper is testable without a real\n// `Window`. Browser `Window`, `Document`, and `Element` all satisfy it.\nexport interface IResizeTarget {\n addEventListener(type: \"resize\", listener: () => void): void;\n removeEventListener(type: \"resize\", listener: () => void): void;\n}\n\n/**\n * Attach `callback` to the target's \"resize\" event. Returns a teardown\n * function that removes the listener — call it to stop tracking.\n */\nexport function trackWindowResize(target: IResizeTarget, callback: () => void): () => void {\n const handler = () => callback();\n target.addEventListener(\"resize\", handler);\n return () => target.removeEventListener(\"resize\", handler);\n}\n\nexport function createControls(slate: Slate, canvas: HTMLCanvasElement, config: IInitConfig): void {\n // Skip in headless/test environments\n if (!canvas.parentElement) return;\n\n let controls = new SlateControls(slate, canvas, config);\n controls.init();\n}\n\nclass SlateControls {\n private _slate: Slate;\n private _canvas: HTMLCanvasElement;\n private _config: IInitConfig;\n private _wrapper: HTMLDivElement;\n private _maximized: boolean = false;\n private _savedStyles: {\n wrapperPosition: string;\n wrapperTop: string;\n wrapperLeft: string;\n wrapperWidth: string;\n wrapperHeight: string;\n wrapperZIndex: string;\n wrapperBackground: string;\n canvasStyleWidth: string;\n canvasStyleHeight: string;\n canvasAttrWidth: number;\n canvasAttrHeight: number;\n } = null;\n private _stopTrackingResize: (() => void) | null = null;\n\n // Presentation-mode (slideshow) state. Caption + nav float over\n // the maximized canvas; no fullscreen overlay, no background takeover.\n private _presenting: boolean = false;\n private _presentationIndex: number = 0;\n private _presentationOverlay: HTMLDivElement | null = null;\n private _presentationCaption: HTMLDivElement | null = null;\n private _presentationJusts: HTMLDivElement | null = null;\n private _presentationCounter: HTMLSpanElement | null = null;\n private _presentationOnKey: ((e: KeyboardEvent) => void) | null = null;\n // Single-pin sticky for caption {NAME} refs: only one element may be\n // emphasized at a time. Clicking another ref clears the prior pin\n // before stickying the new one; hover is suppressed while a pin is\n // active so the sticky element stays the dominant one.\n private _stickyRefSpan: HTMLSpanElement | null = null;\n private _stickyRefElem: import(\"./elements/GeomElement\").GeomElement | null = null;\n\n constructor(slate: Slate, canvas: HTMLCanvasElement, config: IInitConfig) {\n this._slate = slate;\n this._canvas = canvas;\n this._config = config;\n }\n\n init(): void {\n this._wrapper = this.createWrapper();\n this.createButtons();\n this.addKeyboardShortcuts();\n }\n\n private createWrapper(): HTMLDivElement {\n let wrapper = document.createElement(\"div\");\n wrapper.style.position = \"relative\";\n wrapper.style.display = \"inline-block\";\n\n // Insert wrapper before canvas, then move canvas into it\n this._canvas.parentElement.insertBefore(wrapper, this._canvas);\n wrapper.appendChild(this._canvas);\n\n // Make canvas focusable for keyboard shortcuts\n this._canvas.setAttribute(\"tabindex\", \"0\");\n this._canvas.style.outline = \"none\"; // default no outline\n this._canvas.addEventListener(\"focus\", () => {\n this._canvas.style.outline = \"2px solid rgba(66,133,244,0.5)\";\n });\n this._canvas.addEventListener(\"blur\", () => {\n this._canvas.style.outline = \"none\";\n });\n\n return wrapper;\n }\n\n private createButtons(): void {\n let buttons = [\n { draw: drawResetIcon, action: () => this.onReset(), title: \"Reset (r)\" },\n { draw: drawMaximizeIcon, action: () => this.onMaximize(), title: \"Maximize (m)\" },\n { draw: drawNewWindowIcon, action: () => this.onNewWindow(), title: \"New Window (u)\" },\n ];\n\n // Conditionally append a \"▶ Present\" button when the slate\n // carries any slides. Slates without slides see the same\n // three-button row as before — backwards-compatible.\n if (this._slate.slides.length > 0) {\n buttons.push({\n draw: drawPresentIcon,\n action: () => this.onPresent(),\n title: \"Present (p)\",\n });\n }\n\n for (let i = 0; i < buttons.length; i++) {\n let btn = document.createElement(\"button\");\n btn.style.position = \"absolute\";\n btn.style.top = BTN_MARGIN + \"px\";\n btn.style.right = (BTN_MARGIN + i * (BTN_SIZE + BTN_GAP)) + \"px\";\n btn.style.width = BTN_SIZE + \"px\";\n btn.style.height = BTN_SIZE + \"px\";\n btn.style.padding = \"0\";\n btn.style.border = \"none\";\n btn.style.cursor = \"pointer\";\n btn.style.background = \"rgba(0,0,0,0.12)\";\n btn.style.borderRadius = \"3px\";\n btn.title = buttons[i].title;\n\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.background = \"rgba(0,0,0,0.3)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.background = \"rgba(0,0,0,0.12)\";\n });\n\n // Draw icon on a small canvas inside the button\n let iconCanvas = document.createElement(\"canvas\");\n iconCanvas.width = BTN_SIZE;\n iconCanvas.height = BTN_SIZE;\n iconCanvas.style.display = \"block\";\n let ctx = iconCanvas.getContext(\"2d\");\n buttons[i].draw(ctx, BTN_SIZE);\n btn.appendChild(iconCanvas);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n buttons[i].action();\n // Return focus to the main canvas after button click\n this._canvas.focus();\n });\n\n // Store reference for maximize icon swap\n if (i === 1) {\n (this as any)._maxBtn = btn;\n (this as any)._maxIconCanvas = iconCanvas;\n }\n\n this._wrapper.appendChild(btn);\n }\n }\n\n private addKeyboardShortcuts(): void {\n this._canvas.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n switch (e.key) {\n case \"r\":\n case \"R\":\n case \" \":\n e.preventDefault();\n this.onReset();\n break;\n case \"u\":\n case \"U\":\n case \"Enter\":\n e.preventDefault();\n this.onNewWindow();\n break;\n case \"m\":\n case \"M\":\n e.preventDefault();\n this.onMaximize();\n break;\n case \"p\":\n case \"P\":\n if (this._slate.slides.length > 0) {\n e.preventDefault();\n this.onPresent();\n }\n break;\n }\n });\n }\n\n private onReset(): void {\n this._slate.reset();\n }\n\n private onMaximize(): void {\n if (this._maximized) {\n this.minimize();\n } else {\n this.maximize();\n }\n }\n\n private maximize(): void {\n // Save current styles AND canvas width/height attributes. The attrs\n // are the canvas bitmap resolution; resizeAndRedraw() overwrites them\n // to match the maximized CSS size, so minimize() must restore them.\n this._savedStyles = {\n wrapperPosition: this._wrapper.style.position,\n wrapperTop: this._wrapper.style.top,\n wrapperLeft: this._wrapper.style.left,\n wrapperWidth: this._wrapper.style.width,\n wrapperHeight: this._wrapper.style.height,\n wrapperZIndex: this._wrapper.style.zIndex,\n wrapperBackground: this._wrapper.style.background,\n canvasStyleWidth: this._canvas.style.width,\n canvasStyleHeight: this._canvas.style.height,\n canvasAttrWidth: this._canvas.width,\n canvasAttrHeight: this._canvas.height,\n };\n\n // Maximize wrapper to fill viewport\n this._wrapper.style.position = \"fixed\";\n this._wrapper.style.top = \"0\";\n this._wrapper.style.left = \"0\";\n this._wrapper.style.width = \"100vw\";\n this._wrapper.style.height = \"100vh\";\n this._wrapper.style.zIndex = \"9999\";\n this._wrapper.style.background = \"white\";\n\n // Expand canvas to fill wrapper\n this._canvas.style.width = \"100%\";\n this._canvas.style.height = \"100%\";\n\n this.resizeAndRedraw();\n this._maximized = true;\n this.updateMaximizeIcon();\n\n // Track window resize so the canvas bitmap stays in sync with the\n // wrapper's 100vw × 100vh CSS size. Without this the bitmap stays\n // at its maximize-time dimensions while the CSS display follows\n // viewport changes, and the diagram visibly stretches/squishes.\n this._stopTrackingResize = trackWindowResize(window, () => this.resizeAndRedraw());\n }\n\n private minimize(): void {\n if (!this._savedStyles) return;\n\n // Stop tracking window resize before restoring saved layout.\n if (this._stopTrackingResize) {\n this._stopTrackingResize();\n this._stopTrackingResize = null;\n }\n\n // Restore saved styles\n this._wrapper.style.position = this._savedStyles.wrapperPosition;\n this._wrapper.style.top = this._savedStyles.wrapperTop;\n this._wrapper.style.left = this._savedStyles.wrapperLeft;\n this._wrapper.style.width = this._savedStyles.wrapperWidth;\n this._wrapper.style.height = this._savedStyles.wrapperHeight;\n this._wrapper.style.zIndex = this._savedStyles.wrapperZIndex;\n this._wrapper.style.background = this._savedStyles.wrapperBackground;\n\n this._canvas.style.width = this._savedStyles.canvasStyleWidth;\n this._canvas.style.height = this._savedStyles.canvasStyleHeight;\n\n // Restore the canvas bitmap resolution to match its pre-maximize\n // intrinsic size. Without this, the canvas keeps the enlarged\n // width/height attributes from the maximize pass and (when style\n // width/height are empty) falls back to those attrs for its CSS\n // size — leaving the diagram rendered full-width.\n this._canvas.width = this._savedStyles.canvasAttrWidth;\n this._canvas.height = this._savedStyles.canvasAttrHeight;\n\n this.resizeAndRedraw();\n this._maximized = false;\n this._savedStyles = null;\n this.updateMaximizeIcon();\n }\n\n private resizeAndRedraw(): void {\n // Sync canvas internal resolution to CSS size\n let w = this._canvas.clientWidth;\n let h = this._canvas.clientHeight;\n if (this._canvas.width !== w || this._canvas.height !== h) {\n this._canvas.width = w;\n this._canvas.height = h;\n }\n this._slate.update();\n }\n\n private updateMaximizeIcon(): void {\n let iconCanvas = (this as any)._maxIconCanvas as HTMLCanvasElement;\n let btn = (this as any)._maxBtn as HTMLButtonElement;\n if (!iconCanvas) return;\n let ctx = iconCanvas.getContext(\"2d\");\n ctx.clearRect(0, 0, BTN_SIZE, BTN_SIZE);\n if (this._maximized) {\n drawMinimizeIcon(ctx, BTN_SIZE);\n btn.title = \"Minimize (m)\";\n } else {\n drawMaximizeIcon(ctx, BTN_SIZE);\n btn.title = \"Maximize (m)\";\n }\n }\n\n private onNewWindow(): void {\n // Find the bundle.js script path from the current page\n let scripts = document.querySelectorAll(\"script[src]\");\n let bundleSrc = \"bundle.js\";\n for (let i = 0; i < scripts.length; i++) {\n let src = (scripts[i] as HTMLScriptElement).src;\n if (src.indexOf(\"bundle.js\") >= 0) {\n bundleSrc = src;\n break;\n }\n }\n\n // Override the config's canvasid so geomlib.init() targets the\n // new window's canvas (id=\"canvasId\"), not the source page's canvas\n // which doesn't exist in the new document. Without the override,\n // init() would look up this._config.canvasid (e.g. \"canvas_0\") in\n // the new document, get null, and throw in resizeCanvasToDisplaySize.\n let newWinConfig = Object.assign({}, this._config, { canvasid: \"canvasId\" });\n let configJSON = JSON.stringify(newWinConfig);\n let title = this._config.title || \"Geometry\";\n\n // Open maximized: use full screen dimensions, canvas fills viewport\n let html = `<!DOCTYPE html>\n<html><head><title>${title}</title></head>\n<body style=\"margin:0;padding:0;overflow:hidden;\">\n<canvas id=\"canvasId\" style=\"width:100vw;height:100vh;\"></canvas>\n<script src=\"${bundleSrc}\"><\\/script>\n<script>geomlib.init(${configJSON});<\\/script>\n</body></html>`;\n\n let newWin = window.open(\"\", \"_blank\");\n if (newWin) {\n newWin.document.write(html);\n newWin.document.close();\n }\n }\n\n // --- Presentation mode (slideshow) ---\n //\n // Opens the slate's slides as a step-through. The canvas itself\n // takes over the viewport via the existing maximize state (no\n // separate fullscreen overlay, no black takeover) — the caption\n // and nav controls float on top of the maximized canvas.\n\n private onPresent(): void {\n if (this._presenting) return;\n if (this._slate.slides.length === 0) return;\n if (!this._maximized) this.maximize();\n this.buildPresentationOverlay();\n this.bindPresentationKeys();\n this._presenting = true;\n this.showSlide(0);\n }\n\n private exitPresent(): void {\n if (!this._presenting) return;\n this.unbindPresentationKeys();\n this.clearStickyRef();\n this.removePresentationOverlay();\n this._slate.clearVisibility();\n for (let e of this._slate.elements) {\n e.shouldHighlight = false;\n e.emphasized = false;\n }\n this._slate.update();\n this._presenting = false;\n }\n\n private buildPresentationOverlay(): void {\n // Floating UI panel pinned to the bottom of the viewport.\n // Uses position: fixed and attaches to documentElement so it\n // can't be clipped by any wrapper, transformed parent, or\n // scrollable container — works the same on iOS Safari,\n // Samsung Internet, Android Chrome, and desktop. Solid white\n // (no transparency) so it's never mistaken for background;\n // bright box-shadow so the boundary reads.\n const overlay = document.createElement(\"div\");\n overlay.className = \"geomlib-presentation-overlay\";\n overlay.style.position = \"fixed\";\n overlay.style.left = \"0\";\n overlay.style.right = \"0\";\n overlay.style.bottom = \"0\";\n overlay.style.margin = \"0 auto\";\n // Span the bottom of the viewport so the centred contents\n // can't render off-screen and there's nowhere for the panel\n // to \"hide\". The actual visible chrome is the inner column.\n overlay.style.maxWidth = \"100vw\";\n overlay.style.background = \"#ffffff\";\n overlay.style.color = \"#222\";\n overlay.style.borderTop = \"1px solid rgba(0,0,0,0.18)\";\n overlay.style.boxShadow = \"0 -6px 18px rgba(0,0,0,0.18)\";\n overlay.style.padding = \"12px 16px calc(12px + env(safe-area-inset-bottom, 0px))\";\n // Max possible z-index so nothing can stack above us.\n overlay.style.zIndex = \"2147483647\";\n overlay.style.fontFamily = \"Georgia, 'Times New Roman', serif\";\n overlay.style.touchAction = \"manipulation\";\n overlay.style.boxSizing = \"border-box\";\n overlay.style.textAlign = \"center\";\n\n const caption = document.createElement(\"div\");\n caption.className = \"geomlib-presentation-caption\";\n caption.style.fontSize = \"1.1rem\";\n caption.style.lineHeight = \"1.45\";\n caption.style.textAlign = \"center\";\n caption.style.marginBottom = \"6px\";\n overlay.appendChild(caption);\n\n const justs = document.createElement(\"div\");\n justs.className = \"geomlib-presentation-justs\";\n justs.style.fontSize = \"0.85rem\";\n justs.style.textAlign = \"center\";\n justs.style.opacity = \"0.85\";\n justs.style.minHeight = \"1em\";\n justs.style.marginBottom = \"10px\";\n overlay.appendChild(justs);\n\n const nav = document.createElement(\"div\");\n nav.className = \"geomlib-presentation-nav\";\n nav.style.display = \"flex\";\n nav.style.gap = \"10px\";\n nav.style.alignItems = \"center\";\n nav.style.justifyContent = \"center\";\n\n const prevBtn = makePresentationButton(\"‹ Prev\");\n const counter = document.createElement(\"span\");\n counter.className = \"geomlib-presentation-counter\";\n counter.style.minWidth = \"56px\";\n counter.style.textAlign = \"center\";\n counter.style.opacity = \"0.7\";\n counter.style.fontSize = \"0.9rem\";\n const nextBtn = makePresentationButton(\"Next ›\");\n const exitBtn = makePresentationButton(\"✕ Exit\");\n exitBtn.style.marginLeft = \"16px\";\n\n prevBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.showSlide(this._presentationIndex - 1);\n });\n nextBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.showSlide(this._presentationIndex + 1);\n });\n exitBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.exitPresent();\n });\n\n nav.appendChild(prevBtn);\n nav.appendChild(counter);\n nav.appendChild(nextBtn);\n nav.appendChild(exitBtn);\n overlay.appendChild(nav);\n\n // Append to documentElement (html) — outside body — so a\n // mobile browser's odd body sizing can't clip us.\n document.documentElement.appendChild(overlay);\n this._presentationOverlay = overlay;\n this._presentationCaption = caption;\n this._presentationJusts = justs;\n this._presentationCounter = counter;\n }\n\n private removePresentationOverlay(): void {\n if (this._presentationOverlay && this._presentationOverlay.parentNode) {\n this._presentationOverlay.parentNode.removeChild(this._presentationOverlay);\n }\n this._presentationOverlay = null;\n this._presentationCaption = null;\n this._presentationJusts = null;\n this._presentationCounter = null;\n }\n\n private bindPresentationKeys(): void {\n const handler = (e: KeyboardEvent) => {\n if (!this._presenting) return;\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n this.showSlide(this._presentationIndex - 1);\n break;\n case \"ArrowRight\":\n case \" \":\n e.preventDefault();\n this.showSlide(this._presentationIndex + 1);\n break;\n case \"Escape\":\n e.preventDefault();\n this.exitPresent();\n break;\n }\n };\n this._presentationOnKey = handler;\n document.addEventListener(\"keydown\", handler);\n }\n\n private unbindPresentationKeys(): void {\n if (this._presentationOnKey) {\n document.removeEventListener(\"keydown\", this._presentationOnKey);\n this._presentationOnKey = null;\n }\n }\n\n private showSlide(index: number): void {\n const slides = this._slate.slides;\n if (slides.length === 0) return;\n const clamped = Math.max(0, Math.min(slides.length - 1, index));\n this._presentationIndex = clamped;\n\n const state = computeSlideState(this._slate, slides, clamped);\n // Drop any sticky pin from the previous slide — its span\n // belongs to the prior caption and is about to be replaced\n // anyway.\n this.clearStickyRef();\n\n const slide = slides[clamped];\n const transition = slide.transition;\n const animations = transition && transition.animations;\n const mode: \"cascade\" | \"parallel\" =\n (transition && transition.mode === \"parallel\") ? \"parallel\" : \"cascade\";\n // Clear per-element emphasis on every transition so a previous\n // slide's hover state doesn't carry forward.\n for (let e of this._slate.elements) e.emphasized = false;\n\n if (animations && animations.length > 0) {\n // Animated transition — slate.animateTo flips visibility +\n // highlight per-element and runs the configured Animation\n // for each entry. Newly-visible elements without an entry\n // pop in instantly (handled inside animateTo).\n this._slate.animateTo(state.visible, state.highlighted, animations, mode);\n } else {\n // Instant transition (4b behaviour) — flip every element\n // synchronously, no rAF loop.\n for (let e of this._slate.elements) {\n if (e.name == null) continue;\n e.visible = state.visible.has(e.name);\n e.shouldHighlight = state.highlighted.has(e.name);\n e.drawProgress = 1;\n }\n this._slate.update();\n }\n\n if (this._presentationCaption) {\n this.renderCaptionText(this._presentationCaption, slide.text || \"\");\n }\n if (this._presentationCounter) {\n this._presentationCounter.textContent = (clamped + 1) + \" / \" + slides.length;\n }\n if (this._presentationJusts) {\n this._presentationJusts.innerHTML = \"\";\n const resolve = this._slate.resolveJustification;\n if (slide.justifications) {\n for (let i = 0; i < slide.justifications.length; i++) {\n if (i > 0) {\n const sep = document.createElement(\"span\");\n sep.textContent = \" · \";\n sep.style.opacity = \"0.5\";\n this._presentationJusts.appendChild(sep);\n }\n const ref = slide.justifications[i].ref;\n const url = resolve ? resolve(ref) : null;\n if (url) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.textContent = ref;\n a.target = \"_blank\";\n a.rel = \"noopener\";\n a.style.color = \"#0066cc\";\n this._presentationJusts.appendChild(a);\n } else {\n const span = document.createElement(\"span\");\n span.textContent = ref;\n this._presentationJusts.appendChild(span);\n }\n }\n }\n }\n }\n\n // Parse {NAME} tokens in caption text and emit interactive bold-\n // italic spans for any that resolve to a slate element (alias\n // lookups included). Unknown / unresolved refs render as plain\n // text with the braces stripped. Hover / pointerdown toggles\n // element.emphasized so the figure picks the ref up with an\n // extra-thick gold stroke.\n private renderCaptionText(host: HTMLElement, text: string): void {\n host.innerHTML = \"\";\n const re = /\\{([A-Za-z][A-Za-z0-9'\\-]*)\\}/g;\n let lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n if (m.index > lastIndex) {\n host.appendChild(document.createTextNode(text.slice(lastIndex, m.index)));\n }\n const name = m[1];\n const elem = this._slate.lookupElement(name);\n if (elem) {\n host.appendChild(this.buildCaptionRef(name, elem));\n } else {\n // Unknown — render plain so a typo doesn't surface as\n // raw \"{XYZ}\" to the reader.\n host.appendChild(document.createTextNode(name));\n }\n lastIndex = m.index + m[0].length;\n }\n if (lastIndex < text.length) {\n host.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n }\n\n private buildCaptionRef(label: string, elem: import(\"./elements/GeomElement\").GeomElement): HTMLSpanElement {\n const span = document.createElement(\"span\");\n span.className = \"geomlib-presentation-ref\";\n span.textContent = label;\n span.style.fontWeight = \"700\";\n span.style.fontStyle = \"italic\";\n span.style.cursor = \"pointer\";\n span.style.borderBottom = \"1px dotted currentColor\";\n span.addEventListener(\"mouseenter\", () => {\n // Hover does nothing while a sticky pin is active — the\n // pinned element should remain the sole highlighted ref.\n if (this._stickyRefSpan != null) return;\n elem.emphasized = true;\n this._slate.update();\n });\n span.addEventListener(\"mouseleave\", () => {\n if (this._stickyRefSpan != null) return;\n elem.emphasized = false;\n this._slate.update();\n });\n span.addEventListener(\"pointerdown\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n const wasThis = this._stickyRefSpan === span;\n this.clearStickyRef();\n if (!wasThis) this.setStickyRef(span, elem);\n this._slate.update();\n });\n return span;\n }\n\n // Drop the active sticky pin (if any): release the pinned\n // element's emphasis flag and reset the span's visual state.\n private clearStickyRef(): void {\n if (this._stickyRefSpan != null) {\n this._stickyRefSpan.classList.remove(\"active\");\n this._stickyRefSpan.style.color = \"\";\n }\n if (this._stickyRefElem != null) {\n this._stickyRefElem.emphasized = false;\n }\n this._stickyRefSpan = null;\n this._stickyRefElem = null;\n }\n\n // Pin a new sticky ref. Call clearStickyRef() first if another\n // ref is currently pinned.\n private setStickyRef(span: HTMLSpanElement, elem: import(\"./elements/GeomElement\").GeomElement): void {\n span.classList.add(\"active\");\n span.style.color = \"#b08800\";\n elem.emphasized = true;\n this._stickyRefSpan = span;\n this._stickyRefElem = elem;\n }\n}\n\n// Button styling shared by the four nav buttons in the presentation\n// overlay. Matches the soft, light visual of the surrounding panel.\nfunction makePresentationButton(label: string): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.textContent = label;\n b.style.background = \"rgba(0,0,0,0.08)\";\n b.style.color = \"#222\";\n b.style.border = \"1px solid rgba(0,0,0,0.15)\";\n b.style.borderRadius = \"4px\";\n // Min 44px tap target per Apple HIG / Material guidance; the\n // wider padding also gives Pro Max thumbs some breathing room.\n b.style.padding = \"10px 16px\";\n b.style.minHeight = \"44px\";\n b.style.cursor = \"pointer\";\n b.style.fontFamily = \"inherit\";\n b.style.fontSize = \"1rem\";\n b.style.touchAction = \"manipulation\";\n b.addEventListener(\"mouseenter\", () => { b.style.background = \"rgba(0,0,0,0.16)\"; });\n b.addEventListener(\"mouseleave\", () => { b.style.background = \"rgba(0,0,0,0.08)\"; });\n return b;\n}\n\n// --- Icon drawing functions ---\n// All draw on a size×size canvas with 3px padding\n\nfunction drawResetIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let cx = size / 2;\n let cy = size / 2;\n let r = size * 0.32;\n let pad = 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Circular arc (270 degrees)\n ctx.beginPath();\n ctx.arc(cx, cy, r, -Math.PI * 0.5, Math.PI * 0.75);\n ctx.stroke();\n\n // Arrowhead at the end of the arc\n let endAngle = Math.PI * 0.75;\n let ax = cx + r * Math.cos(endAngle);\n let ay = cy + r * Math.sin(endAngle);\n let headLen = 4;\n let a1 = endAngle + Math.PI * 0.3;\n let a2 = endAngle + Math.PI * 0.9;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(ax + headLen * Math.cos(a1), ay + headLen * Math.sin(a1));\n ctx.lineTo(ax + headLen * Math.cos(a2), ay + headLen * Math.sin(a2));\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawMaximizeIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Top-right outward arrow\n let ax = pad + s * 0.55;\n let ay = pad + s * 0.45;\n let bx = pad + s;\n let by = pad;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n // Arrowhead\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx - 5, by);\n ctx.lineTo(bx, by + 5);\n ctx.closePath();\n ctx.fill();\n\n // Bottom-left outward arrow\n ax = pad + s * 0.45;\n ay = pad + s * 0.55;\n bx = pad;\n by = pad + s;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx + 5, by);\n ctx.lineTo(bx, by - 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawMinimizeIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Top-right inward arrow\n let ax = pad + s;\n let ay = pad;\n let bx = pad + s * 0.55;\n let by = pad + s * 0.45;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx + 5, by);\n ctx.lineTo(bx, by - 5);\n ctx.closePath();\n ctx.fill();\n\n // Bottom-left inward arrow\n ax = pad;\n ay = pad + s;\n bx = pad + s * 0.45;\n by = pad + s * 0.55;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(bx - 5, by);\n ctx.lineTo(bx, by + 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawNewWindowIcon(ctx: CanvasRenderingContext2D, size: number): void {\n let pad = 4;\n let s = size - pad * 2;\n\n ctx.strokeStyle = \"rgba(0,0,0,0.7)\";\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.lineWidth = 1.5;\n\n // Small rectangle (the window)\n let rx = pad;\n let ry = pad + s * 0.3;\n let rw = s * 0.65;\n let rh = s * 0.7;\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Arrow pointing up-right out of the rectangle\n let arrowStartX = pad + s * 0.4;\n let arrowStartY = pad + s * 0.6;\n let arrowEndX = pad + s;\n let arrowEndY = pad;\n ctx.beginPath();\n ctx.moveTo(arrowStartX, arrowStartY);\n ctx.lineTo(arrowEndX, arrowEndY);\n ctx.stroke();\n\n // Arrowhead\n ctx.beginPath();\n ctx.moveTo(arrowEndX, arrowEndY);\n ctx.lineTo(arrowEndX - 5, arrowEndY);\n ctx.lineTo(arrowEndX, arrowEndY + 5);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawPresentIcon(ctx: CanvasRenderingContext2D, size: number): void {\n // Right-pointing play triangle, centred. The button is square so a\n // little leftward bias visually centres the optical mass.\n let pad = size * 0.28;\n let leftX = pad - 1;\n let rightX = size - pad + 2;\n let topY = pad;\n let bottomY = size - pad;\n ctx.fillStyle = \"rgba(0,0,0,0.7)\";\n ctx.beginPath();\n ctx.moveTo(leftX, topY);\n ctx.lineTo(leftX, bottomY);\n ctx.lineTo(rightX, size / 2);\n ctx.closePath();\n ctx.fill();\n}\n","// Animation registry — parallel to Constructions but distinct purpose.\n//\n// A Construction builds an element once at init() time. An Animation\n// describes how to *reveal* that element when a slide transitions:\n// lines trace from one endpoint to the other, circles sweep an arc,\n// polygons trace edges in order then fade in the face. Multiple\n// animations can target the same element type — e.g. a Line might\n// be revealed via the shorthand A.Line.straightEdgeConnect (pencil\n// stroke A → B) or the long-form A.Line.compassTransfer (compass\n// walks a radius from another line then drops the straightedge).\n// Authors pick the right one per slide.\n//\n// Names follow the same `Type.method` shape as Constructions\n// (E.Line.connect ↔ A.Line.straightEdgeConnect). The enum value is\n// what authors pass; the human-readable name string is used for the\n// string-form fallback (param strings) + console.warn diagnostics.\n\nimport {GeomElement} from \"./GeomElement\";\nimport {Slate} from \"../Slate\";\n\n// Typed enum, parallel to AllConstructions. Numeric backing — typo-\n// safe at compile time and cheap to compare at runtime.\nexport enum AllAnimations {\n INSTANT,\n POINT_APPEAR,\n POINT_INTERSECT, // future\n LINE_STRAIGHT_EDGE_CONNECT,\n LINE_STRAIGHT_EDGE_EXTEND,\n LINE_COMPASS_TRANSFER, // future\n CIRCLE_COMPASS,\n CIRCLE_COMPASS_EXPLICIT, // future\n POLYGON_OUTLINE,\n POLYGON_OUTLINE_AND_FILL,\n POLYGON_SUPERPOSE,\n SECTOR_SWEEP,\n}\n\n// Typed constants object, mirroring E for constructions. Authors\n// write `A.Circle.compass` instead of remembering the raw enum.\nexport const A = {\n Point: {\n appear: AllAnimations.POINT_APPEAR,\n intersect: AllAnimations.POINT_INTERSECT, // future\n },\n Line: {\n straightEdgeConnect: AllAnimations.LINE_STRAIGHT_EDGE_CONNECT,\n straightEdgeExtend: AllAnimations.LINE_STRAIGHT_EDGE_EXTEND,\n compassTransfer: AllAnimations.LINE_COMPASS_TRANSFER, // future\n },\n Circle: {\n compass: AllAnimations.CIRCLE_COMPASS,\n compassExplicit: AllAnimations.CIRCLE_COMPASS_EXPLICIT, // future\n },\n Polygon: {\n outline: AllAnimations.POLYGON_OUTLINE,\n outlineAndFill: AllAnimations.POLYGON_OUTLINE_AND_FILL,\n superpose: AllAnimations.POLYGON_SUPERPOSE,\n },\n Sector: {\n sweep: AllAnimations.SECTOR_SWEEP,\n },\n instant: AllAnimations.INSTANT,\n};\n\n// One frame-driven step of an animation. An Animation.build() returns\n// an array of these; the SlateAnimator drives each step's progress\n// from 0 → 1 over its durationMs, then calls finalise().\nexport interface IAnimationStep {\n durationMs: number;\n\n // Setup hook fires once before the first tick. Used to hide the\n // target element (so visual proxies can render over its final\n // position without overlap) and to register ephemeral helper\n // elements via slate.addEphemeral.\n setup?: () => void;\n\n // Called each frame with progress ∈ [0, 1]. Typically sets\n // target.drawProgress = progress; richer animations may also tick\n // ephemeral helpers.\n tick: (progress: number, dtMs: number, totalMs: number) => void;\n\n // Called on cancel, skip, or normal completion. Animations MUST:\n // 1. Remove every ephemeral helper they added.\n // 2. Restore the target element to its final visible state\n // (target.visible = true, drawProgress = 1).\n finalise: () => void;\n}\n\n// Abstract base class for all animations. Concrete subclasses live in\n// the per-element-type sibling files (PointAnimations.ts,\n// LineAnimations.ts, CircleAnimations.ts, PolygonAnimations.ts).\nexport abstract class Animation {\n // Enum value the animation registers under. Mirrors Construction's\n // `constructionMethod: AllConstructions` field shape.\n public abstract animationMethod: AllAnimations;\n\n // Human-readable name in the same `Type.method` shape Construction\n // uses (\"Line.straightEdgeConnect\", \"Circle.compass\", …).\n public abstract name: string;\n\n // Element class the animation can animate. animateTo validates\n // the target before calling build(); a mismatch emits a\n // console.warn and falls through to Instant.\n public abstract elementType: Function;\n\n // Per-animation default duration AND rate. Whichever the slate's\n // animationConfig overrides wins. Null on both means build()\n // computes its own duration from geometry × default rate.\n public defaultDurationMs?: number;\n public defaultRate?: number;\n\n public abstract build(target: GeomElement, slate: Slate, args: any): IAnimationStep[];\n}\n\n// InstantAnimation — the registry's fallback. Used explicitly via\n// A.instant on a slide entry to suppress an inherited animation, or\n// implicitly when an unknown name lookup fails. Just finalises the\n// target to its full-rendered state.\nexport class InstantAnimation extends Animation {\n public animationMethod = AllAnimations.INSTANT;\n public name = \"instant\";\n public elementType = GeomElement;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [{\n durationMs: 0,\n tick: () => {},\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n }];\n }\n}\n\n// Module-level registry. Subclass files call registerAnimation(new X())\n// at import time so the registry is populated by the time any consumer\n// looks anything up.\nconst animationsByEnum: Map<AllAnimations, Animation> = new Map();\nconst animationsByName: Map<string, Animation> = new Map();\nconst warnedUnknown: Set<string> = new Set();\n\nexport function registerAnimation(a: Animation): void {\n animationsByEnum.set(a.animationMethod, a);\n animationsByName.set(a.name, a);\n}\n\n// Accepts either the enum value or the string name; returns the\n// registered Animation or null when the name doesn't resolve. An\n// unknown name emits a console.warn once per name across the slate's\n// lifetime so consumers see typos surfaced without log spam.\nexport function findAnimation(ref: AllAnimations | string): Animation | null {\n let a: Animation | undefined;\n if (typeof ref === \"string\") {\n a = animationsByName.get(ref);\n } else {\n a = animationsByEnum.get(ref);\n }\n if (a == null) {\n const key = String(ref);\n if (!warnedUnknown.has(key)) {\n warnedUnknown.add(key);\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[geomlib] unknown animation '\" + key + \"' — falling back to instant\");\n }\n }\n return null;\n }\n return a ?? null;\n}\n\n// Register the always-present Instant. Concrete animations in\n// PointAnimations.ts / LineAnimations.ts / … register themselves the\n// same way when their modules are imported.\nregisterAnimation(new InstantAnimation());\n","/*----------------------------------------------------------------------+\n| Title:\tConstructions.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {GeomElement} from \"./GeomElement\";\nimport {PlaneElement} from \"./plane/PlaneElement\";\nimport {PointElement} from \"./point/PointElement\";\n\nexport enum ConstructionTypes {\n Integer,\n PointElement,\n CircleElement,\n PlaneElement,\n SphereElement,\n PolygonElement,\n PolyhedronElement\n}\n\nexport enum PointConstructions {\n free = 1,\n midpoint = 2,\n intersection = 3,\n first = 4,\n last = 5,\n center = 6,\n lineSlider = 7,\n circleSlider = 8,\n circumcenter = 9,\n vertex = 10,\n foot = 11,\n cutoff = 12,\n extend = 13,\n parallelogram = 14,\n similar = 15,\n perpendicular = 16,\n proportion = 17,\n invert = 18,\n meanProportional = 19,\n planeSlider = 20,\n sphereSlider = 21,\n angleBisector = 22,\n angleDivider = 23,\n fixed = 24,\n lineSegmentSlider = 25,\n harmonic = 26\n}\n\nexport enum LineConstructions {\n connect = 101,\n angleBisector = 102,\n angleDivider = 103,\n foot = 104,\n chord = 105,\n bichord = 106,\n perpendicular = 107,\n cutoff = 108,\n extend = 109,\n parallel = 110,\n similar = 111,\n proportion = 112,\n meanProportional = 113\n}\n\n\nexport enum CircleConstructions {\n radius = 201,\n circumcircle = 202,\n invert = 203,\n intersection = 204\n}\n\n\nexport enum PolygonConstructions {\n square = 301,\n triangle = 302,\n quadrilateral = 303,\n pentagon = 304,\n hexagon = 305,\n equilateralTriangle = 306,\n parallelogram = 307,\n regularPolygon = 308,\n starPolygon = 309,\n similar = 310,\n application = 311,\n octagon = 312,\n face = 313\n}\n\nexport enum SectorConstructions {\n sector = 401,\n arc = 402\n}\n\nexport enum PlaneConstructions {\n threePoints = 501,\n perpendicular = 502,\n parallel = 503,\n ambient = 504\n}\n\nexport enum SphereConstructions {\n radius = 601\n}\n\nexport enum PolyhedraConstructions {\n tetrahedron = 701,\n parallelepiped = 702,\n prism = 703,\n pyramid = 704\n}\n\nexport function getConstructionName(cm: AllConstructions) : String {\n if(cm < 100) {\n return \"Point.\" + PointConstructions[cm];\n } else if (100 < cm && cm < 200) {\n return \"Line.\" + LineConstructions[cm];\n } else if (300 < cm && cm < 400) {\n return \"Polygon.\" + PolygonConstructions[cm];\n } else if (400 < cm && cm < 500) {\n return \"Sector.\" + SectorConstructions[cm];\n } else if (500 < cm && cm < 600) {\n return \"Plane.\" + PlaneConstructions[cm];\n } else if (600 < cm && cm < 700) {\n return \"Sphere.\" + SphereConstructions[cm];\n } else if (700 < cm && cm < 800) {\n return \"Polyhedra.\" + PolyhedraConstructions[cm];\n }\n\n return \"<Not Valid Construction>\";\n}\n\nexport var E = {\n Point : PointConstructions,\n Line : LineConstructions,\n Circle: CircleConstructions,\n Polygon: PolygonConstructions,\n Sector: SectorConstructions,\n Plane: PlaneConstructions,\n Sphere: SphereConstructions,\n Polyhedra: PolyhedraConstructions\n};\n\nexport type AllConstructions =\n PointConstructions |\n LineConstructions |\n CircleConstructions |\n PlaneConstructions |\n PolygonConstructions |\n SectorConstructions |\n SphereConstructions |\n PolyhedraConstructions;\n\nexport type GeomElementsForUpdate = GeomElement[];\n\n// Type-sorted parameter arrays, matching Java's P[]/E[]/N[] dispatch.\n// P = PointElements (including LineElement endpoint expansions)\n// E = all other elements (Circle, Plane, Sphere, Polygon, Polyhedron)\n// N = integers (numbers)\nexport interface SortedParams {\n P: PointElement[];\n E: GeomElement[];\n N: number[];\n}\n\nexport interface ConstructionSignature {\n points: number;\n elements: number;\n integers: number;\n elementTypes?: Function[];\n}\n\nexport abstract class Construction {\n public abstract constructionMethod : AllConstructions;\n // Signature: type counts + element subtype list for E[] entries.\n // e.g. { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] }\n public abstract signature: ConstructionSignature;\n\n public abstract construct(screen: PlaneElement, P: PointElement[],\n E: GeomElement[], N: number[]) : [GeomElementsForUpdate, GeomElement];\n\n // Match by counting types (matching Java's selectDataChoice).\n // Position-independent: \"E,Vplane,D,B\" and \"E,D,B,Vplane\" both match\n // { points: 3, elements: 1, elementTypes: [PlaneElement] }.\n public validateSignature(cm: AllConstructions, sp: SortedParams) : boolean {\n if (cm != this.constructionMethod) return false;\n let sig = this.signature;\n if (sig.points !== sp.P.length) return false;\n if (sig.elements !== sp.E.length) return false;\n if (sig.integers !== sp.N.length) return false;\n // Check element subtypes if specified\n if (sig.elementTypes) {\n for (let i = 0; i < sig.elementTypes.length; i++) {\n if (!(sp.E[i] instanceof sig.elementTypes[i])) return false;\n }\n }\n return true;\n }\n}\n\n/***********************************************************************\n * Construction classes — organized by element type. *\n * Each type's constructions live in their own package file and export *\n * a pre-built Construction[] array. *\n * *\n * Point — point/PointConstructions.ts *\n * (also contains CircumcircleConstruction) *\n * Line — line/LineConstructions.ts *\n * Circle — circle/CircleConstructions.ts *\n * Polygon — polygon/PolygonConstructions.ts *\n * Sector — sector/SectorConstructions.ts *\n * Plane — plane/PlaneConstructions.ts *\n * Sphere — sphere/SphereConstructions.ts *\n * Polyhedron — polyhedron/PolyhedronConstructions.ts *\n ***********************************************************************/\n\nimport {pointConstructions} from \"./point/PointConstructions\";\nimport {lineConstructions} from \"./line/LineConstructions\";\nimport {circleConstructions} from \"./circle/CircleConstructions\";\nimport {polygonConstructions} from \"./polygon/PolygonConstructions\";\nimport {sectorConstructions} from \"./sector/SectorConstructions\";\nimport {planeConstructions} from \"./plane/PlaneConstructions\";\nimport {sphereConstructions} from \"./sphere/SphereConstructions\";\nimport {polyhedronConstructions} from \"./polyhedron/PolyhedronConstructions\";\n\n\nexport const constructions: Construction[] = [\n ...pointConstructions,\n ...lineConstructions,\n ...circleConstructions,\n ...sectorConstructions,\n ...polygonConstructions,\n ...planeConstructions,\n ...sphereConstructions,\n ...polyhedronConstructions,\n];\n","/*----------------------------------------------------------------------+\n| Title:\tGeomElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./point/PointElement\"\nimport {SlateCanvas} from \"../Slate\";\n\nexport enum Align {\n CENTRAL,\n LEFT,\n RIGHT,\n ABOVE,\n BELOW\n}\n\nexport abstract class GeomElement {\n\n constructor() {\n }\n\n protected _name: string;\n // True for elements that are references to existing elements (e.g.,\n // point;first returns P[0], point;vertex returns polygon.V[n-1]).\n // Preexisting elements are skipped during rotate/translate to avoid\n // double-movement. Matches Java's preexists[] array in Slate.java.\n public preexists: boolean = false;\n // All colors default to null (transparent) — matching Java's Element.java.\n // Named elements get their colors assigned by init() in index.ts, which\n // computes type-appropriate defaults. Internal/intermediate elements\n // created inside constructions stay null (invisible) unless explicitly set.\n private _nameColor: string = null;\n protected _vertexColor : string = null;\n private _edgeColor : string = null;\n private _faceColor : string = null;\n\n // Highlight defaults pick high-contrast values that read on the typical\n // cream / white backgrounds the library is used against. The previous\n // edge/vertex default of white was invisible on the Elements site's\n // theorem-box background (HSB 35,19,100 ≈ #FFE9CD). Web \"gold\"\n // (#FFD700) is brighter / more saturated than Material amber and\n // still reads against both cream and white.\n private _nameHighlightColor : string = '#FFD700';\n private _vertexHighlightColor : string = '#FFD700';\n private _edgeHighlightColor : string = '#FFD700';\n private _faceHighlightColor : string = '#FFD700';\n\n // Default matches Java: Font(\"TimesRoman\", Font.ITALIC, 18)\n protected static _font : string = \"italic 18px Times New Roman\";\n\n static setFont(fontName: string, fontSize: number): void {\n GeomElement._font = `italic ${fontSize}px ${fontName}`;\n }\n\n private _draggable : boolean;\n private _dimension : number;\n private _align : Align;\n\n private _shouldHighlight : boolean = false;\n // Per-element visibility flag honoured by every draw method. Default\n // true preserves existing consumer behaviour; flipping false makes\n // drawFace / drawEdge / drawVertex / drawName early-return so the\n // element disappears without being removed from _elements (so\n // dependents that read its coordinates still work). Used by\n // Slate.setVisibleNames + the slideshow Presentation overlay.\n private _visible : boolean = true;\n // One step above shouldHighlight: when the slideshow caption's\n // {NAME} ref is hovered or clicked, the matching element flips to\n // emphasized. drawEdge / drawVertex paint with the highlight colour\n // at an even thicker stroke / larger dot so the element pops out\n // from any other already-highlighted ones on the slide. Released on\n // mouseleave (or click-to-toggle for sticky).\n // Emphasis amount in [0, 1]. Boolean emphasized is a thin shim\n // that toggles between 0 and 1; the SlateAnimator fades the\n // amount smoothly from 1 → 0 after an animation finishes so the\n // visible \"shrink back to highlight thickness\" feels less jarring\n // when the underlying element is also slide-highlighted (e.g.\n // ABC polygon edges over the highlighted AB / AC / BC).\n private _emphasisAmount : number = 0;\n // Animation progress for the next slide-transition render. 1 means\n // \"fully drawn\" (the default and the existing behaviour). Values in\n // [0, 1) tell per-type draw methods to render a partial geometry —\n // a half-traced line, a 30° sweep of an arc, the first edge of a\n // polygon plus a fraction of the next. Driven by Animation\n // subclasses through SlateAnimator during slide transitions; flips\n // back to 1 on each animation's finalise() so the canvas returns\n // to the fully-rendered state when the transition completes or is\n // cancelled.\n private _drawProgress : number = 1;\n protected _pixelTolerance : number = 50;\n\n protected _getTextMetrics(ctx: CanvasRenderingContext2D, txt: string) : [number, number] {\n let textMetrics = ctx.measureText(txt);\n let w = textMetrics.width;\n // Use actual font metrics for height; fall back to ascent-based estimate\n let h = (textMetrics.actualBoundingBoxAscent != null)\n ? textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent\n : 16;\n return [w, h];\n }\n\n drawString(ix : number, iy : number, c: SlateCanvas, overrideAlign? : Align) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n if(this._nameColor == null) return;\n ctx.font = GeomElement._font;\n ctx.fillStyle = this._nameColor;\n let [w, h] = this._getTextMetrics(ctx, this._name);\n\n switch (overrideAlign || this._align) {\n case Align.LEFT:\n ix = ix - w - 6;\n iy = iy + h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.RIGHT:\n ix += 2;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.ABOVE:\n ix -= w/2;\n iy += -h/2 + 4;\n ctx.fillText(this._name, ix, iy);\n return;\n case Align.BELOW:\n ix -= w/2;\n iy += h/2 + 6;\n ctx.fillText(this._name, ix, iy);\n return;\n }\n // compute (dx,dy) coordinates relative to center of canvas\n // and normalized\n let cw = c.width;\n let ch = c.height;\n let dx = (ix - cw/2) * ch;\n let dy = (iy - ch/2) * cw;\n if (dy > dx) {\n if (dy >= -dx)\t// put name below\n {\n ix -= w/2;\n iy += h/2 + 6;\n ctx.fillText(this._name, ix, iy);\n }\n else \t\t// put name left\n {\n ix = ix - w - 6;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n }\n }\n else {\n if (dy >= -dx) {\t// put name right\n ix += 2;\n iy += h/2 - 4;\n ctx.fillText(this._name, ix, iy);\n } else { \t\t// put name above\n ix -= w/2;\n iy += -h/2 + 4;\n ctx.fillText(this._name, ix, iy);\n }\n }\n }\n\n public get name() {\n return this._name;\n }\n\n public set name(n : string) {\n this._name = n;\n }\n\n public abstract update() : void;\n public reset() { this.update(); }\n public defined() : boolean { return false; }\n public drag(tox: number, toy: number) : boolean { return false; }\n // drag returns true when the element is actually dragged\n public abstract translate(dx: number, dy: number) : void;\n public abstract rotate(pivot : PointElement, ac : number, as: number) : void;\n public abstract drawName(c: SlateCanvas) : void;\n public abstract drawFace(c: SlateCanvas) : void;\n public abstract drawEdge(c: SlateCanvas) : void;\n public abstract drawVertex(c: SlateCanvas) : void;\n\n set nameColor(value: string) {\n this._nameColor = value;\n }\n\n set edgeColor(value: string) {\n this._edgeColor = value;\n }\n\n set faceColor(value: string) {\n this._faceColor = value;\n }\n\n set nameHighlightColor(value: string) {\n this._nameHighlightColor = value;\n }\n\n set vertexHighlightColor(value: string) {\n this._vertexHighlightColor = value;\n }\n\n set edgeHighlightColor(value: string) {\n this._edgeHighlightColor = value;\n }\n\n set faceHighlightColor(value: string) {\n this._faceHighlightColor = value;\n }\n\n set draggable(value: boolean) {\n this._draggable = value;\n }\n\n set dimension(value: number) {\n this._dimension = value;\n }\n\n set align(value: Align) {\n this._align = value;\n }\n\n set shouldHighlight(value: boolean) {\n this._shouldHighlight = value;\n }\n\n set visible(value: boolean) {\n this._visible = value;\n }\n\n set emphasized(value: boolean) {\n this._emphasisAmount = value ? 1 : 0;\n }\n\n set emphasisAmount(value: number) {\n this._emphasisAmount = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n\n set drawProgress(value: number) {\n // Clamp to [0, 1] — out-of-range values would push the partial\n // geometry past either endpoint, which is never what callers\n // mean. Animations tick this in [0, 1] and finalise to 1.\n this._drawProgress = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n\n get nameColor(): string {\n return this._nameColor;\n }\n\n get vertexColor(): string {\n return this._vertexColor;\n }\n\n set vertexColor(c : string) {\n this._vertexColor = c;\n }\n\n get edgeColor(): string {\n return this._edgeColor;\n }\n\n get faceColor(): string {\n return this._faceColor;\n }\n\n get nameHighlightColor(): string {\n return this._nameHighlightColor;\n }\n\n get vertexHighlightColor(): string {\n return this._vertexHighlightColor;\n }\n\n get edgeHighlightColor(): string {\n return this._edgeHighlightColor;\n }\n\n get faceHighlightColor(): string {\n return this._faceHighlightColor;\n }\n\n get draggable(): boolean {\n return this._draggable;\n }\n\n get dimension(): number {\n return this._dimension;\n }\n\n get align(): Align {\n return this._align;\n }\n\n get shouldHighlight(): boolean {\n return this._shouldHighlight;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n get emphasized(): boolean {\n return this._emphasisAmount > 0;\n }\n\n get emphasisAmount(): number {\n return this._emphasisAmount;\n }\n\n get drawProgress(): number {\n return this._drawProgress;\n }\n}\n","// Animations targeting CircleElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {CircleElement} from \"./CircleElement\";\n\n// Default sweep rate in radians/ms. Calibrated for unhurried teaching:\n// a full circle (2π) draws in ≈ 2 seconds at 0.003 rad/ms. Authors who\n// want a faster compass raise the rate via\n// slate.animationConfig.rates[\"Circle.compass\"].\nconst DEFAULT_ARC_RATE_RAD_PER_MS = 0.003;\n\n// A.Circle.compass — anchor at centre, pick up the pencil at the\n// radius-defining point B, sweep 2π back to the start. Args:\n// { startAngle?: number } — default is computed from the angle from\n// centre to B so the trace begins where a real compass would.\n//\n// Strict two-step sequence (mirrors A.Polygon.outlineAndFill):\n// 1. Edge sweep: drawProgress 0 → 1 over 2π / rate.\n// 2. Face fade-in: faceAlpha 0 → 1 over ~half the sweep duration.\n// The edge stays fully drawn through step 2 because drawProgress\n// finalises to 1 before the fade-in starts, and faceAlpha is the\n// independent driver for drawFace's globalAlpha.\nconst DEFAULT_CIRCLE_FILL_MS = 600;\nexport class CircleCompassAnimation extends Animation {\n public animationMethod = AllAnimations.CIRCLE_COMPASS;\n public name = \"Circle.compass\";\n public elementType = CircleElement;\n public defaultRate = DEFAULT_ARC_RATE_RAD_PER_MS;\n public defaultDurationMs = DEFAULT_CIRCLE_FILL_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const circle = target as CircleElement;\n const explicitStart = (args && typeof args.startAngle === \"number\")\n ? args.startAngle\n : Math.atan2(circle.B.y - circle.Center.y, circle.B.x - circle.Center.x);\n const sweepMs = (2 * Math.PI) / this.defaultRate;\n const fullRestore = () => {\n circle.faceAlpha = 1;\n circle.drawProgress = 1;\n circle.drawStartAngle = 0;\n circle.visible = true;\n };\n // Step 1 — edge sweep with the face hidden.\n const sweep: IAnimationStep = {\n durationMs: sweepMs,\n setup: () => {\n circle.drawStartAngle = explicitStart;\n circle.faceAlpha = 0;\n circle.drawProgress = 0;\n },\n tick: (progress) => { circle.drawProgress = progress; },\n finalise: () => { circle.drawProgress = 1; },\n };\n // A face-less circle has nothing to fade — scheduling the\n // fill step anyway would be pure dead time in the middle of\n // a cascade (#81). Run the sweep alone, with its finalise\n // doing the full restore.\n if (circle.faceColor == null) {\n sweep.finalise = fullRestore;\n return [sweep];\n }\n // Fill ~twice as fast as the sweep, capped by the class-level\n // default so a tiny circle doesn't yield a blink-of-an-eye fade.\n const fillMs = Math.min(sweepMs / 2, this.defaultDurationMs);\n return [\n sweep,\n // Step 2 — face fade-in over the now-complete arc.\n {\n durationMs: fillMs,\n tick: (progress) => { circle.faceAlpha = progress; },\n finalise: fullRestore,\n },\n ];\n }\n}\n\nregisterAnimation(new CircleCompassAnimation());\n","/*----------------------------------------------------------------------+\n| Circle construction classes — extracted from Constructions.ts |\n| Note: CircumcircleConstruction lives in point/PointConstructions.ts |\n| because CircumcenterConstruction extends it directly. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n CircleConstructions as CircleConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"./CircleElement\";\nimport {InvertCircleElement} from \"./InvertCircleElement\";\nimport {SphereIntersectionElement} from \"./SphereIntersectionElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\n\n/************************\n * Element Class Circle *\n ************************/\n\n// circle\n// radius — points A, B [, plane C = screen]\n// the circle with center A and radius AB in the plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java circle case 0 — new CircleElement(A,B,plane))\nexport class CircleRadiusCenterConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.radius;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircleElement({C:P[0], B:P[1], AP:plane});\n return [[g], g];\n }\n}\n\n// circle — radius (3-point) — points A, B, C [, plane D = screen]\n// the circle with center A and radius |BC| in the plane D\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// MUST be registered BEFORE the 2-point variant in the constructions array\n// (signature variant ordering rule: longer signature first)\n// (Java: Slate.java circle case 0 — new CircleElement(A,B,C,plane))\nexport class CircleRadius3PointConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.radius;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircleElement({C: P[0], A: P[1], B: P[2], AP: plane});\n return [[g], g];\n }\n}\n\n\n// circle\n// invert\n// circles A, B\n// the image of circle A inverted in circle B\n// (Java: InvertCircle.java — TS: InvertCircleElement.ts)\nexport class InvertCircleConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.invert;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [CircleElement, CircleElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new InvertCircleElement(E[0] as CircleElement, E[1] as CircleElement);\n return [[g], g];\n }\n}\n\n// circle\n// intersection\n// spheres A, B\n// the circle at the intersection of spheres A and B\n// (Java: IntersectionSS.java — TS: SphereIntersectionElement.ts)\nexport class SphereIntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructionsEnum.intersection;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [SphereElement, SphereElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new SphereIntersectionElement(E[0] as SphereElement, E[1] as SphereElement);\n return [[g], g];\n }\n}\n\nexport const circleConstructions: Construction[] = [\n new CircleRadius3PointConstruction(),\n new CircleRadiusCenterConstruction(),\n new InvertCircleConstruction(),\n new SphereIntersectionConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tCircleElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\n\nexport interface ICircleElementConstruction {\n C : PointElement; // center of the circle\n B : PointElement; // point defining one end of the radius segment\n A? : PointElement; // point defining the other end of the radius segment\n // (defaults to C — so radius = C.distance(B) in the 2-point form,\n // or A.distance(B) in the 3-point form where A ≠ C)\n AP : PlaneElement;\n}\n\nexport class CircleElement extends GeomElement {\n\n public Center : PointElement;\n public A : PointElement;\n public B : PointElement;\n public AP : PlaneElement;\n\n // Starting angle (radians) for the slide-transition arc sweep.\n // Default 0 keeps the existing closed-circle render path identical\n // when drawProgress is 1. Set by A.Circle.compass before sweeping\n // so the trace begins at the natural compass-point (the angle from\n // centre to the radius-defining B). Reset in finalise().\n private _drawStartAngle : number = 0;\n // Face fill alpha — drives drawFace's globalAlpha independent of\n // drawProgress (which only drives the edge sweep). Default 1 means\n // \"fully opaque\" — every existing render path behaves identically.\n private _faceAlpha : number = 1;\n\n set drawStartAngle(value: number) { this._drawStartAngle = value; }\n get drawStartAngle(): number { return this._drawStartAngle; }\n\n set faceAlpha(value: number) {\n this._faceAlpha = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n get faceAlpha(): number { return this._faceAlpha; }\n\n constructor(ice? : ICircleElementConstruction) {\n super();\n this.dimension = 2;\n if(ice == null) return;\n this.Center = ice.C;\n this.A = ice.A != null ? ice.A : this.Center;\n this.B = ice.B;\n this.AP = ice.AP;\n }\n\n get radius() {\n return this.A.distance(this.B);\n }\n\n get radius2() {\n return this.A.distance2(this.B);\n }\n\n public defined() : boolean {\n return true;\n //return this.Center.defined() && this.A.defined()\n // && this.B.defined() && this.AP.defined();\n }\n\n\n // drawEllipse and fillEllipse not necessary as they are provided\n // in the canvas api.\n\n // Shared geometry walk. `arcStart` / `arcEnd` let the caller render\n // either a partial arc (the slide-transition edge sweep) or a\n // full circle for fill purposes — the face never gets partial.\n private _drawCircleArc(ctx : CanvasRenderingContext2D, arcStart : number, arcEnd : number) : void {\n ctx.beginPath();\n let r2 : number = this.radius2;\n let r : number = Math.sqrt(r2);\n let amp2 : number = this.AP.S.z*this.AP.S.z + this.AP.T.z*this.AP.T.z;\n if (Math.abs(amp2) < 0.01) { // the circle is flat\n ctx.ellipse(\n this.Center.x,\n this.Center.y,\n r,\n r,\n 0,\n arcStart,\n arcEnd);\n return;\n }\n let h : number = r/Math.sqrt(amp2);\n // determine major and minor radius vectors (a,b) and (c,d)\n let rcos :number = h*this.AP.T.z;\n let rsin :number = -h*this.AP.S.z;\n let majorx :number = rcos*this.AP.S.x + rsin*this.AP.T.x;\n let majory :number = rcos*this.AP.S.y + rsin*this.AP.T.y;\n let factor :number = (amp2 < 1.0)? Math.sqrt(1.0-amp2) : 0.0;\n let minorx :number = -factor*majory;\n let minory :number = factor*majorx;\n let majorR : number = Math.sqrt(majorx*majorx + majory*majory);\n let minorR : number = Math.sqrt(minorx*minorx + minory*minory);\n // Degenerate case: ellipse is so thin it looks like a line.\n // (minorR <= majorR always since minorR = factor * majorR with\n // factor in [0,1], so we only need to check minorR.)\n if (minorR < 0.5) {\n ctx.moveTo(this.Center.x - majorx, this.Center.y - majory);\n ctx.lineTo(this.Center.x + majorx, this.Center.y + majory);\n return;\n }\n // Rotation angle of the major axis\n let rotation : number = Math.atan2(majory, majorx);\n ctx.ellipse(\n this.Center.x,\n this.Center.y,\n majorR,\n minorR,\n rotation,\n arcStart,\n arcEnd);\n }\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n // Pick the highlight color BEFORE the null bail, matching\n // LineElement / PolygonElement (#81). A circle with a null\n // edgeColor can still render in the highlight stroke while\n // emphasized or slide-highlighted — the \"invisible highlight\n // target\" pattern, and what lets a zero-color transitionary\n // circle show up during its compass animation (SlateAnimator\n // holds emphasisAmount = 1 on animating targets).\n const color = (this.emphasized || this.shouldHighlight)\n ? this.edgeHighlightColor\n : this.edgeColor;\n if (color == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = color;\n // Match LineElement: smooth interpolation between baseline (1 or 3)\n // and 6 via emphasisAmount. Always assigned explicitly so a\n // previous element's value doesn't leak.\n {\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n }\n // Edge sweep: partial arc from drawStartAngle through\n // 2π · drawProgress. Default progress = 1 yields a full circle.\n let arcStart = this.drawStartAngle;\n let arcEnd = arcStart + 2 * Math.PI * this.drawProgress;\n this._drawCircleArc(ctx, arcStart, arcEnd);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n // Face is independent of the edge sweep — always fills the\n // full circle (filling a partial arc would render a pie wedge\n // with a chord bleeding out, which is not what a compass sweep\n // should look like). Alpha is driven by the dedicated faceAlpha\n // field so an animation can fade the fill in after the edge\n // trace completes; default faceAlpha = 1 preserves the\n // fully-opaque behaviour for every consumer that doesn't animate.\n let a = this.faceAlpha;\n if (a <= 0) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.fillStyle = this.faceColor;\n this._drawCircleArc(ctx, 0, 2 * Math.PI);\n if (a < 1) {\n ctx.save();\n ctx.globalAlpha = a;\n ctx.fill();\n ctx.restore();\n } else {\n ctx.fill();\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.nameColor;\n ctx.font = GeomElement._font;\n let [w, h] = this._getTextMetrics(ctx, this.name);\n ctx.fillText(this._name, this.Center.x - w/2, this.Center.y - h/2);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tCircumcenter.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\n// import {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {CircleElement} from \"./CircleElement\";\n\nexport class CircumcircleElement extends CircleElement {\n\n /*--------------------------------------------------------------------+\n | This is the circle passing through the three points B, C, and D.\t|\n | It is assumed that all three points lie in the plane AP.\t\t|\n +--------------------------------------------------------------------*/\n public C : PointElement;\n public D : PointElement;\n\n constructor(B: PointElement, C : PointElement, D: PointElement, AP: PlaneElement) {\n super();\n this.dimension = 2;\n this.B = B;\n this.C = C;\n this.D = D;\n this.AP = AP;\n this.Center = new PointElement({AP:AP});\n this.A = this.Center;\n }\n\n update() : void { \n this.Center.toCircumcenter(this.B,this.C,this.D); \n }\n\n translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n }\n\n rotate(pivot: PointElement, c: number, s: number) {\n this.Center.rotate(pivot, c, s);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tInvertCircleElement.ts |\n| Originally: InvertCircle.java |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {CircleElement} from \"./CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class InvertCircleElement extends CircleElement {\n /*--------------------------------------------------------------------+\n | Invert the circle C in the circle D to get this circle. It is |\n | assumed that C and D lie in the same plane C.AP. |\n +--------------------------------------------------------------------*/\n\n private _C: CircleElement;\n private _D: CircleElement;\n\n constructor(C: CircleElement, D: CircleElement) {\n super();\n this.dimension = 2;\n this._C = C;\n this._D = D;\n this.AP = C.AP;\n this.Center = new PointElement({AP: this.AP});\n this.A = this.Center;\n this.B = new PointElement({AP: this.AP});\n }\n\n public update() {\n let d2 = this._C.Center.distance2(this._D.Center);\n let r2 = this._C.radius2;\n let factor = this._D.radius2 / (d2 - r2);\n this.Center.to(this._C.Center).minus(this._D.Center).times(factor).plus(this._D.Center);\n factor = 1.0 + Math.sqrt(r2 / d2);\n this.B.to(this.Center).minus(this._D.Center).times(factor).plus(this._D.Center);\n }\n\n public translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n this.B.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.Center.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSphereIntersectionElement.ts |\n| Originally: IntersectionSS.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {CircleElement} from \"./CircleElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PerpendicularPlane} from \"../plane/PerpendicularPlane\";\n\nexport class SphereIntersectionElement extends CircleElement {\n /*--------------------------------------------------------------------+\n | This circle is the intersection of two spheres S and T. The center |\n | of the circle is Center, which is A, lies in the plane AP, and |\n | has radius AB. |\n +--------------------------------------------------------------------*/\n\n private _S: SphereElement;\n private _T: SphereElement;\n\n constructor(S: SphereElement, T: SphereElement) {\n super();\n this.dimension = 2;\n this._S = S;\n this._T = T;\n this.Center = this.A = new PointElement();\n this.B = new PointElement();\n this.AP = new PerpendicularPlane({A: this.Center, E: T.Center});\n this.Center._AP = this.AP;\n }\n\n public update() {\n let d2 = this._T.Center.distance2(this._S.Center);\n let t2 = this._T.radius2();\n let factor = 0.5 + (t2 - this._S.radius2()) / (2.0 * d2);\n this.Center.to(this._S.Center).minus(this._T.Center).times(factor).plus(this._T.Center);\n let radius = Math.sqrt(t2 - this.Center.distance2(this._T.Center));\n this.B.to(this.Center);\n this.B.z += radius;\n this.AP.update();\n }\n\n public translate(dx: number, dy: number) {\n this.Center.translate(dx, dy);\n this.B.translate(dx, dy);\n this.AP.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.Center.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n this.AP.rotate(pivot, ac, as);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tBichord.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {LineElement} from \"./LineElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\ninterface IBichordElementConstructor {\n C : CircleElement;\n D : CircleElement;\n}\n\nexport class Bichord extends LineElement {\n /*--------------------------------------------------------------------+\n | This line AB connects the two points where the two circles C and D |\n | meet. It is assumed that the two circles lie in the same plane, the |\n | plane of C. |\n +--------------------------------------------------------------------*/\n\n public C: CircleElement;\n public D: CircleElement;\n\n constructor(ibe? : IBichordElementConstructor) {\n super();\n this.dimension = 1;\n if (ibe == null) return;\n\n this._A = new PointElement();\n this._B = new PointElement();\n this.C = ibe.C;\n this.D = ibe.D;\n this._A._AP = this.C.AP;\n this._B._AP = this.C.AP;\n }\n\n public translate(dx: number, dy: number) {\n this._A.translate(dx, dy);\n this._B.translate(dx, dy);\n }\n\n public rotate(pivot : PointElement, ac : number, as : number) {\n this._A.rotate(pivot, ac, as);\n this._B.rotate(pivot, ac, as);\n }\n\n public update() {\n let r : number = this.C.radius;\n let s : number = this.D.radius;\n let d : number = this.C.Center.distance(this.D.Center);\n if (d > r + s) {\n let v = 0.0/0.0;\n this.A.x = v;\n this.A.y = v;\n this.A.z = v;\n this.B.x = v;\n this.B.y = v;\n this.B.z = v;\n return;\n }\n let costheta : number = (d*d + r*r - s*s) / (2.0 * d * r);\n let sintheta : number = Math.sqrt(1.0-costheta*costheta);\n this.A.to(this.D.Center).toCircle(this.C);\n this.B.to(this.A);\n this.A.rotate(this.C.Center,costheta,sintheta,this.C.AP);\n this.B.rotate(this.C.Center,costheta,-sintheta,this.C.AP);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tChord.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {LineElement} from \"./LineElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\n\ninterface IChordElementConstructor {\n D : PointElement;\n E : PointElement;\n C : CircleElement;\n}\n\nexport class Chord extends LineElement {\n /*--------------------------------------------------------------------+\n | This line AB is the segment of the line DE (extended) that |\n | intersects the circle C. It is assumed that DE and C lie in the |\n | same plane, namely that of C. |\n +--------------------------------------------------------------------*/\n\n public C: CircleElement;\n public D: PointElement;\n public E: PointElement;\n\n constructor(ice? : IChordElementConstructor) {\n super();\n this.dimension = 1;\n if (ice == null) return;\n\n this.C = ice.C;\n this.D = ice.D;\n this.E = ice.E;\n this._A = new PointElement({AP: this.C.AP});\n this._B = new PointElement({AP: this.C.AP});\n }\n\n public translate(dx: number, dy: number) {\n this._A.translate(dx, dy);\n this._B.translate(dx, dy);\n }\n\n public rotate(pivot : PointElement, ac : number, as : number) {\n this._A.rotate(pivot, ac, as);\n this._B.rotate(pivot, ac, as);\n }\n\n public update() {\n this._B.to(this.C.Center).toLine(this.D, this.E, false);\n let d2 : number = this.C.Center.distance2(this._B);\n let r2 : number = this.C.radius2;\n if (d2 > r2) {\n let v = 0.0/0.0;\n this._A.x = v;\n this._A.y = v;\n this._A.z = v;\n this._B.x = v;\n this._B.y = v;\n this._B.z = v;\n return;\n }\n let s : number = Math.sqrt(r2 - d2);\n let factor : number = s / this.D.distance(this._B);\n if (factor < 1e10) {\n this._A.to(this.D).minus(this._B).times(factor).plus(this._B);\n } else {\n factor = s / this.E.distance(this._B);\n this._A.to(this.E).minus(this._B).times(factor).plus(this._B);\n }\n this._B.times(2.0).minus(this._A);\n }\n\n}\n","// Animations targeting LineElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\n\n// Default trace rate in px/ms. Calibrated for unhurried teaching: a\n// typical 100-px construction line draws over ~400 ms; 200-px lines\n// take ~800 ms. Authors who want snappier transitions raise the rate\n// via slate.animationConfig.rates[\"Line.straightEdgeConnect\"].\nconst DEFAULT_LINE_RATE_PX_PER_MS = 0.25;\n\n// Common helper: trace the target line from A toward B by driving\n// drawProgress. Used by both StraightEdgeConnect (the canonical\n// straightedge stroke between two existing points) and\n// StraightEdgeExtend (same shape, just visually framed as extending\n// past an endpoint instead of joining two existing ones).\nfunction traceLine(target: LineElement, rate: number): IAnimationStep {\n // duration = length / rate, clamped low so an extremely short\n // line still gets a perceptible draw.\n const dx = target.B.x - target.A.x;\n const dy = target.B.y - target.A.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const durationMs = Math.max(120, length / rate);\n return {\n durationMs,\n tick: (progress) => { target.drawProgress = progress; },\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n };\n}\n\n// A.Line.straightEdgeConnect — pencil stroke from A toward B.\n// Args: none. Duration = length × default rate (0.5 px/ms).\nexport class LineStraightEdgeConnectAnimation extends Animation {\n public animationMethod = AllAnimations.LINE_STRAIGHT_EDGE_CONNECT;\n public name = \"Line.straightEdgeConnect\";\n public elementType = LineElement;\n public defaultRate = DEFAULT_LINE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [traceLine(target as LineElement, this.defaultRate)];\n }\n}\n\n// A.Line.straightEdgeExtend — for Line.extend constructions where one\n// endpoint sits on an existing line and the other is the projected\n// new endpoint. v1 renders the same trace as StraightEdgeConnect;\n// future richer variants might pivot a straightedge guide against the\n// existing line first.\nexport class LineStraightEdgeExtendAnimation extends Animation {\n public animationMethod = AllAnimations.LINE_STRAIGHT_EDGE_EXTEND;\n public name = \"Line.straightEdgeExtend\";\n public elementType = LineElement;\n public defaultRate = DEFAULT_LINE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [traceLine(target as LineElement, this.defaultRate)];\n }\n}\n\nregisterAnimation(new LineStraightEdgeConnectAnimation());\nregisterAnimation(new LineStraightEdgeExtendAnimation());\n","/*----------------------------------------------------------------------+\n| Line construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions, LineConstructions as LineConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {PointPerpendicular1Construction, PointPerpendicular2Construction,\n PointPerpendicular3Construction, PointPerpendicular4Construction,\n PointPerpendicular5Construction} from \"../point/PointConstructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {Foot} from \"../point/Foot\";\nimport {PlaneFootElement} from \"../point/PlaneFootElement\";\nimport {LineElement} from \"./LineElement\";\nimport {Perpendicular} from \"./Perpendicular\";\nimport {PlanePerpendicularLine} from \"./PlanePerpendicularLine\";\nimport {Bichord} from \"./Bichord\";\nimport {Chord} from \"./Chord\";\nimport {SimilarElement} from \"../point/SimilarElement\";\nimport {ProportionElement} from \"../point/ProportionElement\";\nimport {AngleDividerElement} from \"../point/AngleDividerElement\";\nimport {MeanProportionalElement} from \"../point/MeanProportionalElement\";\n\n/**********************\n * Element Class Line *\n **********************/\n\n// line\n// connect\n// points A, B\n// the line AB connecting two points A and B\n// (Java: Slate.java line case 0 — new LineElement(A,B))\nexport class LineConnectConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.connect;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new LineElement({A:P[0], B: P[1]});\n\n return [[g], g];\n }\n}\n\n// line\n// angleBisector — points B, A, C [, plane D = screen]\n// line from A to the bisector point of angle BAC on line BC\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java line case 1 — AngleDivider(B,A,C,plane,2) + LineElement(A,result))\nexport class AngleBisectorLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.angleBisector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let ad = new AngleDividerElement(P[0], P[1], P[2], plane, 2);\n let g = new LineElement({A: P[1], B: ad});\n return [[ad, g], g];\n }\n}\n\n// line\n// angleDivider — points B, A, C, integer n [, plane D = screen]\n// line from A to the n-th division point of angle BAC on line BC\n// 2D: 3 points, 0 elements, 1 integer — uses screen plane\n// 3D: 3 points, 1 PlaneElement, 1 integer — uses explicit plane\n// (Java: Slate.java line case 2 — AngleDivider(B,A,C,plane,n) + LineElement(A,result))\nexport class AngleDividerLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.angleDivider;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let ad = new AngleDividerElement(P[0], P[1], P[2], plane, N[0]);\n let g = new LineElement({A: P[1], B: ad});\n return [[ad, g], g];\n }\n}\n\n// line\n// foot (2D variant)\n// 3 points A, B, C\n// the line AD from A to the foot of the perpendicular from A to line BC\n// (Java: Slate.java case 3, choice 0 — Foot(A,B,C) + LineElement(A,foot).\n// Foot class already IMPL at src/elements/point/Foot.ts.)\nexport class LineFootConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.foot;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let fo = new Foot(P[0], P[1], P[2]);\n let g = new LineElement({A: P[0], B: fo});\n return [[fo, g], g];\n }\n}\n\n// *Solid Geometry Only*\n// line\n// foot\n// point A plane B\n// the line AD drawn perpendicular to plane B with the point D lying on B\n// (Java: PlaneFoot.java — TS: PlaneFootElement.ts, renamed for clarity)\nexport class PlaneFootLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.foot;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const fo = new PlaneFootElement(P[0], E[0] as PlaneElement);\n const g = new LineElement({A: P[0], B: fo});\n return [[fo, g], g];\n }\n}\n\n// line\n// chord\n// points A, B, circle C\n// the chord of circle C cut by the line AB\n// (post-LineElement-expansion: A, B are the two endpoints of the input line)\n// (Java: Slate.java line case 4 — new Chord(A,B,C). Java: Chord.java)\nexport class ChordConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.chord;\n signature = { points: 2, elements: 1, integers: 0, elementTypes: [CircleElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new Chord({D: P[0], E: P[1], C: E[0] as CircleElement});\n return [[g], g];\n }\n}\n\n// line\n// bichord\n// circles A, B\n// the common chord connecting the two intersection points of the circles A and B\n// (Java: Slate.java line case 5 — new Bichord(A,B). Java: Bichord.java)\nexport class BichordConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.bichord;\n signature = { points: 0, elements: 2, integers: 0, elementTypes: [CircleElement, CircleElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Bichord({C: E[0] as CircleElement, D: E[1] as CircleElement});\n return [[g], g];\n }\n}\n\n// Line perpendicular constructions — all 5 variants share the same\n// construct() pattern: call the parent point-perpendicular construct(),\n// then return the Perpendicular LineElement (first in elementsForUpdate).\n// (Java: Slate.java line case 6 — all choices dispatch to a Perpendicular\n// or PlanePerpendicular, then return the LineElement directly.)\nfunction wrapPointAsLine(es: [GeomElementsForUpdate, GeomElement]): [GeomElementsForUpdate, GeomElement] {\n return [es[0], es[0][0]];\n}\n\n// line — perpendicular variant 1: points A, B [plane C (screen)]\n// the line from A to the point D so that AD is equal and perpendicular to AB in plane C\n// (Java: Slate.java line case 6, choice 0 — Perpendicular(A,B,screen,A,B))\nexport class LinePerpendicular1Construction extends PointPerpendicular1Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 2: points A, B, plane C\n// (Java: Slate.java line case 6, choice 1 — Perpendicular(A,B,C,A,B))\nexport class LinePerpendicular2Construction extends PointPerpendicular2Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 3: points A, B, D, E [plane C (screen)]\n// (Java: Slate.java line case 6, choice 2 — Perpendicular(A,B,screen,D,E))\nexport class LinePerpendicular3Construction extends PointPerpendicular3Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 4: points A, B, plane C, points D, E\n// (Java: Slate.java line case 6, choice 3 — Perpendicular(A,B,C,D,E))\nexport class LinePerpendicular4Construction extends PointPerpendicular4Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line — perpendicular variant 5: point A, plane B, points C, D\n// (Java: Slate.java line case 6, choice 4 — PlanePerpendicularLine(A,B,C,D))\nexport class LinePerpendicular5Construction extends PointPerpendicular5Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.perpendicular;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) { return wrapPointAsLine(super.construct(screen, P, E, N)); }\n}\n\n// line\n// cutoff\n// points A, B, C, D\n// the line AE equal to CD along the line AB\n// (Java: Slate.java line case 7 — Layoff(A,A,B,C,D) + LineElement(A,layoff))\nexport class LineCutoffConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.cutoff;\n signature = { points: 4, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[0], P[1], P[2], P[3]);\n let g = new LineElement({A: P[0], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// extend\n// points A, B, C, D\n// the line BE equal to CD so that A, B, and C are collinear with B between A and C\n// (Java: Slate.java line case 8 — Layoff(B,A,B,C,D) + LineElement(B,layoff))\nexport class LineExtendConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.extend;\n signature = { points: 4, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[1], P[0], P[1], P[2], P[3]);\n let g = new LineElement({A: P[1], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// parallel\n// points A, B, C\n// the line AD through A parallel and equal to BC, so D = A + (C - B)\n// (no dedicated Java class — Slate.java case 9 dispatches to a Layoff\n// trick: Layoff(A, B, C, B, C) gives D = A + (C-B), then wraps a fresh\n// LineElement(A, D). Same pattern as LineExtendConstruction above.)\nexport class LineParallelConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.parallel;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n let g = new LineElement({A: P[0], B: lo});\n return [[lo, g], g];\n }\n}\n\n// line\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the line AH so that triangle ABH is similar to triangle DEF\n// 2D: 5 points, 0 elements — uses screen plane for both\n// 3D: 5 points, 2 PlaneElements — uses explicit planes\n// (Java: Slate.java line case 10 — Similar(A,B,C,D,E,F,G) + LineElement(A,H))\nexport class SimilarLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let sim = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n let g = new LineElement({A: P[0], B: sim});\n return [[sim, g], g];\n }\n}\n\n// line\n// proportion\n// 8 points A, B, C, D, E, F, G, H\n// the line GI along GH so that AB:CD = EF:GI\n// (Java: Slate.java line case 11 — Proportion + LineElement(G, result))\nexport class ProportionLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.proportion;\n signature = { points: 8, elements: 0, integers: 0 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let prop = new ProportionElement(P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7]);\n let g = new LineElement({A: P[6], B: prop});\n return [[prop, g], g];\n }\n}\n\n// line\n// meanProportional\n// 6 points S0, S1, T0, T1, U0, U1\n// the line U0U' along U0U1 so that S:U' = U':T\n// (Java: Slate.java line case 12 — MeanProportional + LineElement(U0, result))\nexport class MeanProportionalLineConstruction extends Construction {\n constructionMethod: AllConstructions = LineConstructionsEnum.meanProportional;\n signature = { points: 6, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let mp = new MeanProportionalElement(P[0], P[1], P[2], P[3], P[4], P[5]);\n let g = new LineElement({A: P[4], B: mp});\n return [[mp, g], g];\n }\n}\n\nexport const lineConstructions: Construction[] = [\n new LineConnectConstruction(),\n new LineExtendConstruction(),\n new LinePerpendicular1Construction(),\n new LinePerpendicular2Construction(),\n new LinePerpendicular3Construction(),\n new LinePerpendicular4Construction(),\n new LinePerpendicular5Construction(),\n new BichordConstruction(),\n new ChordConstruction(),\n new LineParallelConstruction(),\n new LineCutoffConstruction(),\n new PlaneFootLineConstruction(),\n new LineFootConstruction(),\n new SimilarLineConstruction(),\n new ProportionLineConstruction(),\n new AngleBisectorLineConstruction(),\n new AngleDividerLineConstruction(),\n new MeanProportionalLineConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tLineElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {GeomElement} from \"../GeomElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\ninterface ILineElementConstructor {\n A : PointElement;\n B : PointElement;\n}\n\nexport class LineElement extends GeomElement {\n protected _A : PointElement;\n\n get A() : PointElement { return this._A; }\n\n protected _B : PointElement;\n get B() : PointElement { return this._B; }\n\n constructor(ile?: ILineElementConstructor) {\n super();\n this.dimension = 1;\n this._A = ile && ile.A || null;\n this._B = ile && ile.B || null;\n }\n\n public drawEdge(c: HTMLCanvasElement, color?: string): void {\n if (!this.visible) return;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.edgeHighlightColor;\n } else {\n color = this.edgeColor;\n }\n }\n\n if (color == null) return;\n\n let ctx = c.getContext(\"2d\");\n ctx.strokeStyle = color;\n // Stroke weight scales smoothly. Baseline is 1 (normal) or 3\n // (slide-highlight); emphasisAmount interpolates up to 6 for\n // full emphasis. emphasisAmount = 0 → baseline; 1 → 6 px;\n // animator fades 1 → 0 over ~250 ms at the end of a transition\n // so the post-animation settle isn't a hard pop.\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n // Slide-transition animation: drawProgress < 1 traces only the\n // first `progress` fraction of the line A → B. Default 1 keeps\n // the full-line behaviour every existing consumer relies on.\n let p = this.drawProgress;\n let endX = this._A.x + (this._B.x - this._A.x) * p;\n let endY = this._A.y + (this._B.y - this._A.y) * p;\n ctx.beginPath();\n ctx.moveTo(this._A.x, this._A.y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor == null || this.name == null) return;\n if (this._A == null || !this._A.defined()) return;\n if (this._B == null || !this._B.defined()) return;\n const ix = Math.round((this._A.x + this._B.x) / 2);\n const iy = Math.round((this._A.y + this._B.y) / 2);\n this.drawString(ix, iy, c);\n }\n\n public drawVertex(c: SlateCanvas): void {\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPerpendicular.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport interface IPerpendicularElementConstructor {\n C : PointElement;\n D : PointElement;\n P : PlaneElement;\n E : PointElement;\n F : PointElement;\n}\n\nexport class Perpendicular extends LineElement {\n // draw perpendicular to CD in the plane P. A is the proj of\n // C onto P, while AB is perpendicular to CD and equals EF.\n\n protected _C : PointElement;\n protected _D : PointElement;\n protected _E : PointElement;\n protected _F : PointElement;\n protected _P : PlaneElement;\n\n constructor(ipe?: IPerpendicularElementConstructor) {\n super();\n this.dimension = 1;\n if(ipe == null) return;\n this._P = ipe.P;\n this._A = new PointElement({AP: ipe.P});\n this._B = new PointElement({AP: ipe.P});\n this._C = ipe.C;\n this._D = ipe.D;\n this._E = ipe.E;\n this._F = ipe.F;\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.A.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n\n public translate(dx: number, dy: number): void {\n this.A.translate(dx,dy);\n this.B.translate(dx,dy);\n }\n\n public update(): void {\n this._A.to(this._C).toPlane(this._P);\n this._B.to(this._D).minus(this._A);\n let Bs : number = PointElement.dot(this.B,this._P.S);\n let Bt : number = PointElement.dot(this.B,this._P.T);\n let factor : number = Math.sqrt(this._E.distance2(this._F)/(Bs*Bs+Bt*Bt));\n Bs = -Bs/factor;\n Bt /= factor;\n this._B.x = Bt*this._P.S.x + Bs*this._P.T.x + this._A.x;\n this._B.y = Bt*this._P.S.y + Bs*this._P.T.y + this._A.y;\n this._B.z = Bt*this._P.S.z + Bs*this._P.T.z + this._A.z;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlanePerpendicularLine.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2023, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\nimport {LineElement} from \"./LineElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {IPerpendicularElementConstructor} from \"./Perpendicular\";\n\nexport interface IPlanePerpendicularLineConstructor {\n C : PointElement;\n P : PlaneElement;\n D : PointElement;\n E : PointElement;\n}\n\nexport class PlanePerpendicularLine extends LineElement {\n \n // draw perpendicular at C to the plane P. A is the proj of C onto P, while\n // AB is perpendicular to P and equal to DE\n\n protected _C : PointElement;\n protected _P : PlaneElement;\n protected _D : PointElement;\n protected _E : PointElement;\n \n // The line AB will be perpendicular to the plane P. A will be the projection\n // of C on to the plane P. AB will equal DE.\n\n constructor(ipe?: IPlanePerpendicularLineConstructor) {\n super();\n this.dimension = 1;\n if(ipe == null) return;\n this._A = new PointElement({AP: ipe.P});\n this._B = new PointElement();\n this._C = ipe.C;\n this._D = ipe.D;\n this._E = ipe.E;\n this._P = ipe.P;\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.A.rotate(pivot, ac, as);\n this.B.rotate(pivot, ac, as);\n }\n\n public translate(dx: number, dy: number): void {\n this.A.translate(dx,dy);\n this.B.translate(dx,dy);\n }\n\n public update(): void {\n this._A.to(this._C).toPlane(this._P);\n this._B.toCross(this._P.S, this._P.T);\n this._B.times(this._D.distance(this._E)).plus(this._A)\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tParallelPlane.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PlaneElement} from \"./PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class ParallelPlane extends PlaneElement {\n /*--------------------------------------------------------------------+\n | this is the plane parallel to the plane P passing through the |\n | point A |\n +--------------------------------------------------------------------*/\n\n private _P: PlaneElement;\n\n constructor(P: PlaneElement, A: PointElement) {\n super();\n this.dimension = 2;\n this._P = P;\n this.A = A;\n this.B = new PointElement();\n this.C = new PointElement();\n this.S = P.S;\n this.T = P.T;\n this.U = P.U;\n }\n\n public translate(dx: number, dy: number) {\n this.B.translate(dx, dy);\n this.C.translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.B.rotate(pivot, ac, as);\n this.C.rotate(pivot, ac, as);\n }\n\n public update() {\n this.B.to(this._P.B).minus(this._P.A).plus(this.A);\n this.C.to(this._P.C).minus(this._P.A).plus(this.A);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPerpendicularPlane.ts |\n| Originally: PerpendicularPL.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"./PlaneElement\";\n\nexport interface IPerpendicularPlaneElementConstruction {\n A : PointElement;\n E : PointElement;\n}\n\nexport class PerpendicularPlane extends PlaneElement {\n\n // this is the plane perpendicular to the line AE at the point A\n\n public E : PointElement;\n\n constructor(ippe? : IPerpendicularPlaneElementConstruction) {\n super();\n this.A = ippe.A;\n this.E = ippe.E;\n this.B = new PointElement({AP: this});\n this.C = new PointElement({AP: this});\n this.S = new PointElement();\n this.T = new PointElement();\n }\n\n translate(dx: number, dy: number) : void {\n this.B.translate(dx, dy);\n this.C.translate(dx, dy);\n }\n\n rotate(pivot : PointElement, ac: number, as: number) {\n this.B.rotate(pivot, ac, as);\n this.C.rotate(pivot, ac, as);\n super.update();\n }\n\n update() {\n this.U = PointElement.difference(this.E,this.A);\n let len : number = this.U.length();\n // TODO: Check division by 0?\n this.U.times(1.0/len);\n let lxy : number = Math.sqrt(this.U.x*this.U.x + this.U.y*this.U.y);\n if(lxy >= 0.000001) {\n this.S.x = -this.U.y/lxy;\n this.S.y = this.U.x/lxy;\n this.T.toCross(this.U,this.S);\n } else {\n this.S.x = 1.0;\n this.S.y = 0.0;\n this.S.z = 0.0;\n this.T.x = 0.0;\n this.T.y = 1.0;\n this.T.z = 0.0;\n }\n this.B.to(this.S).times(len).plus(this.A);\n this.C.to(this.T).times(len).plus(this.A);\n }\n}\n","/*----------------------------------------------------------------------+\n| Plane construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n PlaneConstructions as PlaneConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"./PlaneElement\";\nimport {PerpendicularPlane} from \"./PerpendicularPlane\";\nimport {ParallelPlane} from \"./ParallelPlane\";\n\n// plane — 3points — points A, B, C\n// (Java: Slate.java plane case 0 — new PlaneElement(A, B, C))\nexport class Plane3PointsConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.threePoints;\n signature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlaneElement({A: P[0], B: P[1], C: P[2]});\n return [[g], g];\n }\n}\n\n// plane — perpendicular — points A, B\n// (Java: Slate.java plane case 1 — new PerpendicularPL(A,B))\nexport class PerpendicularPlaneConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.perpendicular;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PerpendicularPlane({A: P[0], E: P[1]});\n return [[g], g];\n }\n}\n\n// plane — parallel — plane P, point A\n// (Java: ParallelP.java — 26 lines, line-for-line port)\nexport class PlaneParallelConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.parallel;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new ParallelPlane(E[0] as PlaneElement, P[0]);\n return [[g], g];\n }\n}\n\n// plane — ambient (point variant) — point A\n// (Java: Slate.java plane case 3, choice 0 — returns P[0].AP)\nexport class AmbientPlanePointConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.ambient;\n signature = { points: 1, elements: 0, integers: 0 };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[P[0]._AP], P[0]._AP];\n }\n}\n\n// plane — ambient (circle variant) — circle A\n// (Java: Slate.java plane case 3, choice 1 — returns ((CircleElement)E[0]).AP)\nexport class AmbientPlaneCircleConstruction extends Construction {\n constructionMethod: AllConstructions = PlaneConstructionsEnum.ambient;\n signature = { points: 0, elements: 1, integers: 0, elementTypes: [CircleElement] };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const c = E[0] as CircleElement;\n return [[c.AP], c.AP];\n }\n}\n\nexport const planeConstructions: Construction[] = [\n new Plane3PointsConstruction(),\n new PerpendicularPlaneConstruction(),\n new PlaneParallelConstruction(),\n new AmbientPlanePointConstruction(),\n new AmbientPlaneCircleConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\n\nexport interface IPlaneElementConstruction {\n A : PointElement;\n B : PointElement;\n C : PointElement;\n}\n\ntype iplec = IPlaneElementConstruction\n\nexport class PlaneElement extends GeomElement {\n\n /*--------------------------------------------------------------------+\n | The plane is represented by three points on it. It's displayed as |\n | a parallelogram with three vertices A, B, and C,projected onto the |\n | xy-plane. S is a unit vector in the direction AB, T is a |\n | perpendicular unit in the plane, and U is perpendicular to both. |\n +--------------------------------------------------------------------*/\n public A : PointElement;\n public B : PointElement;\n public C : PointElement;\n public S : PointElement;\n public T : PointElement;\n public U : PointElement;\n\n public pivot : PointElement; // pivot point for the plane, if any\n public isScreen : boolean; // set true only for initial screen plane\n\n constructor(ip? : IPlaneElementConstruction) {\n super();\n this.dimension = 2;\n this.isScreen = false;\n if (ip != null) {\n this.A = ip.A;\n this.B = ip.B;\n this.C = ip.C;\n this.S = new PointElement();\n this.T = new PointElement();\n this.U = new PointElement();\n }\n }\n\n public defined(): boolean {\n return this.A != null && this.B != null && this.C != null;\n }\n\n // A plane renders as a parallelogram with corners A, B, D, C\n // where D = B + C - A (the 4th corner in the plane of A, B, C).\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.strokeStyle = this.edgeColor;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.moveTo(this.A.x, this.A.y);\n ctx.lineTo(this.B.x, this.B.y);\n ctx.lineTo(dx, dy);\n ctx.lineTo(this.C.x, this.C.y);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.fillStyle = this.faceColor;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.moveTo(this.A.x, this.A.y);\n ctx.lineTo(this.B.x, this.B.y);\n ctx.lineTo(dx, dy);\n ctx.lineTo(this.C.x, this.C.y);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor == null || this.name == null || !this.defined()) return;\n // Label placed at midpoint of BC, matching Java PlaneElement.drawName\n let ix = Math.round((this.B.x + this.C.x) / 2.0);\n let iy = Math.round((this.B.y + this.C.y) / 2.0);\n this.drawString(ix, iy, c);\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor == null || !this.defined()) return;\n // Draw vertex at D = B + C - A (the 4th parallelogram corner).\n // A, B, C are drawn by their own drawVertex calls in Slate.\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n let dx = this.B.x + this.C.x - this.A.x;\n let dy = this.B.y + this.C.y - this.A.y;\n ctx.beginPath();\n ctx.fillStyle = this.vertexColor;\n ctx.arc(dx, dy, 2, 0, 2*Math.PI, false);\n ctx.fill();\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n this.update();\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n if (this.isScreen && (this.A.z!=0.0 || this.B.z!=0.0 || this.C.z!=0.0))\n this.isScreen = false;\n // update the frame S,T,U\n this.S.to(this.B).minus(this.A);\n this.T.to(this.C).minus(this.A);\n this.S.times(1.0/this.S.length());\n let st : number = PointElement.dot(this.T, this.S);\n this.T.x -= st*this.S.x;\n this.T.y -= st*this.S.y;\n this.T.z -= st*this.S.z;\n this.T.times(1.0/this.T.length());\n this.U.toCross(this.S,this.T);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tAngleDividerElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class AngleDividerElement extends PointElement {\n /*--------------------------------------------------------------------+\n | n-sect angle BAC in the ambient plane AP |\n +--------------------------------------------------------------------*/\n\n private _A: PointElement; // vertex of the angle\n private _B: PointElement; // first ray point\n private _C: PointElement; // second ray point\n private _n: number; // divisor (2 = bisector)\n\n constructor(B: PointElement, A: PointElement, C: PointElement,\n AP: PlaneElement, n: number) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._C = C;\n this._AP = AP;\n this._n = n;\n }\n\n public update() {\n let theta : number = this._A.angle(this._B, this._C, this._AP) / this._n;\n let cos : number = Math.cos(theta);\n let sin : number = Math.sin(theta);\n if (this._AP.isScreen) {\n this._x = this._A.x + cos * (this._B.x - this._A.x) - sin * (this._B.y - this._A.y);\n this._y = this._A.y + sin * (this._B.x - this._A.x) + cos * (this._B.y - this._A.y);\n this._z = 0.0;\n } else {\n this.to(this._B).rotate(this._A, cos, sin, this._AP);\n }\n this.toIntersection(this, this._A, this._B, this._C, this._AP);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tCircleSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\n\nexport class CircleSlider extends PointElement {\n _C : CircleElement;\n _initx : number;\n _inity : number;\n _initz : number;\n\n _newP : PointElement = new PointElement();\n\n constructor(C: CircleElement,\n x: number, y: number, z: number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._C = C;\n this._x = x;\n this._initx = x;\n this._y = y;\n this._inity = y;\n this._z = z;\n this._initz = z;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toCircle(this._C);\n }\n\n public update() {\n this.toCircle(this._C);\n }\n\n public drag(tox: number, toy: number): boolean {\n this._x = tox;\n this._y = toy;\n if (!this.defined()) this._z = this._initz;\n this._newP.to(this).uptoPlane(this._C.AP);\n if (!this._newP.defined())\t// vertical plane\n this._newP.to(this).toPlane(this._C.AP);\n this._newP.toSphere(this._C.Center, this._C.radius);\n if ((this._newP.x-this.x)*(this._newP.x-this.x) +\n (this._newP.y-this.y)*(this._newP.y-this.y) < 0.5)\n return false;\n this.to(this._newP);\n return true;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tFixedPoint.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement, IPointElementConstruction} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class FixedPoint extends PointElement {\n\n protected _initx : number;\n protected _inity : number;\n protected _initz : number;\n\n constructor(ip? : IPointElementConstruction) {\n super(ip);\n this._initx = this._x;\n this._inity = this._y;\n this._initz = this._z;\n }\n\n public reset() : void {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tFoot.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class Foot extends PointElement {\n _A : PointElement;\n _B : PointElement;\n _C : PointElement;\n\n constructor(A: PointElement, B: PointElement, C: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._C = C;\n if (this._B.AP == this._C.AP) {\n this._AP = this._B.AP;\n }\n }\n\n public update() : void {\n this.to(this._A).toLine(this._B, this._C, false)\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tHarmonicElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class HarmonicElement extends PointElement {\n /*--------------------------------------------------------------------+\n | The harmonic conjugate A of B with respect to the points C and D. |\n | If B,C,D are collinear, then A also lies on that line; if not, |\n | A lies on the circumcircle through B,C,D. |\n +--------------------------------------------------------------------*/\n\n private _B: PointElement;\n private _C: PointElement;\n private _D: PointElement;\n private _E: PointElement;\n private _F: PointElement;\n private _M: PointElement;\n\n constructor(B: PointElement, C: PointElement, D: PointElement) {\n super();\n this.dimension = 0;\n this._B = B;\n this._C = C;\n this._D = D;\n this._E = new PointElement();\n this._F = new PointElement();\n this._M = new PointElement();\n }\n\n public update() {\n if (this._B.z === 0.0 && this._C.z === 0.0 && this._D.z === 0.0) {\n // 2D case: treat B,C,D as complex numbers\n // A = (C(B-D) + D(B-C)) / ((B-D) + (B-C))\n let Ex = this._B.x - this._C.x, Ey = this._B.y - this._C.y;\n let Fx = this._B.x - this._D.x, Fy = this._B.y - this._D.y;\n let BFx = this._C.x * Fx - this._C.y * Fy;\n let BFy = this._C.x * Fy + this._C.y * Fx;\n let DEx = this._D.x * Ex - this._D.y * Ey;\n let DEy = this._D.x * Ey + this._D.y * Ex;\n let den = (Fx + Ex) * (Fx + Ex) + (Fy + Ey) * (Fy + Ey);\n let numx = (BFx + DEx) * (Fx + Ex) + (BFy + DEy) * (Fy + Ey);\n let numy = -(BFx + DEx) * (Fy + Ey) + (BFy + DEy) * (Fx + Ex);\n this._x = numx / den;\n this._y = numy / den;\n } else {\n // 3D case\n this._M.to(this._C).plus(this._D).times(0.5); // M = (C+D)/2\n this._F.to(this._C).minus(this._M); // F = C-M\n this._E.to(this._B).minus(this._M); // E = B-M\n let rB2 = 1.0 / this._E.length2();\n let C2 = this._F.length2();\n this.to(this._F)\n .times(2.0 * PointElement.dot(this._E, this._F))\n .minus(this._E.times(C2))\n .times(rB2)\n .plus(this._M);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tIntersection.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class Intersection extends PointElement {\n \n A : PointElement;\n B : PointElement;\n C : PointElement;\n D : PointElement;\n\n constructor(A: PointElement,\n B: PointElement,\n C: PointElement,\n D: PointElement,\n AP: PlaneElement) {\n super({AP: AP});\n this.dimension = 0;\n this.A = A;\n this.B = B;\n this.C = C;\n this.D = D;\n }\n\n update(): void {\n this.toIntersection(this.A, this.B, this.C, this.D, this.AP);\n }\n}\n\n\n","/*----------------------------------------------------------------------+\n| Title:\tInvertPointElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\n\nexport class InvertPointElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Invert the point A in the circle C to get this point |\n +--------------------------------------------------------------------*/\n\n private _A: PointElement;\n private _C: CircleElement;\n\n constructor(A: PointElement, C: CircleElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._C = C;\n this._AP = C.AP;\n }\n\n public update() {\n this.toInvertPoint(this._A, this._C);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tLayoff.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class Layoff extends PointElement {\n\n // Lay off a line AB with endpoint A given, so that AB is parallel to CD\n // and equal to EF. (this is B)\n\n protected _A : PointElement;\n protected _C : PointElement;\n protected _D : PointElement;\n protected _E : PointElement;\n protected _F : PointElement;\n\n\n constructor(A: PointElement,\n C: PointElement,\n D: PointElement,\n E: PointElement,\n F: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._C = C;\n this._D = D;\n this._E = E;\n this._F = F;\n if (A.AP == C.AP && A.AP == D.AP) {\n this._AP = A.AP;\n }\n }\n\n public update() {\n let factor : number = this._E.distance(this._F) / this._C.distance(this._D);\n this.to(this._D).minus(this._C);\n this.times(factor).plus(this._A);\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Title:\tLineSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class LineSlider extends PointElement {\n _A : PointElement;\n _B : PointElement;\n _initx : number;\n _inity : number;\n _initz : number;\n _segment : boolean;\n\n constructor(A: PointElement, B: PointElement,\n x: number, y: number, z: number, segment: boolean) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._A = A;\n this._B = B;\n this._x = x;\n this._initx = x;\n this._y = y;\n this._inity = y;\n this._z = z;\n this._initz = z;\n this._segment = segment;\n if(this._A.AP == this._B.AP) this._AP = this._A.AP;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toLine(this._A, this._B, this._segment);\n }\n\n public update() {\n this.toLine(this._A, this._B, this._segment);\n }\n\n public drag(tox: number, toy: number): boolean {\n tox -= this._A.x;\n toy -= this._A.y;\n let dx : number = this._B.x - this._A.x;\n let dy : number = this._B.y - this._A.y;\n let factor : number = (tox*dx + toy*dy)/(dx*dx + dy*dy);\n if (this._segment) {\n if (factor < 0.0) factor = 0.0;\n else if (factor > 1.0) factor = 1.0;\n }\n tox = this._A.x + dx*factor;\n toy = this._A.y + dy*factor;\n if ((tox-this._x)*(tox-this._x) + (tox-this._y)*(tox-this._y) < 0.5) return false;\n // now drag this point\n this._x = tox;\n this._y = toy;\n this._z = this._A.z + (this._B.z-this._A.z)*factor;\n return true;\n }\n}","/*----------------------------------------------------------------------+\n| Title:\tMeanProportionalElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class MeanProportionalElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Given lines S,T,U cut off from U a mean proportional U' so that |\n | S:U'=U':T |\n +--------------------------------------------------------------------*/\n\n private _S0: PointElement;\n private _S1: PointElement;\n private _T0: PointElement;\n private _T1: PointElement;\n private _U0: PointElement;\n private _U1: PointElement;\n\n constructor(S0: PointElement, S1: PointElement, T0: PointElement,\n T1: PointElement, U0: PointElement, U1: PointElement) {\n super();\n this.dimension = 0;\n this._S0 = S0; this._S1 = S1;\n this._T0 = T0; this._T1 = T1;\n this._U0 = U0; this._U1 = U1;\n if (U0._AP === U1._AP) {\n this._AP = U0._AP;\n }\n }\n\n public update() {\n let factor : number = Math.sqrt(this._S0.distance2(this._S1) * this._T0.distance2(this._T1));\n factor = Math.sqrt(factor / this._U0.distance2(this._U1));\n this.to(this._U1).minus(this._U0);\n this.times(factor).plus(this._U0);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tMidpoint.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\n\nexport class Midpoint extends PointElement {\n _A : PointElement;\n _B : PointElement;\n\n constructor(A: PointElement, B: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n if (this._A.AP == this._B.AP) {\n this._AP = this._A.AP;\n }\n }\n\n public update() : void {\n this._x = (this._A.x + this._B.x) / 2.0;\n this._y = (this._A.y + this._B.y) / 2.0;\n this._z = (this._A.z + this._B.z) / 2.0;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneFootElement.ts |\n| Originally: PlaneFoot.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneFootElement extends PointElement {\n // foot of perpendicular from point A to the ambient plane AP\n\n private _A: PointElement;\n\n constructor(A: PointElement, P: PlaneElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._AP = P;\n }\n\n public update() {\n this.to(this._A).toPlane(this._AP);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneIntersection.ts |\n| Originally: IntersectionPL.java (renamed for clarity) |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n| |\n| NOTE: This file was previously a copy of Intersection.ts |\n| (line-line intersection). Rewritten 2026-04-12 to implement the |\n| actual plane-line intersection via toIntersectionPL(). |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneIntersection extends PointElement {\n // this point is the intersection of the ambient plane AP and the line AB\n\n private _A: PointElement;\n private _B: PointElement;\n\n constructor(AP: PlaneElement, A: PointElement, B: PointElement) {\n super();\n this.dimension = 0;\n this._A = A;\n this._B = B;\n this._AP = AP;\n }\n\n update(): void {\n this.toIntersectionPL(this._AP, this._A, this._B);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPlaneSlider.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class PlaneSlider extends PointElement {\n\n // this point can be dragged anywhere on the ambient plane AP\n\n protected _initx : number;\n protected _inity : number;\n protected _initz : number;\n\n protected _newP : PointElement = new PointElement();\n\n constructor(Qval : PlaneElement, xVal : number, yVal : number, zVal : number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._AP = Qval;\n this._x = this._initx = xVal;\n this._y = this._inity = yVal;\n this._z = this._initz = zVal;\n }\n\n public update() : void {\n this.toPlane(this._AP);\n }\n\n public reset() : void {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toPlane(this._AP);\n }\n\n public drag(tox : number, toy : number) : boolean {\n this._x = tox;\n this._y = toy;\n if (!this.defined()) { this._z = this._initz; }\n this._newP.to(this).uptoPlane(this._AP);\n if(this._newP.defined()) {\n this.to(this._newP);\n } else {\n this.toPlane(this._AP);\n }\n\n return true;\n }\n\n\n\n}\n","// Animations targeting PointElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {PointElement} from \"./PointElement\";\n\n// A.Point.appear — the marker radius scales from 0 to its final value\n// over a short duration. Args: none. Used as the simplest reveal for a\n// point that lands at a constructed position (e.g. Joyce's \"point C at\n// which the circles cut\").\nexport class PointAppearAnimation extends Animation {\n public animationMethod = AllAnimations.POINT_APPEAR;\n public name = \"Point.appear\";\n public elementType = PointElement;\n public defaultDurationMs = 350;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n return [{\n durationMs: this.defaultDurationMs,\n tick: (progress) => {\n target.drawProgress = progress;\n },\n finalise: () => {\n target.drawProgress = 1;\n target.visible = true;\n },\n }];\n }\n}\n\nregisterAnimation(new PointAppearAnimation());\n","/*----------------------------------------------------------------------+\n| Point construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions, PointConstructions,\n CircleConstructions, GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {CircumcircleElement} from \"../circle/CircumcircleElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"./PointElement\";\nimport {FixedPoint} from \"./FixedPoint\";\nimport {PlaneSlider} from \"./PlaneSlider\";\nimport {Midpoint} from \"./Midpoint\";\nimport {Intersection} from \"./Intersection\";\nimport {PlaneIntersection} from \"./PlaneIntersection\";\nimport {LineSlider} from \"./LineSlider\";\nimport {Layoff} from \"./Layoff\";\nimport {Foot} from \"./Foot\";\nimport {PlaneFootElement} from \"./PlaneFootElement\";\nimport {CircleSlider} from \"./CircleSlider\";\nimport {SimilarElement} from \"./SimilarElement\";\nimport {ProportionElement} from \"./ProportionElement\";\nimport {AngleDividerElement} from \"./AngleDividerElement\";\nimport {MeanProportionalElement} from \"./MeanProportionalElement\";\nimport {HarmonicElement} from \"./HarmonicElement\";\nimport {InvertPointElement} from \"./InvertPointElement\";\nimport {SphereSliderElement} from \"./SphereSliderElement\";\nimport {Perpendicular} from \"../line/Perpendicular\";\nimport {PlanePerpendicularLine} from \"../line/PlanePerpendicularLine\";\nimport {SphereElement} from \"../sphere/SphereElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\n\n/***********************\n * Element Class Point *\n ***********************/\n\n/* point\n * free\n * integers x, y\n * a freely dragable point in the screen plane with initial coordinates (x,y,0)\n * (Java: Slate.java point case 0 — new PlaneSlider(screen, x, y, 0))\n */\nexport class FreePointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.free;\n signature: ConstructionSignature = { points: 0, elements: 0, integers: 2 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlaneSlider(screen, N[0], N[1], 0);\n\n return [[g], g];\n }\n\n}\n\n// point\n// midpoint\n// points A, B\n// the midpoint of a line AB\n// (Java: Slate.java point case 1 — new Midpoint(A, B))\nexport class MidPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.midpoint;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Midpoint(P[0], P[1]);\n\n return [[g], g];\n }\n}\n\n// point\n// intersection\n// points A, B, C, D [, plane E = screen]\n// the intersection of two lines AB and CD in the plane E\n// (Java: Slate.java point case 2 — new Intersection(A,B,C,D,E))\nexport class IntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.intersection;\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 4 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new Intersection(P[0], P[1], P[2], P[3], plane);\n return [[g], g];\n }\n}\n\n// point\n// intersection (plane-line variant)\n// plane A, points B, C\n// the intersection of the plane A and the line BC\n// (Java: IntersectionPL.java — TS: PlaneIntersection.ts, renamed for clarity)\nexport class PlaneIntersectionConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.intersection;\n signature: ConstructionSignature = { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneIntersection(E[0] as PlaneElement, P[0], P[1]);\n return [[g], g];\n }\n}\n\n// point\n// first\n// points A, B\n// the first end A of the line AB\n// (Java: Slate.java point case 3 — returns P[0], preexists=true)\nexport class FirstPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.first;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], P[0]];\n }\n\n}\n\n// point\n// last\n// points A, B\n// the last end B of the line AB\n// (Java: Slate.java point case 4 — returns P[1], preexists=true)\nexport class LastPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.last;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], P[1]];\n }\n}\n\n// point\n// center\n// circle A\n// the center of the circle A\n// (Java: Slate.java point case 5, choice 0 — returns ((CircleElement)E[0]).Center)\nexport class CircleCenterConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.center;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 0, elementTypes: [CircleElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], (E[0] as CircleElement).Center as PointElement];\n }\n}\n\n// point\n// center (sphere variant)\n// sphere A\n// the center of the sphere A\n// (Java: Slate.java point case 5, choice 1 — returns ((SphereElement)E[0]).Center)\nexport class SphereCenterConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.center;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 0, elementTypes: [SphereElement] };\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n return [[], (E[0] as SphereElement).Center as PointElement];\n }\n}\n\n// point\n// lineSlider\n// points A, B, integers x, y, [z=0]\n// a point that slides along a line AB with initial coordinates (x,y,z)\n// (Java: Slate.java point case 6 — new LineSlider(A,B,x,y,z,false))\nexport class LineSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.lineSlider;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 2 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.E.length === 0 && (sp.N.length === 2 || sp.N.length === 3);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = this.createSlider(P[0], P[1], N[0], N[1], N.length > 2 ? N[2] : 0);\n return [[g], g];\n }\n protected createSlider(a: PointElement, b: PointElement, x: number, y: number, z: number) {\n return new LineSlider(a, b, x, y, z, false);\n }\n}\n\n// point\n// circleSlider\n// circle A, integers x, y, [z=0]\n// a point that slides along a circle A with given initial coordinates (x,y,z)\n// (Java: Slate.java point case 7 — new CircleSlider(E[0], x, y, z))\nexport class CircleSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.circleSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 2, elementTypes: [CircleElement] };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 0 && sp.E.length === 1 && (sp.N.length === 2 || sp.N.length === 3)\n && sp.E[0] instanceof CircleElement;\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new CircleSlider(E[0] as CircleElement, N[0], N[1], N.length > 2 ? N[2] : 0);\n return [[g], g];\n }\n}\n\n// circle\n// circumcircle — points A, B, C [, plane D = screen]\n// the circle passing through 3 points A, B, and C in the plane D\n// (Java: Slate.java circle case 1 — new Circumcircle(A,B,C,D))\nexport class CircumcircleConstruction extends Construction {\n constructionMethod: AllConstructions = CircleConstructions.circumcircle;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new CircumcircleElement(P[0], P[1], P[2], plane);\n return [[g], g];\n }\n}\n\n// point\n// circumcenter — points A, B, C [, plane D = screen]\n// the center of a circle ABC passing through 3 points A, B, and C in the plane D\n// (Java: Slate.java point case 8 — new Circumcircle(A,B,C,D), returns circ.Center)\nexport class CircumcenterConstruction extends CircumcircleConstruction {\n constructionMethod: AllConstructions = PointConstructions.circumcenter;\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let es = super.construct(screen, P, E, N);\n let g : CircleElement = es[1] as CircleElement;\n es[0].push(g.Center);\n return [es[0], g.Center];\n }\n}\n\n/* point\n * foot\n * points A, B, C\n * the foot of a perpendicular drawn from A to a line BC\n */\n// (Java: Slate.java point case 10, choice 0 — new Foot(A,B,C))\nexport class FootPointConstruction extends Construction {\n constructionMethod : AllConstructions = PointConstructions.foot;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]) : [GeomElementsForUpdate, GeomElement] {\n let g = new Foot(P[0], P[1], P[2]);\n\n return [[g], g];\n }\n}\n\n// point\n// foot (plane variant — solid geometry)\n// point A plane B\n// the foot of a perpendicular drawn from A to a plane B\n// (Java: PlaneFoot.java — TS: PlaneFootElement.ts, renamed for clarity)\nexport class PlaneFootPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.foot;\n signature: ConstructionSignature = { points: 1, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneFootElement(P[0], E[0] as PlaneElement);\n return [[g], g];\n }\n}\n\n// point\n// layoff used for extend and cutoff\nexport abstract class LayoffConstruction extends Construction {\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = this._createLayoff(P);\n return [[g], g];\n }\n\n protected abstract _createLayoff(ps: PointElement[]) : GeomElement;\n}\n\n// point\n// cutoff\n// points A, B, C, D\n// the point E on a line AB so that AE = CD\n// (Java: Slate.java point case 11 — new Layoff(A,A,B,C,D))\nexport class CutoffConstruction extends LayoffConstruction {\n constructionMethod: AllConstructions = PointConstructions.cutoff;\n protected _createLayoff(ps: PointElement[]) : GeomElement {\n return new Layoff(ps[0], ps[0], ps[1], ps[2], ps[3]);\n }\n}\n\n// point\n// extend\n// points A, B, C, D\n// the point E on a line AB so that BE = CD\n// (Java: Slate.java point case 12 — new Layoff(B,A,B,C,D))\nexport class ExtendConstruction extends LayoffConstruction {\n constructionMethod: AllConstructions = PointConstructions.extend;\n protected _createLayoff(ps: PointElement[]) : GeomElement {\n return new Layoff(ps[1], ps[0], ps[1], ps[2], ps[3]);\n }\n}\n\n// point\n// parallelogram\n// points C, A, B\n// the 4th vertex D' of the parallelogram C-A-B-D' given 3 vertices C, A, B\n// D' = C + (B - A) [reuses Layoff with equal direction and length vectors]\n// (Java: Slate.java point case 13 — new Layoff(C,A,B,A,B))\nexport class ParallelogramConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.parallelogram;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// point\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the point H so that triangle ABH in plane C is similar to triangle DEF in plane G\n// (Java: Slate.java point case 14 — Similar.java)\nexport class SimilarPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let g = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n return [[g], g];\n }\n}\n\n// point perpendicular constructions\nexport abstract class PointPerpendicularConstruction extends Construction {\n constructionMethod : AllConstructions = PointConstructions.perpendicular;\n}\n\n\n/* point\n * perpendicular\n * points A, B, [plane C (screen)]\n * the point D so that AD is equal and perpendicular to AB in plane C\n * (Java: Slate.java point case 15, choice 0 — new Perpendicular(A,B,screen,A,B))\n */\nexport class PointPerpendicular1Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:screen, E:P[0], F:P[1]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, plane C\n * the point D so that AD is equal and perpendicular to AB in plane C\n * (Java: Slate.java point case 15, choice 1 — new Perpendicular(A,B,C,A,B))\n */\nexport class PointPerpendicular2Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 2, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:E[0] as PlaneElement, E:P[0], F:P[1]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, D, E [plane C (screen)]\n * the point F so that AF is perpendicular to AB in plane C and equals DE\n * (Java: Slate.java point case 15, choice 2 — new Perpendicular(A,B,screen,D,E))\n */\nexport class PointPerpendicular3Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 4, elements: 0, integers: 0 };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:screen, E:P[2], F:P[3]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * points A, B, plane C, points D, E\n * the point F so that AF is perpendicular to AB in plane C and equals DE\n * (Java: Slate.java point case 15, choice 3 — new Perpendicular(A,B,C,D,E))\n */\nexport class PointPerpendicular4Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 4, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new Perpendicular({C:P[0], D:P[1],P:E[0] as PlaneElement, E:P[2], F:P[3]});\n return [[g], g.B];\n }\n}\n\n\n/* point\n * perpendicular\n * point A, plane B, points C, D\n * the point E on the line perpendicular to plane B passing through\n * A so that the distance from E to B equals CD\n * (Java: Slate.java point case 15, choice 4 — new PlanePerpendicular(A,B,C,D))\n */\nexport class PointPerpendicular5Construction extends PointPerpendicularConstruction {\n signature: ConstructionSignature = { points: 3, elements: 1, integers: 0, elementTypes: [PlaneElement] };\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PlanePerpendicularLine({C:P[0], P:E[0] as PlaneElement, D:P[1], E:P[2]});\n return [[g], g.B];\n }\n}\n\n\n// point\n// proportion\n// 8 points S0, S1, T0, T1, U0, U1, V0, V1\n// the point V' on V0V1 so that |S0S1|:|T0T1| = |U0U1|:|V0V'|\n// (Java: Proportion.java — 26 lines, line-for-line port)\nexport class ProportionPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.proportion;\n signature: ConstructionSignature = { points: 8, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new ProportionElement(P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7]);\n return [[g], g];\n }\n}\n\n// point\n// invert\n// point A circle B\n// the image of a point A inverted in the circle B\n// (Java: InvertPoint.java — 16 lines, calls toInvertPoint(A, C))\nexport class InvertPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.invert;\n signature: ConstructionSignature = { points: 1, elements: 1, integers: 0, elementTypes: [CircleElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new InvertPointElement(P[0], E[0] as CircleElement);\n return [[g], g];\n }\n}\n\n// point\n// meanProportional\n// 6 points S0, S1, T0, T1, U0, U1\n// the point U' on U0U1 so that S:U' = U':T (geometric mean)\n// (Java: MeanProportional.java — 23 lines, line-for-line port)\nexport class MeanProportionalPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.meanProportional;\n signature: ConstructionSignature = { points: 6, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new MeanProportionalElement(P[0], P[1], P[2], P[3], P[4], P[5]);\n return [[g], g];\n }\n}\n\n// point\n// planeSlider\n// plane A integers x, y, z\n// a point that slides on the plane A with initial coordinates (x,y,z)\n// (Java: Slate.java point case 19 — new PlaneSlider((PlaneElement)E[0], N[0], N[1], N[2]).\n// PlaneSlider.ts already has the full constructor + update() + drag().)\nexport class PlaneSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.planeSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 3, elementTypes: [PlaneElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PlaneSlider(E[0] as PlaneElement, N[0], N[1], N[2]);\n return [[g], g];\n }\n}\n\n// point\n// sphereSlider\n// sphere A integers x, y, z\n// a point that slides on the sphere A with initial coordinates (x,y,z)\n// (Java: SphereSlider.java — 43 lines, line-for-line port)\nexport class SphereSliderConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.sphereSlider;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 3, elementTypes: [SphereElement] };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new SphereSliderElement(E[0] as SphereElement, N[0], N[1], N[2]);\n return [[g], g];\n }\n}\n\n// point\n// angleBisector — points B, A, C [, plane D = screen]\n// bisect angle BAC — the point on BC where the bisector from A meets BC\n// (Java: AngleDivider.java with n=2, Slate.java point case 21)\nexport class AngleBisectorPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.angleBisector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new AngleDividerElement(P[0], P[1], P[2], plane, 2);\n return [[g], g];\n }\n}\n\n// point\n// angleDivider — points B, A, C, integer n [, plane D = screen]\n// n-sect angle BAC — the point on BC where the 1/n ray from A meets BC\n// (Java: AngleDivider.java with variable n, Slate.java point case 22)\nexport class AngleDividerPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.angleDivider;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new AngleDividerElement(P[0], P[1], P[2], plane, N[0]);\n return [[g], g];\n }\n}\n\n// point\n// fixed\n// integers x, y [, z=0]\n// the fixed point with coordinates (x, y, z). z defaults to 0 if not provided.\n// (Java: Slate.java point case 23 — new FixedPoint(x,y,z))\nexport class FixedPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.fixed;\n signature: ConstructionSignature = { points: 0, elements: 0, integers: 2 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 0 && sp.E.length === 0 && (sp.N.length === 2 || sp.N.length === 3);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new FixedPoint({x:N[0], y:N[1], z: N.length > 2 ? N[2] : 0});\n return [[g], g];\n }\n}\n\n// point\n// lineSegmentSlider\n// points A, B, integers x, y, [z]\n// a point that slides along within the line segment AB with initial coordinates (x,y,z)\n// (Java: Slate.java point case 24 — new LineSlider(A,B,x,y,z,true))\nexport class LineSliderSegmentConstruction extends LineSliderConstruction {\n constructionMethod: AllConstructions = PointConstructions.lineSegmentSlider;\n protected createSlider(a: PointElement, b: PointElement, x: number, y: number, z: number) {\n return new LineSlider(a, b, x, y, z, true);\n }\n}\n\n\n// point\n// harmonic\n// points B, C, D\n// the harmonic conjugate of B with respect to C and D\n// (Java: Harmonic.java — 43 lines, line-for-line port.\n// Slate.java point case 25 — new Harmonic(P[0], P[1], P[2]))\nexport class HarmonicPointConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.harmonic;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new HarmonicElement(P[0], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// point\n// vertex\n// polygon A, integer n\n// the nth vertex (1-based) of polygon A\n// (Java: Slate.java point case 9 — returns ((PolygonElement)E[0]).V[n-1])\nexport class VertexConstruction extends Construction {\n constructionMethod: AllConstructions = PointConstructions.vertex;\n signature: ConstructionSignature = { points: 0, elements: 1, integers: 1, elementTypes: [PolygonElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const poly = E[0] as PolygonElement;\n const vertex = poly.V[N[0] - 1];\n return [[vertex], vertex];\n }\n}\n\nexport const pointConstructions: Construction[] = [\n new FreePointConstruction(),\n new FixedPointConstruction(),\n new FirstPointConstruction(),\n new LastPointConstruction(),\n new CircleCenterConstruction(),\n new CircumcenterConstruction(),\n new MidPointConstruction(),\n new IntersectionConstruction(),\n new FootPointConstruction(),\n new PlaneFootPointConstruction(),\n new ExtendConstruction(),\n new CutoffConstruction(),\n new ParallelogramConstruction(),\n new SimilarPointConstruction(),\n new ProportionPointConstruction(),\n new AngleBisectorPointConstruction(),\n new AngleDividerPointConstruction(),\n new MeanProportionalPointConstruction(),\n new PlaneSliderConstruction(),\n new SphereSliderConstruction(),\n new HarmonicPointConstruction(),\n new InvertPointConstruction(),\n new PlaneIntersectionConstruction(),\n new SphereCenterConstruction(),\n new CircumcircleConstruction(),\n new LineSliderConstruction(),\n new LineSliderSegmentConstruction(),\n new CircleSliderConstruction(),\n new PointPerpendicular1Construction(),\n new PointPerpendicular2Construction(),\n new PointPerpendicular3Construction(),\n new PointPerpendicular4Construction(),\n new PointPerpendicular5Construction(),\n new VertexConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPointElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {CircleElement} from \"../circle/CircleElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport interface IPointElementConstruction {\n x? : number;\n y? : number;\n z? : number;\n AP? : PlaneElement;\n}\n\nexport class PointElement extends GeomElement {\n\n protected _x : number;\n protected _y : number;\n protected _z : number;\n _AP : PlaneElement;\n\n constructor(ip? : IPointElementConstruction) {\n super();\n this.dimension = 0;\n this._x = ip && ip.x || 0;\n this._y = ip && ip.y || 0;\n this._z = ip && ip.z || 0;\n this._AP = ip && ip.AP || null;\n }\n\n get x() { return this._x }\n set x(value: number) { this._x = value }\n get y() { return this._y }\n set y(value: number) { this._y = value }\n get z() { return this._z }\n set z(value: number) { this._z = value }\n\n get AP() { return this._AP; }\n set AP(v : PlaneElement) { this._AP = v; }\n\n\n public defined() : boolean {\n return !isNaN(this._x) && !isNaN(this._y) && !isNaN(this._z)\n && this._x != null && true && this._y != null && true && this._z != null;\n }\n\n to(B : PointElement ) : PointElement {this._x = B._x; this._y = B._y; this._z= B._z; return this;}\n plus(B : PointElement ) : PointElement {this._x += B._x; this._y += B._y; this._z+= B._z; return this;}\n minus(B : PointElement) : PointElement {this._x -= B._x; this._y -= B._y; this._z-= B._z; return this;}\n times(a : number) : PointElement {this._x *= a; this._y *= a; this._z *= a; return this;}\n\n static difference(A : PointElement, B : PointElement) : PointElement {\n return new PointElement({x:A.x-B.x, y:A.y-B.y, z:A.z-B.z, AP: null});\n }\n\n static product(a : number, B : PointElement) : PointElement {\n return new PointElement({x:a*B.x, y:a*B.y, z:a*B.z, AP: null});\n }\n\n static dot(A : PointElement, B : PointElement) : number {\n return A.x * B.x + A.y * B.y + A.z * B.z;\n }\n\n public length2() : number {\n return this._x * this._x + this._y * this._y + this._z * this._z;\n }\n\n public length() : number {\n return Math.sqrt(this.length2());\n }\n\n public distance2(B : PointElement) : number {\n return (this._x-B.x)*(this._x-B.x) +\n (this._y-B.y)*(this._y-B.y) +\n (this._z-B.z)*(this._z-B.z);\n }\n\n public distance(B : PointElement) : number {\n return Math.sqrt(this.distance2(B));\n }\n\n public toCross(A : PointElement, B : PointElement) : PointElement {\n // set to the cross product of A and B\n this._x = A.y*B.z - A.z*B.y;\n this._y = A.z*B.x - A.x*B.z;\n this._z = A.x*B.y - A.y*B.x;\n return this;\n }\n\n public static cross(A: PointElement, B: PointElement) : PointElement {\n // return the cross product of A and B\n return new PointElement({x: A.y*B.z - A.z*B.y,\n y: A.z*B.x - A.x*B.z,\n z: A.x*B.y - A.y*B.x,\n AP: null});\n }\n\n public static triple(A: PointElement, B: PointElement, C: PointElement) : number {\n // return the triple product of A, B, and C\n return A.x*(B.y*C.z - B.z*C.y) +\n B.x*(C.y*A.z - C.z*A.y) +\n C.x*(A.y*B.z - A.z*B.y);\n }\n\n toLine(A: PointElement, B: PointElement, segment: boolean) : PointElement{\n /*---------------------------------------------------------------------+\n | Project this point to the foot of the perpendicular from it to the |\n | line determined by the points A and B. If A were the origin, then |\n | the foot would be at ((this dot B)/B^2) B. When segment is true |\n | and the foot is beyond A or B, then move the point to the closer |\n | of A and B. |\n +---------------------------------------------------------------------*/\n let V : PointElement = PointElement.difference(B,A);\n this.minus(A);\n let factor : number= PointElement.dot(V,this)/V.length2();\n if (segment) {\n if (factor < 0.0) factor = 0.0;\n else if (factor > 1.0) factor = 1.0;\n }\n V.times(factor);\n return this.to(V).plus(A);\n }\n\n\n public toPlane (P : PlaneElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Project this point to the foot of the perpendicular from it to the |\n | plane P. |\n +---------------------------------------------------------------------*/\n if (P.isScreen) {\n this._z = 0.0;\n } else {\n this.minus(P.A);\n let s : number = PointElement.dot(this, P.S);\n let t = PointElement.dot(this, P.T);\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n uptoPlane(P : PlaneElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Project this point to the point on the plane P where the vertical |\n | line through this meets P. |\n +---------------------------------------------------------------------*/\n if (P.isScreen) {\n this._z = 0.0;\n } else {\n this.minus(P.A);\n let den : number = P.S.x*P.T.y - P.S.y*P.T.x;\n let s : number = (this.x*P.T.y - this.y*P.T.x) / den;\n let t : number = (this.y*P.S.x - this.x*P.S.y) / den;\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n\n toCircumcenter (A: PointElement, B: PointElement, C: PointElement) : PointElement{\n /*---------------------------------------------------------------------+\n | Move this point to the center of the circle passing through the |\n | points A, B, and C. |\n +---------------------------------------------------------------------*/\n if (A.z == 0.0 && B.z == 0.0 && C.z == 0.0) {\n let u : number = ((A.x-B.x)*(A.x+B.x) + (A.y-B.y)*(A.y+B.y)) / 2.0;\n let v : number = ((B.x-C.x)*(B.x+C.x) + (B.y-C.y)*(B.y+C.y)) / 2.0;\n let den : number = (A.x-B.x)*(B.y-C.y) - (B.x-C.x)*(A.y-B.y);\n this._x = (u * (B.y-C.y) - v*(A.y-B.y)) / den;\n this._y = (v * (A.x-B.x) - u*(B.x-C.x)) / den;\n this._z = 0.0;\n } else {\n let BmA : PointElement = PointElement.difference(B,A)\n let CmA : PointElement = PointElement.difference(C,A);\n let BC : number = PointElement.dot(BmA,CmA);\n let B2 : number = BmA.length2();\n let C2 : number = CmA.length2();\n //double BC2 = BC*BC;\n let den : number = 2.0*(B2*C2-BC*BC);\n let s : number = C2*(B2-BC)/den;\n let t : number = B2*(C2-BC)/den;\n this.to(A).plus(BmA.times(s)).plus(CmA.times(t));\n }\n return this;\n }\n\n toCircle (C: CircleElement) : PointElement {\n /*---------------------------------------------------------------------+\n | Move this point to the nearest point on the circle C. |\n +---------------------------------------------------------------------*/\n if (C.AP.isScreen) {\n let factor : number = C.radius / this.distance(C.Center);\n this._x = C.Center.x + factor*(this._x - C.Center.x);\n this._y = C.Center.y + factor*(this._y - C.Center.y);\n this._z = 0.0;\n } else { // 3d case: project to plane of circle then move to sphere of circle\n this.toPlane(C.AP);\n this.toSphere(C.Center,C.radius);\n }\n return this;\n }\n\n toSphere (Center : PointElement, radius : number) : PointElement{\n /*---------------------------------------------------------------------+\n | Move this point to the nearest point on the sphere S. |\n +---------------------------------------------------------------------*/\n let factor : number = radius / this.distance(Center);\n this._x = Center.x + factor*(this._x - Center.x);\n this._y = Center.y + factor*(this._y - Center.y);\n this._z = Center.z + factor*(this._z - Center.z);\n return this;\n }\n\n public static area(A: PointElement, B: PointElement, C: PointElement) {\n // return the area of the triangle ABC\n let U : PointElement = PointElement.difference(B,A);\n let V : PointElement = PointElement.difference(C,A);\n return this.cross(U,V).length()/2.0;\n }\n\n public angle(B: PointElement, C: PointElement, P: PlaneElement) : number {\n // Determine the angle BAC in the plane P where this is A.\n // The angle lies between -pi and pi (-180 degrees and 180 degrees)\n let Bx : number = B.x - this._x, Cx = C.x - this._x;\n let By : number = B.y - this._y, Cy = C.y - this._y;\n if (P.isScreen) {\n return Math.atan2 (Bx*Cy - By*Cx, Bx*Cx + By*Cy);\n } else { // 3d case. First get P-coordinates for B and C\n let Bz : number = B.z -this._z, Cz = C.z -this._z;\n let Bs : number = Bx * P.S.x + By * P.S.y + Bz * P.S.z;\n let Bt : number = Bx * P.T.x + By * P.T.y + Bz * P.T.z;\n let Cs : number = Cx * P.S.x + Cy * P.S.y + Cz * P.S.z;\n let Ct : number = Cx * P.T.x + Cy * P.T.y + Cz * P.T.z;\n return Math.atan2(Bs * Ct - Bt * Cs, Bs * Cs + Bt * Ct);\n }\n }\n\n toIntersection (\n A: PointElement,\n B: PointElement,\n C: PointElement,\n D: PointElement,\n P: PlaneElement) : PointElement {\n if (P.isScreen) {\n // move this point to where the two lines AB and CD meet\n let d0 : number = A.x*B.y - A.y*B.x;\n let d1 : number = C.x*D.y - C.y*D.x;\n let den : number = (B.y-A.y)*(C.x-D.x) - (A.x-B.x)*(D.y-C.y);\n this._x = (d0*(C.x-D.x) - d1*(A.x-B.x)) / den;\n this._y = (d1*(B.y-A.y) - d0*(D.y-C.y)) / den;\n } else { // 3d case\n let AmA : PointElement = PointElement.difference(A,P.A);\n let BmA : PointElement = PointElement.difference(B,P.A);\n let CmA : PointElement = PointElement.difference(C,P.A);\n let DmA : PointElement = PointElement.difference(D,P.A);\n let Ax = PointElement.dot(AmA,P.S);\n let Ay = PointElement.dot(AmA,P.T);\n let Bx = PointElement.dot(BmA,P.S);\n let By = PointElement.dot(BmA,P.T);\n let Cx = PointElement.dot(CmA,P.S);\n let Cy = PointElement.dot(CmA,P.T);\n let Dx = PointElement.dot(DmA,P.S);\n let Dy = PointElement.dot(DmA,P.T);\n let d0 = Ax*By - Ay*Bx;\n let d1 = Cx*Dy - Cy*Dx;\n let den = (By-Ay)*(Cx-Dx) - (Ax-Bx)*(Dy-Cy);\n let s = (d0*(Cx-Dx) - d1*(Ax-Bx)) / den;\n let t = (d1*(By-Ay) - d0*(Dy-Cy)) / den;\n this.to(P.S).times(s).plus(PointElement.product(t,P.T)).plus(P.A);\n }\n return this;\n }\n\n toIntersectionPL (\n P: PlaneElement,\n D: PointElement,\n E: PointElement) : PointElement {\n // move this point to where the plane P meets the line DE\n this.to(E).minus(D);\n let DmA : PointElement = PointElement.difference(D,P.A);\n let u : number = -PointElement.triple(P.S,P.T,DmA)\n / PointElement.triple(P.S,P.T,this);\n return this.times(u).plus(D);\n }\n\n toInvertPoint (A: PointElement, C: CircleElement) : PointElement {\n // move this point to the inversion of the point A in the circle C\n let factor : number = C.radius2 / A.distance2(C.Center);\n return this.to(A).minus(C.Center).times(factor).plus(C.Center);\n }\n\n toSimilar (\n A: PointElement,\n B: PointElement,\n P : PlaneElement,\n D: PointElement,\n E: PointElement,\n F: PointElement,\n Q: PlaneElement) : PointElement {\n // move this point to the location C so that triangle ABC is similar\n // to triangle DEF.\n let theta : number = D.angle(E,F,Q);\n let co : number = Math.cos(theta), si : number = Math.sin(theta);\n let factor : number = D.distance(F) / D.distance(E);\n if (P.isScreen) {\n this._x = B.x;\n this._y = B.y;\n this.rotate(A,co,si,P);\n this._x = A.x + factor*(this._x - A.x);\n this._y = A.y + factor*(this._y - A.y);\n this._z = 0.0;\n } else {\n let BmA : PointElement = PointElement.difference(B,A);\n let s : number = PointElement.dot(BmA,P.S);\n let t : number = PointElement.dot(BmA,P.T);\n let ss : number = factor*(co*s - si*t);\n let tt : number = factor*(si*s + co*t);\n this._x = ss*P.S.x + tt*P.T.x + A.x;\n this._y = ss*P.S.y + tt*P.T.y + A.y;\n this._z = ss*P.S.z + tt*P.T.z + A.z;\n }\n return this;\n }\n\n public rotate ( pivot : PointElement,\n ac : number,\n as : number,\n plane?: PlaneElement) : void {\n /*--------------------------------------------------------------------------+\n | Scale and rotate this point around the axis through the pivot and\t\t|\n | perpendicular to the plane. Scale by a factor of a, and rotate by the\t|\n | angle theta where ac = a cos theta, and as = a sin theta.\t\t\t|\n +--------------------------------------------------------------------------*/\n if (plane == null) plane = pivot._AP;\n if (this == pivot) return;\n if (plane.isScreen) {\n let dx : number = this.x - pivot.x;\n let dy : number = this.y - pivot.y;\n this._x = pivot.x + ac*dx - as*dy;\n this._y = pivot.y + as*dx + ac*dy;\n } else {\n this.minus(pivot);\n let S : PointElement = plane.S;\n let T : PointElement = plane.T;\n let U : PointElement = plane.U;\n let s : number = PointElement.dot(this,S);\n let t : number = PointElement.dot(this,T);\n let z1 : number = PointElement.dot(this,U);\n let x1 : number = ac*s - as*t;\n let y1 : number = as*s + ac*t;\n this._x = pivot.x + x1*S.x + y1*T.x + z1*U.x;\n this._y = pivot.y + x1*S.y + y1*T.y + z1*U.y;\n this._z = pivot.z + x1*S.z + y1*T.z + z1*U.z;\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n this.drawString(Math.round(this.x), Math.round(this.y), c)\n }\n }\n\n public drawVertex(c: SlateCanvas, color?: string): void {\n if (!this.visible) return;\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.vertexHighlightColor;\n } else {\n color = this.vertexColor;\n }\n }\n if (color == null) return;\n // Radius interpolates by emphasisAmount: baseline 2 (normal) or\n // 4 (highlight) → 6 at full emphasis. drawProgress then scales\n // the result so A.Point.appear can pulse the marker in from 0.\n const baseR = this.shouldHighlight ? 4 : 2;\n let r = baseR + this.emphasisAmount * (6 - baseR);\n r *= this.drawProgress;\n if (r < 0.5) return; // avoid degenerate sub-pixel arcs\n ctx.beginPath();\n ctx.fillStyle = color;\n ctx.arc(this._x, this._y, r, 0, 2*Math.PI, false);\n ctx.fill();\n }\n\n\n public translate(dx: number, dy: number): void {\n this._x += dx;\n this._y += dy;\n }\n\n public update(): void {\n }\n\n public drawEdge(c: SlateCanvas): void {\n }\n\n public drawFace(c: SlateCanvas): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tProportionElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\n\nexport class ProportionElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Given lines S(S0,S1), T(T0,T1), U(U0,U1), V(V0,V1), cut off from |\n | V a fourth proportional V' so that S:T = U:V'. |\n +--------------------------------------------------------------------*/\n\n private _S0: PointElement;\n private _S1: PointElement;\n private _T0: PointElement;\n private _T1: PointElement;\n private _U0: PointElement;\n private _U1: PointElement;\n private _V0: PointElement;\n private _V1: PointElement;\n\n constructor(S0: PointElement, S1: PointElement, T0: PointElement,\n T1: PointElement, U0: PointElement, U1: PointElement,\n V0: PointElement, V1: PointElement) {\n super();\n this.dimension = 0;\n this._S0 = S0; this._S1 = S1;\n this._T0 = T0; this._T1 = T1;\n this._U0 = U0; this._U1 = U1;\n this._V0 = V0; this._V1 = V1;\n if (V0._AP === V1._AP) {\n this._AP = V0._AP;\n }\n }\n\n public update() {\n let factor : number = this._T0.distance2(this._T1) * this._U0.distance2(this._U1)\n / (this._S0.distance2(this._S1) * this._V0.distance2(this._V1));\n factor = Math.sqrt(factor);\n this.to(this._V1).minus(this._V0);\n this.times(factor).plus(this._V0);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSimilarElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class SimilarElement extends PointElement {\n /*--------------------------------------------------------------------+\n | Construct a triangle AB(this) in the plane AP similar to the |\n | triangle DEF in the plane Q. |\n +--------------------------------------------------------------------*/\n\n private _parentA: PointElement;\n private _parentB: PointElement;\n private _D: PointElement;\n private _E: PointElement;\n private _F: PointElement;\n private _Q: PlaneElement;\n\n constructor(A: PointElement, B: PointElement, AP: PlaneElement,\n D: PointElement, E: PointElement, F: PointElement,\n Q: PlaneElement) {\n super();\n this.dimension = 0;\n this._parentA = A;\n this._parentB = B;\n this._AP = AP;\n this._D = D;\n this._E = E;\n this._F = F;\n this._Q = Q;\n }\n\n public update() {\n this.toSimilar(this._parentA, this._parentB, this._AP,\n this._D, this._E, this._F, this._Q);\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tSphereSliderElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PointElement} from \"./PointElement\";\nimport {SphereElement} from \"../sphere/SphereElement\";\n\nexport class SphereSliderElement extends PointElement {\n\n private _S: SphereElement;\n private _initx: number;\n private _inity: number;\n private _initz: number;\n\n constructor(S: SphereElement, x: number, y: number, z: number) {\n super();\n this.dimension = 0;\n this.draggable = true;\n this._S = S;\n this._x = this._initx = x;\n this._y = this._inity = y;\n this._z = this._initz = z;\n }\n\n public reset() {\n this._x = this._initx;\n this._y = this._inity;\n this._z = this._initz;\n this.toSphere(this._S.Center, this._S.radius());\n }\n\n public update() {\n this.toSphere(this._S.Center, this._S.radius());\n }\n\n public drag(tox: number, toy: number): boolean {\n let dist2 = (this._S.Center.x - tox) * (this._S.Center.x - tox)\n + (this._S.Center.y - toy) * (this._S.Center.y - toy);\n let r2 = this._S.radius2();\n if (dist2 <= r2) {\n this._x = tox;\n this._y = toy;\n if (this._z > this._S.Center.z)\n this._z = this._S.Center.z + Math.sqrt(r2 - dist2);\n else\n this._z = this._S.Center.z - Math.sqrt(r2 - dist2);\n } else {\n // beyond shadow of sphere\n tox -= this._S.Center.x;\n toy -= this._S.Center.y;\n let factor = Math.sqrt((tox * tox + toy * toy) / r2);\n tox = tox / factor + this._S.Center.x;\n toy = toy / factor + this._S.Center.y;\n if ((tox - this._x) * (tox - this._x) + (toy - this._y) * (toy - this._y) < 0.5)\n return false;\n this._x = tox;\n this._y = toy;\n this._z = this._S.Center.z;\n }\n return true;\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tApplicationElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolygonElement} from \"./PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class ApplicationElement extends PolygonElement {\n /*--------------------------------------------------------------------+\n | Apply a polygon P to get a parallelogram |\n | with a side AB in an angle CAB |\n +--------------------------------------------------------------------*/\n\n private _P: PolygonElement;\n private _C: PointElement;\n\n constructor(P: PolygonElement, A: PointElement, B: PointElement, C: PointElement) {\n super();\n this.dimension = 2;\n this._P = P;\n this._C = C;\n this.V = new Array(4);\n this.V[0] = A;\n this.V[1] = B;\n this.V[2] = new PointElement();\n this.V[3] = new PointElement();\n if (A._AP === B._AP && A._AP === C._AP) {\n this.V[2]._AP = A._AP;\n this.V[3]._AP = A._AP;\n }\n }\n\n public translate(dx: number, dy: number) {\n this.V[2].translate(dx, dy);\n this.V[3].translate(dx, dy);\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n this.V[2].rotate(pivot, ac, as);\n this.V[3].rotate(pivot, ac, as);\n }\n\n public update() {\n let factor : number = this._P.area() / (2.0 * PointElement.area(this.V[0], this.V[1], this._C));\n factor = Math.abs(factor);\n this.V[3].x = this.V[0].x + factor * (this._C.x - this.V[0].x);\n this.V[3].y = this.V[0].y + factor * (this._C.y - this.V[0].y);\n this.V[3].z = this.V[0].z + factor * (this._C.z - this.V[0].z);\n this.V[2].x = this.V[1].x + this.V[3].x - this.V[0].x;\n this.V[2].y = this.V[1].y + this.V[3].y - this.V[0].y;\n this.V[2].z = this.V[1].z + this.V[3].z - this.V[0].z;\n }\n}\n","// Animations targeting PolygonElement. See ../Animations.ts for the\n// abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {PolygonElement} from \"./PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\n// Default per-edge trace rate matches LineAnimations so a polygon's\n// edges feel like the same instrument tracing each side in turn.\nconst DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS = 0.25;\nconst DEFAULT_POLYGON_FILL_MS = 500;\n\n// Total perimeter (closed if V.length > 2, otherwise open) — used to\n// compute the outline duration from edge rate.\nfunction perimeter(poly: PolygonElement): number {\n const n = poly.V.length;\n if (n < 2) return 0;\n let total = 0;\n const closed = n > 2;\n const edgeCount = closed ? n : n - 1;\n for (let i = 0; i < edgeCount; i++) {\n const a = poly.V[i];\n const b = poly.V[(i + 1) % n];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n total += Math.sqrt(dx * dx + dy * dy);\n }\n return total;\n}\n\n// A.Polygon.outline — cascade-trace each edge in V[] order.\n// PolygonElement.drawEdge already partitions drawProgress over edges\n// so a single step driving drawProgress 0 → 1 traces every edge in\n// sequence with the right per-edge proportion.\nexport class PolygonOutlineAnimation extends Animation {\n public animationMethod = AllAnimations.POLYGON_OUTLINE;\n public name = \"Polygon.outline\";\n public elementType = PolygonElement;\n public defaultRate = DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const poly = target as PolygonElement;\n const durationMs = Math.max(180, perimeter(poly) / this.defaultRate);\n return [{\n durationMs,\n tick: (progress) => { poly.drawProgress = progress; },\n finalise: () => {\n poly.drawProgress = 1;\n poly.visible = true;\n },\n }];\n }\n}\n\n// A.Polygon.outlineAndFill — strict sequence: outline-trace step\n// completes first, then a separate fill-fade step. PolygonElement\n// now has two independent fields driving this — drawProgress for the\n// edge trace (consumed by drawEdge) and faceAlpha for the fill\n// (consumed by drawFace). The outline step finalises drawProgress to\n// 1 (full edges) before the fill step starts ticking faceAlpha\n// 0 → 1; the edges remain stable at full while the face fades in.\n//\n// The fade duration is intentionally shorter than the outline trace\n// — the eye has already absorbed the polygon's shape from the trace,\n// so the fill should land quickly. v1: half the outline's runtime,\n// capped by defaultDurationMs.\nexport class PolygonOutlineAndFillAnimation extends Animation {\n public animationMethod = AllAnimations.POLYGON_OUTLINE_AND_FILL;\n public name = \"Polygon.outlineAndFill\";\n public elementType = PolygonElement;\n public defaultRate = DEFAULT_POLYGON_EDGE_RATE_PX_PER_MS;\n public defaultDurationMs = DEFAULT_POLYGON_FILL_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const poly = target as PolygonElement;\n const outlineMs = Math.max(180, perimeter(poly) / this.defaultRate);\n const fullRestore = () => {\n poly.faceAlpha = 1;\n poly.drawProgress = 1;\n poly.visible = true;\n };\n // Step 1 — outline trace.\n const outline: IAnimationStep = {\n durationMs: outlineMs,\n setup: () => {\n poly.drawProgress = 0;\n poly.faceAlpha = 0; // hide fill until step 2\n },\n tick: (progress) => { poly.drawProgress = progress; },\n finalise: () => { poly.drawProgress = 1; },\n };\n // A face-less polygon has nothing to fade — scheduling the\n // fill step anyway would be pure dead time in the middle of\n // a cascade (#81). Run the outline alone, with its finalise\n // doing the full restore.\n if (poly.faceColor == null) {\n outline.finalise = fullRestore;\n return [outline];\n }\n // Fill ~twice as fast as the outline, capped at the\n // class-level default so a giant polygon doesn't yield a\n // glacial fade.\n const fillMs = Math.min(outlineMs / 2, this.defaultDurationMs);\n return [\n outline,\n // Step 2 — face fade-in over the already-traced outline.\n {\n durationMs: fillMs,\n tick: (progress) => { poly.faceAlpha = progress; },\n finalise: fullRestore,\n },\n ];\n }\n}\n\n// A.Polygon.superpose — Euclid's superposition (I.4): an ephemeral\n// gold-outline ghost copy of the target lifts off, translates so its\n// vertex 0 lands on the `onto` polygon's vertex 0, rotates about the\n// landing point to lay side 0→1 onto the target side 0→1 (carrying\n// the remaining vertices with it), holds a beat coinciding, then\n// retraces both motions home. The real polygon never moves — the\n// ephemeral system owns the moving copy and its cleanup.\n//\n// Args: { onto: string } — the polygon to superpose onto. Must\n// resolve to a PolygonElement with the same vertex count; anything\n// else warns and falls through to an instant no-op.\nconst SUPERPOSE_TRANSLATE_RATE_PX_PER_MS = 0.25;\nconst SUPERPOSE_ROTATE_RATE_RAD_PER_MS = 0.003;\nconst SUPERPOSE_MIN_STEP_MS = 250;\nconst SUPERPOSE_HOLD_MS = 800;\nconst GHOST_COLOR = \"#FFD700\";\n\nexport class PolygonSuperposeAnimation extends Animation {\n public animationMethod = AllAnimations.POLYGON_SUPERPOSE;\n public name = \"Polygon.superpose\";\n public elementType = PolygonElement;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const poly = target as PolygonElement;\n const ontoName = args && args.onto;\n const onto = ontoName != null ? slate.lookupElement(String(ontoName)) : null;\n if (!(onto instanceof PolygonElement) || onto.V.length !== poly.V.length) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[geomlib] Polygon.superpose: args.onto ('\"\n + ontoName + \"') is not a polygon with \"\n + poly.V.length + \" vertices — skipping\");\n }\n return [{\n durationMs: 0,\n tick: () => {},\n finalise: () => {\n poly.drawProgress = 1;\n poly.visible = true;\n },\n }];\n }\n\n // Source coordinates are captured at setup time (not build\n // time) so the ghost reflects any drags that happened between\n // slide construction and this step actually starting.\n const n = poly.V.length;\n let src: Array<{x: number, y: number}> = [];\n let dx = 0, dy = 0; // translate delta: V[0] → onto.V[0]\n let theta = 0; // rotation about the landing point\n const ghostPts: PointElement[] = [];\n const ghost = new PolygonElement();\n ghost.edgeColor = GHOST_COLOR;\n ghost.faceColor = null;\n ghost.nameColor = null;\n ghost.vertexColor = null;\n\n const setGhost = (coords: Array<{x: number, y: number}>) => {\n for (let i = 0; i < n; i++) {\n ghostPts[i].x = coords[i].x;\n ghostPts[i].y = coords[i].y;\n }\n };\n const translated = (t: number) =>\n src.map(p => ({ x: p.x + dx * t, y: p.y + dy * t }));\n // Rotate the fully-translated coords about the landing point\n // (onto.V[0]) by angle · t.\n const rotated = (t: number) => {\n const cx = onto.V[0].x, cy = onto.V[0].y;\n const cos = Math.cos(theta * t), sin = Math.sin(theta * t);\n return translated(1).map(p => ({\n x: cx + (p.x - cx) * cos - (p.y - cy) * sin,\n y: cy + (p.x - cx) * sin + (p.y - cy) * cos,\n }));\n };\n\n // Durations are estimated from build-time geometry; the exact\n // path re-derives from setup-time coords so a stale estimate\n // only affects pacing, never correctness.\n const estDist = Math.hypot(onto.V[0].x - poly.V[0].x, onto.V[0].y - poly.V[0].y);\n const translateMs = Math.max(SUPERPOSE_MIN_STEP_MS,\n estDist / SUPERPOSE_TRANSLATE_RATE_PX_PER_MS);\n const estTheta = Math.abs(this._sideAngleDelta(poly, onto));\n const rotateMs = Math.max(SUPERPOSE_MIN_STEP_MS,\n estTheta / SUPERPOSE_ROTATE_RATE_RAD_PER_MS);\n\n return [\n // ① glide: vertex 0 travels to onto's vertex 0.\n {\n durationMs: translateMs,\n setup: () => {\n // Superpose is not a reveal — the real polygon is\n // already on stage and must stay fully drawn while\n // its ghost travels. Undo the animator's reveal-\n // convention pre-zeroing.\n poly.drawProgress = 1;\n poly.visible = true;\n src = poly.V.map(p => ({ x: p.x, y: p.y }));\n dx = onto.V[0].x - src[0].x;\n dy = onto.V[0].y - src[0].y;\n theta = this._sideAngleDelta(poly, onto);\n for (let i = 0; i < n; i++) {\n const gp = new PointElement();\n gp.x = src[i].x;\n gp.y = src[i].y;\n ghostPts.push(gp);\n ghost.V.push(gp);\n }\n slate.addEphemeral(ghost);\n },\n tick: (p) => { setGhost(translated(p)); },\n finalise: () => { setGhost(translated(1)); },\n },\n // ② rotate about the landing point: side 0→1 lays onto\n // the target's side 0→1.\n {\n durationMs: rotateMs,\n tick: (p) => { setGhost(rotated(p)); },\n finalise: () => { setGhost(rotated(1)); },\n },\n // ③ hold, coinciding.\n {\n durationMs: SUPERPOSE_HOLD_MS,\n tick: () => {},\n finalise: () => {},\n },\n // ④ rotate home.\n {\n durationMs: rotateMs,\n tick: (p) => { setGhost(rotated(1 - p)); },\n finalise: () => { setGhost(translated(1)); },\n },\n // ⑤ glide home; the ghost's work is done.\n {\n durationMs: translateMs,\n tick: (p) => { setGhost(translated(1 - p)); },\n finalise: () => {\n slate.removeEphemeral(ghost);\n poly.drawProgress = 1;\n poly.visible = true;\n },\n },\n ];\n }\n\n // Angle that carries the source side V[0]→V[1] onto the target\n // side, normalized to [-π, π] so the ghost takes the short way.\n private _sideAngleDelta(from: PolygonElement, onto: PolygonElement): number {\n const a = Math.atan2(from.V[1].y - from.V[0].y, from.V[1].x - from.V[0].x);\n const b = Math.atan2(onto.V[1].y - onto.V[0].y, onto.V[1].x - onto.V[0].x);\n let d = b - a;\n while (d > Math.PI) d -= 2 * Math.PI;\n while (d < -Math.PI) d += 2 * Math.PI;\n return d;\n }\n}\n\nregisterAnimation(new PolygonOutlineAnimation());\nregisterAnimation(new PolygonOutlineAndFillAnimation());\nregisterAnimation(new PolygonSuperposeAnimation());\n","/*----------------------------------------------------------------------+\n| Polygon construction classes — extracted from Constructions.ts |\n| Each class maps a (type, constructionName, signature) triple to |\n| a construct() method that creates the geometry element. |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n PolygonConstructions as PolygonConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {SimilarElement} from \"../point/SimilarElement\";\nimport {PolygonElement} from \"./PolygonElement\";\nimport {RegularPolygonElement} from \"./RegularPolygonElement\";\nimport {ApplicationElement} from \"./ApplicationElement\";\nimport {PolyhedronElement} from \"../polyhedron/PolyhedronElement\";\n\n/*************************\n * Element Class Polygon *\n *************************/\n\nexport abstract class PolyConstruction extends Construction {\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new PolygonElement(P);\n return [[g],g];\n }\n}\n\n// polygon\n// square — points A, B [, plane C = screen]\n// the square on a side AB in plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: RegularPolygon.java with n=4 — same class as equilateralTriangle)\nexport class SquarePolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.square;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, 4);\n return [[g], g];\n }\n}\n\n// polygon\n// triangle\n// points A, B, C\n// the triangle ABC given 3 vertices A, B, and C\n// (Java: Slate.java polygon case 1 — new PolygonElement(A,B,C))\nexport class TrianglePolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.triangle;\n signature = { points: 3, elements: 0, integers: 0 };\n}\n\n// polygon\n// quadrilateral\n// points A, B, C, D\n// the quadrilateral ABCD given 4 vertices A, B, C, and D\n// (Java: Slate.java polygon case 2 — new PolygonElement(A,B,C,D))\nexport class QuadrilateralPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.quadrilateral;\n signature = { points: 4, elements: 0, integers: 0 };\n}\n\n// polygon\n// pentagon\n// points A, B, C, D, E\n// the pentagon given 5 vertices (free points, not a regular pentagon)\n// (Java: Slate.java polygon case 3 — new PolygonElement(A,B,C,D,E))\nexport class PentagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.pentagon;\n signature = { points: 5, elements: 0, integers: 0 };\n}\n\n// polygon\n// hexagon\n// points A, B, C, D, E, F\n// the hexagon given 6 vertices (free points)\n// (Java: Slate.java polygon case 4 — new PolygonElement(A,B,C,D,E,F))\nexport class HexagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.hexagon;\n signature = { points: 6, elements: 0, integers: 0 };\n}\n\n// polygon\n// equilateralTriangle — points A, B [, plane C = screen]\n// the equilateral triangle on side AB in the plane C\n// 2D: 2 points, 0 elements — uses screen plane\n// 3D: 2 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java polygon case 5 — new RegularPolygon(A,B,plane,3))\nexport class EquilateralTriangleConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.equilateralTriangle;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, 3);\n return [[g], g];\n }\n}\n\n// polygon\n// parallelogram\n// points A, B, C\n// the parallelogram ABCD given A, B, and C, where D = A + (C - B)\n// (no dedicated Java class — Slate.java case 6 dispatches to a Layoff\n// trick identical to the point;parallelogram and line;parallel patterns)\nexport class ParallelogramPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.parallelogram;\n signature = { points: 3, elements: 0, integers: 0 };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let lo = new Layoff(P[0], P[1], P[2], P[1], P[2]);\n let g = new PolygonElement([P[0], P[1], P[2], lo]);\n return [[lo, g], g];\n }\n}\n\n// polygon\n// regularPolygon — points A, B, integer n [, plane C = screen]\n// the regular n-gon on side AB in the plane C\n// 2D: 2 points, 0 elements, 1 integer — uses screen plane\n// 3D: 2 points, 1 PlaneElement, 1 integer — uses explicit plane\n// (Java: Slate.java polygon case 7 — RegularPolygon(A,B,plane,n))\nexport class RegularPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.regularPolygon;\n signature: ConstructionSignature = { points: 2, elements: 0, integers: 1 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 2 && sp.N.length === 1\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const plane = E.length > 0 ? E[0] as PlaneElement : screen;\n const g = new RegularPolygonElement(P[0], P[1], plane, N[0]);\n return [[g], g];\n }\n}\n\n// polygon\n// starPolygon (2D variant)\n// points A, B, integers n, d\n// the star polygon {n/d} on side AB in the screen plane\n// (Java: Slate.java polygon case 8 — new RegularPolygon(A,B,screen,n,d))\nexport class StarPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.starPolygon;\n signature = { points: 2, elements: 0, integers: 2 };\n\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new RegularPolygonElement(P[0], P[1], screen, N[0], N[1]);\n return [[g], g];\n }\n}\n\n\n// polygon\n// similar — points A, B, D, E, F [, planes C, G = screen]\n// the triangle ABH where H is the similar point so triangle ABH ~ triangle DEF\n// 2D: 5 points, 0 elements — uses screen plane for both\n// 3D: 5 points, 2 PlaneElements — uses explicit planes\n// (Java: Slate.java polygon case 9 — Similar(A,B,C,D,E,F,G) + PolygonElement(A,B,H))\nexport class SimilarPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.similar;\n signature: ConstructionSignature = { points: 5, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 5 && sp.N.length === 0\n && (sp.E.length === 0 || sp.E.length === 2);\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let c = E.length > 0 ? E[0] as PlaneElement : screen;\n let g2 = E.length > 1 ? E[1] as PlaneElement : screen;\n let sim = new SimilarElement(P[0], P[1], c, P[2], P[3], P[4], g2);\n let g = new PolygonElement([P[0], P[1], sim]);\n return [[sim, g], g];\n }\n}\n\n// polygon\n// application\n// polygon A points B, C, D\n// the parallelogram equal to the given polygon A with one side BC and one angle BCD\n// (Java: Application.java — parallelogram with area = P.area(), side BC, angle DCB)\nexport class ApplicationPolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.application;\n signature = { points: 3, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n\n construct(screen : PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new ApplicationElement(E[0] as PolygonElement, P[0], P[1], P[2]);\n return [[g], g];\n }\n}\n\n// polygon\n// octagon\n// 8 points A, B, C, D, E, F, G, H\n// the octagon given 8 vertices (free points, pass-through)\n// (Java: Slate.java polygon case 11 — new PolygonElement(A,B,C,D,E,F,G,H))\nexport class OctagonPolygonConstruction extends PolyConstruction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.octagon;\n signature = { points: 8, elements: 0, integers: 0 };\n}\n\n// polygon\n// face\n// polyhedron A integer n\n// the nth face (1-based) of polyhedron A\n// (Java: Slate.java polygon case 12 — ((PolyhedronElement)E[0]).P[N[0]-1])\n// Same pattern as point;vertex (returns polygon from polyhedron, not point from polygon)\nexport class FacePolygonConstruction extends Construction {\n constructionMethod: AllConstructions = PolygonConstructionsEnum.face;\n signature = { points: 0, elements: 1, integers: 1, elementTypes: [PolyhedronElement] };\n\n construct(_screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const polyhedron = E[0] as PolyhedronElement;\n const face = polyhedron.P[N[0] - 1];\n return [[face], face];\n }\n}\n\nexport const polygonConstructions: Construction[] = [\n new TrianglePolygonConstruction(),\n new StarPolygonConstruction(),\n new RegularPolygonConstruction(),\n new SquarePolygonConstruction(),\n new EquilateralTriangleConstruction(),\n new ParallelogramPolygonConstruction(),\n new QuadrilateralPolygonConstruction(),\n new OctagonPolygonConstruction(),\n new PentagonPolygonConstruction(),\n new HexagonPolygonConstruction(),\n new SimilarPolygonConstruction(),\n new ApplicationPolygonConstruction(),\n new FacePolygonConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tLineElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\n\nimport {PointElement} from \"../point/PointElement\";\nimport {GeomElement} from \"../GeomElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport class PolygonElement extends GeomElement {\n\n public V : PointElement[];\n\n // Face fill alpha — drives drawFace's globalAlpha independent of\n // drawProgress (which drives the edge trace). Lets an animation\n // run the outline to completion at drawProgress = 1 first, then\n // separately fade the fill in by ticking faceAlpha 0 → 1. Default\n // 1 means \"fully opaque\" — every existing render path behaves\n // identically.\n private _faceAlpha : number = 1;\n\n set faceAlpha(value: number) {\n this._faceAlpha = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n get faceAlpha(): number { return this._faceAlpha; }\n\n constructor(ps?: PointElement[]) {\n super();\n this.dimension = 2;\n if (ps == null) {\n this.V = [];\n return;\n }\n this.V = ps;\n }\n\n public area() : number {\n // Ported from PolygonElement.java area() — 2026-04-12\n // Compute the area of this polygon (assuming it's planar & convex).\n // Uses fan triangulation from V[0].\n let sum = 0.0;\n for (let i = 0; i < this.V.length - 2; ++i) {\n sum += PointElement.area(this.V[0], this.V[i + 1], this.V[i + 2]);\n }\n return sum;\n }\n\n public drawEdge(c: HTMLCanvasElement, color?: string): void {\n if (!this.visible) return;\n if (color == null) {\n if (this.emphasized || this.shouldHighlight) {\n color = this.edgeHighlightColor;\n } else {\n color = this.edgeColor;\n }\n }\n\n if (color == null) return;\n if (this.V.length <= 1) return;\n\n let ctx = c.getContext(\"2d\");\n ctx.beginPath();\n ctx.strokeStyle = color;\n {\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n }\n // Edge enumeration: a closed polygon (>2 verts) has V.length\n // edges including the closing one; an open polyline has\n // V.length - 1. Each integer step of drawProgress · edgeCount\n // advances one full edge; the fractional remainder partially\n // traces the next. drawProgress = 1 (default) reproduces the\n // pre-animation full-trace behaviour bit-for-bit.\n let n = this.V.length;\n let isClosed = n > 2;\n let edgeCount = isClosed ? n : n - 1;\n let p = this.drawProgress;\n let totalProgress = p * edgeCount;\n let fullEdges = Math.floor(totalProgress);\n let fractionalEdge = totalProgress - fullEdges;\n\n ctx.moveTo(this.V[0].x, this.V[0].y);\n for (let i = 0; i < fullEdges; i++) {\n let to = this.V[(i + 1) % n];\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n }\n if (fractionalEdge > 0 && fullEdges < edgeCount) {\n let from = this.V[fullEdges];\n let to = this.V[(fullEdges + 1) % n];\n let px = from.x + (to.x - from.x) * fractionalEdge;\n let py = from.y + (to.y - from.y) * fractionalEdge;\n ctx.lineTo(px, py);\n ctx.stroke();\n }\n }\n\n public defined() : boolean {\n if (this.V.length == 0) return false;\n for(let v of this.V) {\n if (!v.defined()) return false;\n }\n return true;\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if(this.faceColor != null && this.defined() && this.V.length > 2) {\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.beginPath();\n ctx.fillStyle = this.faceColor;\n let firstPoint = this.V[0];\n let rest = this.V.slice(1);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n for(let vertex of rest)\n ctx.lineTo(vertex.x, vertex.y);\n ctx.closePath();\n // Animate the fill via the dedicated faceAlpha field so\n // outline-then-fill animations can run the edge trace to\n // completion at drawProgress = 1 first, then independently\n // tick faceAlpha from 0 to 1 for the fade-in. Default\n // faceAlpha = 1 preserves the fully-opaque behaviour for\n // every consumer that doesn't animate.\n let a = this.faceAlpha;\n if (a < 1) {\n if (a <= 0) return; // fully transparent — skip\n ctx.save();\n ctx.globalAlpha = a;\n ctx.fill();\n ctx.restore();\n } else {\n ctx.fill();\n }\n }\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n let x : number = 0;\n let y : number = 0;\n for(let v of this.V) {\n x += v.x;\n y += v.y;\n }\n let n : number = this.V.length;\n x = x / n;\n y = y / n;\n let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n let [w, h] = this._getTextMetrics(ctx, this._name);\n ctx.beginPath();\n ctx.fillStyle = this.nameColor;\n ctx.fillText(this._name, x - w/2., y + h/4.);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor != null && this.defined() ) {\n for(let v of this.V) {\n v.drawVertex(c, this.vertexColor);\n }\n }\n }\n\n public rotate(pivot: PointElement, ac: number, as: number): void {\n }\n\n public translate(dx: number, dy: number): void {\n }\n\n public update(): void {\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tRegularPolygonElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolygonElement} from \"./PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport class RegularPolygonElement extends PolygonElement {\n\n private _cos: number;\n private _sin: number;\n private _P: PlaneElement;\n\n constructor(A: PointElement, B: PointElement, plane: PlaneElement, n: number, d: number = 1) {\n super();\n this._P = plane;\n const theta = Math.PI * d * (n - 2) / n;\n this._cos = Math.cos(theta);\n this._sin = Math.sin(theta);\n this.V = new Array(n);\n this.V[0] = A;\n this.V[1] = B;\n for (let i = 2; i < n; i++) {\n this.V[i] = new PointElement({ AP: plane });\n }\n }\n\n update(): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].to(this.V[i - 2]);\n this.V[i].rotate(this.V[i - 1], this._cos, this._sin, this._P);\n }\n }\n\n translate(dx: number, dy: number): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].translate(dx, dy);\n }\n }\n\n rotate(pivot: PointElement, ac: number, as: number): void {\n for (let i = 2; i < this.V.length; i++) {\n this.V[i].rotate(pivot, ac, as, this._P);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Polyhedron construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n PolyhedraConstructions as PolyhedraConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {Layoff} from \"../point/Layoff\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PyramidElement} from \"./PyramidElement\";\nimport {PrismElement} from \"./PrismElement\";\n\n// polyhedron — tetrahedron — points A, B, C, D\n// (Java: Slate.java polyhedron case 0 — PolygonElement(A,B,C) + Pyramid(base,D))\nexport class TetrahedronConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.tetrahedron;\n signature = { points: 4, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let base = new PolygonElement([P[0], P[1], P[2]]);\n let g = new PyramidElement(base, P[3]);\n return [[base, g], g];\n }\n}\n\n// polyhedron — parallelepiped — points A, B, C, D\n// (Java: Slate.java polyhedron case 1 — Layoff(B,A,C,A,C) + PolygonElement(B,A,C,fourth) + Prism(base,A,D))\nexport class ParallelepipedConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.parallelepiped;\n signature = { points: 4, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let fourth = new Layoff(P[1], P[0], P[2], P[0], P[2]);\n let base = new PolygonElement([P[1], P[0], P[2], fourth]);\n let g = new PrismElement(base, P[0], P[3]);\n return [[fourth, base, g], g];\n }\n}\n\n// polyhedron — prism — polygon A, points B, C\n// (Java: Prism.java — 41 lines, line-for-line port)\nexport class PrismConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.prism;\n signature = { points: 2, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PrismElement(E[0] as PolygonElement, P[0], P[1]);\n return [[g], g];\n }\n}\n\n// polyhedron — pyramid — polygon A, point B\n// (Java: Pyramid.java — 11 lines, line-for-line port)\nexport class PyramidConstruction extends Construction {\n constructionMethod: AllConstructions = PolyhedraConstructionsEnum.pyramid;\n signature = { points: 1, elements: 1, integers: 0, elementTypes: [PolygonElement] };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n const g = new PyramidElement(E[0] as PolygonElement, P[0]);\n return [[g], g];\n }\n}\n\nexport const polyhedronConstructions: Construction[] = [\n new TetrahedronConstruction(),\n new ParallelepipedConstruction(),\n new PrismConstruction(),\n new PyramidConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tPolyhedronElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport class PolyhedronElement extends GeomElement {\n\n public P: PolygonElement[]; // array of face polygons\n\n constructor() {\n super();\n this.dimension = 2;\n this.P = [];\n }\n\n public defined(): boolean {\n for (let i = 0; i < this.P.length; ++i) {\n if (!this.P[i].defined()) return false;\n }\n return true;\n }\n\n public drawName(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.nameColor != null && this.name != null && this.defined()) {\n let x = 0, y = 0, ct = 0;\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n x += this.P[j].V[i].x;\n y += this.P[j].V[i].y;\n ++ct;\n }\n }\n x /= ct;\n y /= ct;\n this.drawString(Math.round(x), Math.round(y), c);\n }\n }\n\n public drawVertex(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.vertexColor != null && this.defined()) {\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n this.P[j].V[i].drawVertex(c, this.vertexColor);\n }\n }\n }\n }\n\n public drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.edgeColor != null && this.defined()) {\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.edgeColor;\n for (let j = 0; j < this.P.length; ++j) {\n for (let i = 0; i < this.P[j].V.length; ++i) {\n let a = this.P[j].V[i];\n let b = this.P[j].V[(i + 1) % this.P[j].V.length];\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n }\n }\n }\n }\n\n public drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor != null && this.defined()) {\n for (let j = 0; j < this.P.length; ++j) {\n // Pass the polyhedron's faceColor to each face polygon,\n // matching Java's P[j].drawFace(g, faceColor)\n let savedColor = this.P[j].faceColor;\n this.P[j].faceColor = this.faceColor;\n this.P[j].drawFace(c);\n this.P[j].faceColor = savedColor;\n }\n }\n }\n\n public update(): void {}\n public translate(dx: number, dy: number): void {}\n public rotate(pivot: PointElement, ac: number, as: number): void {}\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPrismElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolyhedronElement} from \"./PolyhedronElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class PrismElement extends PolyhedronElement {\n\n // The base is given as well as a line segment CD for the sides to be\n // parallel to.\n\n private _C: PointElement;\n private _D: PointElement;\n\n constructor(Base: PolygonElement, C: PointElement, D: PointElement) {\n super();\n this.dimension = 2;\n this._C = C;\n this._D = D;\n let baseN = Base.V.length;\n let n = 2 + baseN;\n this.P = new Array(n);\n this.P[0] = Base;\n // create the top — vertices translated by (D-C) from base\n let topVerts : PointElement[] = new Array(baseN);\n for (let j = 0; j < baseN; ++j) {\n topVerts[j] = new PointElement();\n topVerts[j].to(Base.V[j]).plus(D).minus(C);\n }\n this.P[1] = new PolygonElement(topVerts);\n // create the sides — quadrilaterals connecting base and top edges\n for (let i = 2; i < n; ++i) {\n this.P[i] = new PolygonElement([\n Base.V[i - 2],\n Base.V[(i - 1) % baseN],\n this.P[1].V[(i - 1) % baseN],\n this.P[1].V[i - 2]\n ]);\n }\n }\n\n public translate(dx: number, dy: number) {\n for (let i = 0; i < this.P[1].V.length; ++i) {\n this.P[1].V[i].translate(dx, dy);\n }\n }\n\n public rotate(pivot: PointElement, ac: number, as: number) {\n for (let i = 0; i < this.P[1].V.length; ++i) {\n this.P[1].V[i].rotate(pivot, ac, as);\n }\n }\n\n public update() {\n for (let j = 0; j < this.P[1].V.length; ++j) {\n this.P[1].V[j].to(this.P[0].V[j]).plus(this._D).minus(this._C);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tPyramidElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {PolyhedronElement} from \"./PolyhedronElement\";\nimport {PolygonElement} from \"../polygon/PolygonElement\";\nimport {PointElement} from \"../point/PointElement\";\n\nexport class PyramidElement extends PolyhedronElement {\n\n constructor(Base: PolygonElement, Apex: PointElement) {\n super();\n this.dimension = 2;\n let n = 1 + Base.V.length;\n this.P = new Array(n);\n this.P[0] = Base;\n for (let i = 1; i < n; ++i) {\n this.P[i] = new PolygonElement([Apex, Base.V[i - 1], Base.V[i % Base.V.length]]);\n }\n }\n}\n","/*----------------------------------------------------------------------+\n| Title:\tArcElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2026, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {SectorElement} from \"./SectorElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\n/**\n * Port of geom_applet/source/Arc.java — an arc through three points.\n *\n * Given points A, M, B (with M on the arc between A and B), draws the\n * arc of the unique circle passing through all three. The circle's\n * center is recomputed on every update() as circumcenter(A, M, B) and\n * stored in the inherited _Center field; SectorElement.drawEdge then\n * sweeps the arc from A to B using the inherited angle math.\n *\n * _Center is an internal bare PointElement, not registered on the\n * slate. Arc.update() writes into it directly, so it stays in sync\n * with A, M, B without needing a separate elementsForUpdate entry.\n *\n * translate / rotate are overridden so that grabbing and moving the\n * arc (either via a drag or via a global pivot rotation) perturbs\n * only the inherited _Center; A, M, B are independent slate elements\n * and are moved by their own handlers. This mirrors Java Arc.java\n * exactly — see geom_applet/source/Arc.java lines 19-23.\n */\nexport class ArcElement extends SectorElement {\n\n _M : PointElement; // the \"through\" point on the arc between A and B\n\n constructor(A: PointElement, M: PointElement, B: PointElement, P: PlaneElement) {\n super();\n this.dimension = 2;\n this._Center = new PointElement();\n this._A = A;\n this._M = M;\n this._B = B;\n this._P = P;\n }\n\n update(): void {\n // Java Arc.update() explicitly calls P.update() first. The TS\n // slate already updates elements in dependency order, so this\n // is arguably redundant — but we keep it for parity with Java\n // in case some emergent behavior depends on it.\n this._P.update();\n this._Center.toCircumcenter(this._A, this._M, this._B);\n }\n\n translate(dx: number, dy: number): void {\n this._Center.translate(dx, dy);\n }\n\n rotate(pivot: PointElement, ac: number, as: number): void {\n this._Center.rotate(pivot, ac, as);\n }\n}\n","// Animations targeting SectorElement (and its ArcElement subclass).\n// See ../Animations.ts for the abstract base + registry mechanics.\n\nimport {Animation, AllAnimations, IAnimationStep, registerAnimation} from \"../Animations\";\nimport {GeomElement} from \"../GeomElement\";\nimport {Slate} from \"../../Slate\";\nimport {SectorElement} from \"./SectorElement\";\n\n// Same sweep rate as Circle.compass so an angle arc feels like the\n// same instrument; a typical quarter-turn marker (~π/2) sweeps in\n// ~500 ms. Min duration keeps a narrow angle from blinking past.\nconst DEFAULT_SWEEP_RATE_RAD_PER_MS = 0.003;\nconst MIN_SWEEP_MS = 250;\nconst DEFAULT_SECTOR_FILL_MS = 500;\n\n// A.Sector.sweep — the arc grows from the A arm toward the B arm by\n// driving drawProgress. Args: none. Duration = |arcAngle| / rate.\n//\n// Two-step when the sector has a face (sweep then face fade-in,\n// mirroring Circle.compass); a face-less sector skips the fill step\n// entirely (#81 pattern) — which is the common case for zero-color\n// angle markers that render gold only while animating.\nexport class SectorSweepAnimation extends Animation {\n public animationMethod = AllAnimations.SECTOR_SWEEP;\n public name = \"Sector.sweep\";\n public elementType = SectorElement;\n public defaultRate = DEFAULT_SWEEP_RATE_RAD_PER_MS;\n public defaultDurationMs = DEFAULT_SECTOR_FILL_MS;\n\n public build(target: GeomElement, slate: Slate, args: any): IAnimationStep[] {\n const sector = target as SectorElement;\n const arcAngle = Math.abs(\n sector._Center.angle(sector._A, sector._B, sector._P));\n const sweepMs = Math.max(MIN_SWEEP_MS, arcAngle / this.defaultRate);\n const fullRestore = () => {\n sector.faceAlpha = 1;\n sector.drawProgress = 1;\n sector.visible = true;\n };\n const sweep: IAnimationStep = {\n durationMs: sweepMs,\n setup: () => {\n sector.faceAlpha = 0;\n sector.drawProgress = 0;\n },\n tick: (progress) => { sector.drawProgress = progress; },\n finalise: () => { sector.drawProgress = 1; },\n };\n if (sector.faceColor == null) {\n sweep.finalise = fullRestore;\n return [sweep];\n }\n const fillMs = Math.min(sweepMs / 2, this.defaultDurationMs);\n return [\n sweep,\n {\n durationMs: fillMs,\n tick: (progress) => { sector.faceAlpha = progress; },\n finalise: fullRestore,\n },\n ];\n }\n}\n\nregisterAnimation(new SectorSweepAnimation());\n","/*----------------------------------------------------------------------+\n| Sector construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, ConstructionSignature, SortedParams, AllConstructions,\n SectorConstructions as SectorConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SectorElement} from \"./SectorElement\";\nimport {ArcElement} from \"./ArcElement\";\n\n// sector — points A, B, C [, plane D = screen]\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java sector case 0 — new SectorElement(A,B,C,plane))\nexport class SectorConstruction extends Construction {\n constructionMethod: AllConstructions = SectorConstructionsEnum.sector;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new SectorElement({O:P[0], A:P[1], B:P[2], P: plane});\n return [[g], g];\n }\n}\n\n// sector — arc — points A, M, B [, plane D = screen]\n// 2D: 3 points, 0 elements — uses screen plane\n// 3D: 3 points, 1 PlaneElement — uses explicit plane\n// (Java: Slate.java sector case 1 — new ArcElement(A,M,B,plane))\nexport class ArcConstruction extends Construction {\n constructionMethod: AllConstructions = SectorConstructionsEnum.arc;\n signature: ConstructionSignature = { points: 3, elements: 0, integers: 0 };\n public validateSignature(cm: AllConstructions, sp: SortedParams): boolean {\n if (cm !== this.constructionMethod) return false;\n return sp.P.length === 3 && sp.N.length === 0\n && (sp.E.length === 0 || (sp.E.length === 1 && sp.E[0] instanceof PlaneElement));\n }\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let plane = E.length > 0 ? E[0] as PlaneElement : screen;\n let g = new ArcElement(P[0], P[1], P[2], plane);\n return [[g], g];\n }\n}\n\nexport const sectorConstructions: Construction[] = [\n new SectorConstruction(),\n new ArcConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tSectorElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2019, Nelson Brown, brownnrl@gmail.com |\n| https://www.nelsonbrown.net/ |\n+----------------------------------------------------------------------*/\n\nimport {GeomElement} from \"../GeomElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {Midpoint} from \"../point/Midpoint\";\nimport {SlateCanvas} from \"../../Slate\";\n\nexport interface ISectorElementConstruction {\n O: PointElement;\n A: PointElement;\n B: PointElement;\n P: PlaneElement;\n}\n\nexport class SectorElement extends GeomElement {\n\n _Center : PointElement;\n _A : PointElement;\n _B : PointElement;\n // A and B are two points on a circle with the given center\n\n _P : PlaneElement; // plane of the circle\n\n _angle : number = null;\n\n // Face fill alpha — drives drawFace's globalAlpha independent of\n // drawProgress (which drives the arc sweep). Default 1 keeps every\n // existing render path identical. Mirrors Circle/Polygon (#86).\n private _faceAlpha : number = 1;\n\n set faceAlpha(value: number) {\n this._faceAlpha = value < 0 ? 0 : (value > 1 ? 1 : value);\n }\n get faceAlpha(): number { return this._faceAlpha; }\n\n constructor(isec?: ISectorElementConstruction) {\n super();\n this.dimension = 2;\n if(isec != null) {\n this._Center = isec.O;\n this._A = isec.A;\n this._B = isec.B;\n this._P = isec.P;\n }\n }\n\n radius() : number {\n return this._Center.distance(this._A);\n }\n\n defined() {\n return this._A.defined() && this._B.defined() && this._Center.defined();\n }\n\n\n // Here, we differ from the original implementation.\n // Since A and B are on the circle, we find the midpoint M between them.\n // Then we calculate a radius distance along the line from Center M\n // as the \"through\" point.\n\n _updateThroughPoint() : void {\n let r = this.radius();\n if(r == 0) { // degenerate circle\n return;\n }\n this._angle = Math.atan2(this._B.y - this._A.y, this._B.x - this._A.x) -\n Math.atan2(this._Center.y - this._A.y, this._Center.x - this._A.x);\n let x = this._Center.x + Math.cos(this._angle/2) * r;\n let y = this._Center.y + Math.sin(this._angle/2) * r;\n }\n\n drawEdge(c: SlateCanvas): void {\n if (!this.visible) return;\n // Pick the highlight color BEFORE the null bail, matching the\n // other element types (#81 / #86) — a zero-color sector can\n // still render in the highlight stroke while emphasized or\n // slide-highlighted, which is what lets invisible angle\n // markers light up on demand.\n const color = (this.emphasized || this.shouldHighlight)\n ? this.edgeHighlightColor\n : this.edgeColor;\n if (color == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = color;\n {\n const baseW = this.shouldHighlight ? 3 : 1;\n ctx.lineWidth = baseW + this.emphasisAmount * (6 - baseW);\n }\n ctx.beginPath();\n let r = this.radius();\n let startAngle = Math.atan2(\n this._A.y - this._Center.y,\n this._A.x - this._Center.x);\n let arcAngle = this._Center.angle(this._A, this._B, this._P);\n // Partial sweep for slide-transition animation: the arc grows\n // from the A arm toward the B arm as drawProgress goes 0 → 1.\n // Default progress = 1 reproduces the full arc bit-for-bit.\n let endAngle = startAngle + arcAngle * this.drawProgress;\n ctx.arc(this._Center.x, this._Center.y, r, startAngle, endAngle, true);\n ctx.stroke();\n }\n\n drawFace(c: SlateCanvas): void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n // Face is independent of the edge sweep — always the full\n // sector wedge, with alpha driven by the dedicated faceAlpha\n // field (mirrors Circle/Polygon, #86). Default 1 preserves\n // the fully-opaque behaviour for every non-animating consumer.\n let a = this.faceAlpha;\n if (a <= 0) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.fillStyle = this.faceColor;\n ctx.beginPath();\n let r = this.radius();\n let startAngle = Math.atan2(\n this._A.y - this._Center.y,\n this._A.x - this._Center.x);\n let arcAngle = this._Center.angle(this._A, this._B, this._P);\n let endAngle = startAngle + arcAngle;\n ctx.arc(this._Center.x, this._Center.y, r, startAngle, endAngle, true);\n ctx.moveTo(this._Center.x, this._Center.y);\n if(arcAngle <= 180.) {\n ctx.lineTo(this._A.x, this._A.y);\n ctx.lineTo(this._B.x, this._B.y);\n } else {\n ctx.lineTo(this._B.x, this._B.y);\n ctx.lineTo(this._A.x, this._A.y);\n }\n ctx.lineTo(this._Center.x, this._Center.y);\n if (a < 1) {\n ctx.save();\n ctx.globalAlpha = a;\n ctx.fill();\n ctx.restore();\n } else {\n ctx.fill();\n }\n }\n\n drawName(c: SlateCanvas): void {\n }\n\n drawVertex(c: SlateCanvas): void {}\n\n rotate(pivot: PointElement, ac: number, as: number): void {}\n\n translate(dx: number, dy: number): void {}\n\n update(): void {\n this._updateThroughPoint();\n }\n\n}\n","/*----------------------------------------------------------------------+\n| Sphere construction classes — extracted from Constructions.ts |\n+----------------------------------------------------------------------*/\n\nimport {Construction, AllConstructions,\n SphereConstructions as SphereConstructionsEnum,\n GeomElementsForUpdate} from \"../Constructions\";\nimport {GeomElement} from \"../GeomElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\nimport {PointElement} from \"../point/PointElement\";\nimport {SphereElement} from \"./SphereElement\";\n\n// sphere — radius — points A, B\n// (Java: Slate.java sphere case 0 — new SphereElement(A, A, B))\nexport class SphereRadiusConstruction extends Construction {\n constructionMethod: AllConstructions = SphereConstructionsEnum.radius;\n signature = { points: 2, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new SphereElement({Center: P[0], B: P[1]});\n return [[g], g];\n }\n}\n\n// sphere — radius (3-point) — points A, B, C — center A, radius |BC|\n// (Java: Slate.java sphere case 0, choice 1 — new SphereElement(A,B,C))\nexport class SphereRadius3PointConstruction extends Construction {\n constructionMethod: AllConstructions = SphereConstructionsEnum.radius;\n signature = { points: 3, elements: 0, integers: 0 };\n construct(screen: PlaneElement, P: PointElement[], E: GeomElement[], N: number[]): [GeomElementsForUpdate, GeomElement] {\n let g = new SphereElement({Center: P[0], A: P[1], B: P[2]});\n return [[g], g];\n }\n}\n\nexport const sphereConstructions: Construction[] = [\n new SphereRadius3PointConstruction(),\n new SphereRadiusConstruction(),\n];\n","/*----------------------------------------------------------------------+\n| Title:\tSphereElement.ts |\n| A port of the software Geometry Applet by |\n| Author: David E. Joyce |\n| Department of Mathematics and Computer Science |\n| Clark University |\n| Worcester, MA 01610-1477 |\n| U.S.A. |\n| |\n| http://aleph0.clarku.edu/~djoyce/home.html |\n| djoyce@clarku.edu |\n| |\n| Date: February, 1996. Version 2.0.0 May, 1997. |\n| TypeScript Port: 2024, Nelson Brown, brownnrl@gmail.com |\n+----------------------------------------------------------------------*/\n\n\nimport {GeomElement, Align} from \"../GeomElement\"\nimport {SlateCanvas} from \"../../Slate\";\nimport {PointElement} from \"../point/PointElement\";\nimport {PlaneElement} from \"../plane/PlaneElement\";\n\nexport interface ISphereElementConstruction {\n Center? : PointElement;\n A? : PointElement; // radius is AB\n B? : PointElement; // A assumed to be Center unless provided\n}\n\nexport class SphereElement extends GeomElement {\n\n protected _Center : PointElement;\n protected _A : PointElement; // radius is AB\n protected _B : PointElement;\n\n get Center() : PointElement { return this._Center; }\n\n constructor(ip? : ISphereElementConstruction) {\n super();\n this.dimension = 2;\n this._Center = ip && ip.Center || new PointElement();\n this._A = ip && ip.A || this._Center;\n this._B = ip && ip.B || new PointElement();\n }\n\n public drawName(c: SlateCanvas) : void {\n if (!this.visible) return;\n if(this.nameColor != null && this.name != null && this.defined()) {\n this.drawString(Math.round(this._Center.x), Math.round(this._Center.y), c, Align.CENTRAL);\n }\n }\n\n public defined() : boolean {\n return true;\n }\n\n public drawEdge(c: SlateCanvas) : void {\n if (!this.visible) return;\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.strokeStyle = this.edgeColor;\n let r = this.radius();\n ctx.beginPath();\n // ellipse() takes (centerX, centerY, radiusX, radiusY, ...)\n ctx.ellipse(\n this._Center.x,\n this._Center.y,\n r,\n r,\n 0,\n 0,\n 2*Math.PI);\n ctx.stroke();\n ctx.restore();\n }\n\n public drawFace(c: SlateCanvas) : void {\n if (!this.visible) return;\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.save();\n ctx.fillStyle = this.faceColor;\n let r = this.radius();\n ctx.beginPath();\n ctx.ellipse(\n this._Center.x,\n this._Center.y,\n r,\n r,\n 0,\n 0,\n 2*Math.PI);\n ctx.fill();\n ctx.restore();\n }\n\n public radius() : number { return this._A.distance(this._B); }\n public radius2() : number { return this._A.distance2(this._B); }\n\n public drawVertex() {}\n public update(): void {}\n public translate(dx: number, dy: number): void {}\n public rotate(pivot: PointElement, ac: number, as : number, plane?: PlaneElement) : void {\n }\n\n}\n","import {GeomElement, Align as align} from \"./elements/GeomElement\"\nimport {AllConstructions, E as e} from \"./elements/Constructions\"\nimport {AllAnimations, A} from \"./elements/Animations\"\n// Per-type animation modules — imported for side effects so each\n// Animation subclass registers with the registry at module load. Adding\n// a new animation file is a one-line `import \"./elements/.../X\"` here.\nimport \"./elements/point/PointAnimations\";\nimport \"./elements/line/LineAnimations\";\nimport \"./elements/circle/CircleAnimations\";\nimport \"./elements/polygon/PolygonAnimations\";\nimport \"./elements/sector/SectorAnimations\";\nimport {PointElement} from \"./elements/point/PointElement\";\nimport {Slate} from \"./Slate\";\nimport {PlaneSlider} from \"./elements/point/PlaneSlider\";\nimport {colors, randomColor, lighten, darken, parseColor} from \"./Colors\";\nimport {createControls} from \"./SlateControls\";\n\nexport type IndexAllConstructions = AllConstructions;\nexport {align as Align};\nexport {e as E};\nexport {AllAnimations, A};\n\n// Build marker — bumped when behaviour-affecting changes ship so consumers\n// (e.g. the test pages used to investigate #55) can confirm which bundle\n// they're actually running.\nexport const BUILD_MARKER = \"pointer-events-refactor-v1 (Slate.ts #55)\";\n\nexport let slates : Slate[] = [];\n\nexport interface IConstructionInfo {\n name: string;\n construction: IndexAllConstructions;\n params: any[];\n nameColor?: string | number;\n vertexColor?: string | number;\n edgeColor?: string | number;\n faceColor?: string | number;\n}\n\n// Marginal-reference shape for slides. The `ref` is a symbolic label\n// such as \"I.Post.3\" or \"C.N.1\"; URL resolution happens via the\n// consumer-supplied resolveJustification callback so the data here\n// doesn't go stale if a referenced page moves on the consumer site.\nexport interface ISlideJust {\n ref: string;\n}\n\n// One step in the slideshow / presentation walk-through. The DSL is\n// declarative: each slide describes its full effective state, and the\n// Presentation controller computes the transitions between them.\n//\n// - visible inherits from the previous slide if omitted, so authors\n// only re-specify on state change.\n// - highlighted defaults to [] (clears between slides), so a\n// highlight only persists when re-specified on the next slide.\n// - Draggable elements (e.draggable === true) are auto-unioned into\n// the visible set by the Presentation controller; authors don't\n// need to list free construction points per slide.\n// - Highlighted elements are auto-unioned into visible — you can't\n// highlight what isn't drawn.\n// Per-element animation choice on one slide. Cascade order = the\n// array order. An element revealed by the slide but not listed here\n// pops in instantly. See A.* / AllAnimations for valid name values.\nexport interface ISlideAnimation {\n elem: string;\n name: AllAnimations | string;\n args?: any;\n durationMs?: number;\n}\n\nexport interface ISlideTransition {\n mode?: \"cascade\" | \"parallel\";\n animations?: ISlideAnimation[];\n}\n\nexport interface ISlide {\n text: string;\n visible?: string[];\n highlighted?: string[];\n justifications?: ISlideJust[];\n transition?: ISlideTransition;\n}\n\n// Slate-level animation tuning. No \"default animations\" — animations\n// are strictly opt-in per slide via slide.transition.animations. A\n// slate that never sets animationConfig keeps the 0.5.0 instant\n// behaviour everywhere.\nexport interface IAnimationConfig {\n // Per-animation rate overrides, keyed by animation name. Lets a\n // consumer dial all \"Line.straightEdgeConnect\" animations 30%\n // slower without touching individual slides.\n rates?: { [animationName: string]: number };\n // Per-animation duration overrides.\n durations?: { [animationName: string]: number };\n // Pause between cascaded steps; default 0.\n cascadeGapMs?: number;\n // Global multiplier; 1.0 default; 0 = jump-to-final.\n speedMultiplier?: number;\n // Default reads prefers-reduced-motion CSS media query at init().\n reducedMotion?: boolean;\n}\n\nexport interface IInitialization {\n background : string;\n title : string;\n align? : align;\n canvasid? : string;\n pivot?: string;\n font?: string;\n fontsize?: number;\n elements: (IConstructionInfo | string)[];\n // Secondary element names that resolve to a canonical element.\n // Lets prose name an element under any of the conventional\n // letter-permutations (e.g. \"circle BCD\" ≡ \"circle CDB\") without\n // forcing the canvas to carry an invisible duplicate per alias.\n // Resolved by Slate.lookupElement after a direct-name miss.\n aliases?: {[from: string]: string};\n // Optional slideshow walk-through. When provided + non-empty,\n // SlateControls renders a \"▶ Present\" button that opens the\n // Presentation overlay. Stays empty (no button, no behaviour\n // change) for consumers that don't opt in.\n slides?: ISlide[];\n // Consumer lookup that maps a justification ref (\"I.Post.3\") to\n // a URL string. Returning null/undefined renders the ref as\n // plain text. Sync; the lektor site wires this to a page-emitted\n // window.eucrefs map.\n resolveJustification?: (ref: string) => string | null | undefined;\n // Slide-transition animation config. Optional; without it, the\n // slideshow keeps the 0.5.0 instant behaviour. Animations are\n // also strictly per-slide opt-in — even with animationConfig set,\n // a slide without transition.animations pops in instantly.\n animationConfig?: IAnimationConfig;\n}\n\n// Map Java element class names to E object keys\nconst typeMap: {[key: string]: string} = {\n \"point\": \"Point\", \"line\": \"Line\", \"circle\": \"Circle\",\n \"polygon\": \"Polygon\", \"sector\": \"Sector\", \"plane\": \"Plane\",\n \"sphere\": \"Sphere\", \"polyhedron\": \"Polyhedra\"\n};\n\n// Parse a Java applet param value string into an IConstructionInfo.\n// Format: \"name;type;construction;arg1,arg2,...[;nameColor[;vertexColor[;edgeColor[;faceColor]]]]\"\n// Example: \"M;point;midpoint;A,B;0;0\" → { name: \"M\", construction: E.Point.midpoint, params: [\"A\",\"B\"], nameColor: \"0\", vertexColor: \"0\" }\nexport function parseParam(value: string): IConstructionInfo {\n let fields = value.split(\";\");\n if (fields.length < 4) {\n throw new Error(`parseParam: expected at least 4 semicolon-separated fields, got ${fields.length}: \"${value}\"`);\n }\n\n let name = fields[0];\n let type = fields[1];\n let construction = fields[2];\n let data = fields[3];\n\n // Look up the construction enum value\n let typeKey = typeMap[type];\n if (typeKey == null) {\n throw new Error(`parseParam: unknown element type \"${type}\" in \"${value}\"`);\n }\n let enumObj = (e as any)[typeKey];\n // Handle Java names that differ from TS enum keys\n let enumKey = construction === \"3points\" ? \"threePoints\" : construction;\n let constructionEnum = enumObj[enumKey];\n if (constructionEnum == null) {\n throw new Error(`parseParam: unknown construction \"${type};${construction}\" in \"${value}\"`);\n }\n\n // Parse params: split on comma, convert numeric strings to numbers\n let params: any[] = data.split(\",\").map(s => {\n let n = Number(s);\n return (s !== \"\" && !isNaN(n)) ? n : s;\n });\n\n // Parse optional color fields (positions 4-7)\n let result: IConstructionInfo = { name, construction: constructionEnum, params };\n if (fields.length > 4 && fields[4] !== undefined) result.nameColor = fields[4];\n if (fields.length > 5 && fields[5] !== undefined) result.vertexColor = fields[5];\n if (fields.length > 6 && fields[6] !== undefined) result.edgeColor = fields[6];\n if (fields.length > 7 && fields[7] !== undefined) result.faceColor = fields[7];\n\n return result;\n}\n\n// see https://stackoverflow.com/questions/4938346/canvas-width-and-height-in-html5\nfunction resizeCanvasToDisplaySize(canvas: HTMLCanvasElement) : void {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n\n if (canvas.width != width || canvas.height != height) {\n canvas.width = width;\n canvas.height = height;\n }\n}\n\n/**\n * If init() fails partway, the canvas stays blank and the user sees\n * nothing — the <noscript> tag won't fire because JS *is* running, it\n * just errored. This helper looks for a <noscript> sibling of the\n * canvas (the conventional location for the static-image fallback,\n * e.g. <noscript><img src=\"propI4.gif\"/></noscript>), reparses its\n * contents, inserts them as a visible sibling, and hides the canvas.\n *\n * Safe no-op if `canvas` is null, has no noscript sibling, or any\n * DOM operation throws. Exported so consumers can call it directly\n * if they have their own error-handling path.\n */\nexport function revealNoscriptFallback(canvas: HTMLCanvasElement | null): void {\n if (!canvas) return;\n try {\n // Scan up to ~5 element siblings forward — the <noscript> is\n // usually the immediate next, but the document may have other\n // markup interleaved.\n let sibling = canvas.nextElementSibling;\n let attempts = 0;\n while (sibling && attempts++ < 5 && sibling.tagName !== \"NOSCRIPT\") {\n sibling = sibling.nextElementSibling;\n }\n if (!sibling || sibling.tagName !== \"NOSCRIPT\") return;\n\n // With JS enabled, <noscript>'s contents are a single text node\n // holding the raw markup. Reparse via a wrapper div.\n let html = sibling.innerHTML;\n if (!html) return;\n let wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n sibling.parentNode?.insertBefore(wrapper, sibling);\n canvas.style.display = \"none\";\n } catch (_) {\n // Swallow: this is an emergency fallback. If we can't reveal it,\n // the user is no worse off than before this helper existed.\n }\n}\n\nexport function init(i : IInitialization) {\n let canvasid : string = i.canvasid != null ? i.canvasid : \"canvasid\";\n let canvas = document.getElementById(canvasid) as HTMLCanvasElement;\n try {\n initInner(i, canvas);\n } catch (err) {\n // Blank canvas + console error = silent failure from the\n // visitor's point of view. Reveal the conventional <noscript>\n // static-image fallback so they at least see the diagram, then\n // re-throw so callers / test harnesses can detect the failure.\n console.error(\"[geomlib] init failed:\", err);\n revealNoscriptFallback(canvas);\n throw err;\n }\n}\n\nfunction initInner(i: IInitialization, canvas: HTMLCanvasElement) {\n // Java defaults to CENTRAL (0) — dynamic placement based on\n // position relative to canvas center. Override with align param.\n let defaultAlign : align = i.align != null ? i.align : align.CENTRAL;\n\n resizeCanvasToDisplaySize(canvas);\n let slate : Slate = new Slate(canvas);\n slates.push(slate);\n\n // Set font — Java defaults: Font(\"TimesRoman\", Font.ITALIC, 18)\n let fontName = i.font != null ? i.font : \"Times New Roman\";\n let fontSize = i.fontsize != null ? i.fontsize : 18;\n GeomElement.setFont(fontName, fontSize);\n // Parse background through parseColor so HSB triples like \"35,19,100\"\n // are converted to valid CSS rgb() strings for ctx.fillStyle.\n slate.bgcolor = parseColor(i.background, \"#ffffff\", \"#ffffff\");\n for(let raw of i.elements) {\n let param: IConstructionInfo = typeof raw === \"string\" ? parseParam(raw) : raw;\n let element = slate.createElement(param.construction, param.params, param.name);\n\n element.align = defaultAlign;\n\n // Name string\n let defaultNameColor = element instanceof PointElement ? \"black\" : null;\n element.nameColor = parseColor(param.nameColor, defaultNameColor, slate.bgcolor);\n\n let defaultVertexColor = element.draggable ?\n ((element instanceof PlaneSlider) ?\n 'red' : 'orange')\n : 'black';\n element.vertexColor = parseColor(param.vertexColor, defaultVertexColor, slate.bgcolor);\n\n element.edgeColor = parseColor(param.edgeColor, \"black\", slate.bgcolor);\n\n let lighterColor = lighten(slate.bgcolor);\n let defaultFaceColor = element.dimension == 2 ? lighterColor : null;\n element.faceColor = parseColor(param.faceColor, defaultFaceColor, slate.bgcolor);\n }\n\n if (i.aliases != null) {\n slate.addAliases(i.aliases);\n }\n\n if (i.slides != null && i.slides.length > 0) {\n slate.slides = i.slides;\n }\n\n if (i.resolveJustification != null) {\n slate.resolveJustification = i.resolveJustification;\n }\n\n if (i.animationConfig != null) {\n slate.animationConfig = i.animationConfig;\n }\n\n if(i.pivot != null) {\n slate.setPivot(i.pivot);\n }\n\n slate.update();\n slate.updateCoordinates(0);\n\n // Add UI controls (reset, maximize, new window) if running in browser\n if (canvas && canvas.parentElement) {\n createControls(slate, canvas, i);\n }\n}\n\n","// Pure-data helpers for the slideshow presentation mode (issue #75).\n// Lives in its own module so SlideTest can exercise the state-machine\n// rules without any DOM, while SlateControls.ts owns the overlay.\n\nimport {Slate} from \"./Slate\";\nimport {ISlide} from \"./index\";\n\n// Compute the visible + highlighted name sets for slide `index` given:\n// - visible inherits from the previous slide if omitted;\n// \"hide all at start\" applies when no earlier slide ever declared\n// visible (initial state is the empty set).\n// - highlighted clears each slide (defaults to []).\n// - Every draggable element on the slate is auto-unioned into\n// visible — free construction points always stay interactive.\n// - Every highlighted name is auto-unioned into visible — you can't\n// highlight what isn't drawn.\nexport function computeSlideState(\n slate: Slate,\n slides: ISlide[],\n index: number,\n): { visible: Set<string>, highlighted: Set<string> } {\n // Walk back to find the most recent explicit `visible` array.\n let baseVisible: string[] = [];\n for (let i = index; i >= 0; i--) {\n if (slides[i].visible != null) {\n baseVisible = slides[i].visible;\n break;\n }\n }\n const visible = new Set<string>(baseVisible);\n\n const slide = slides[index];\n const highlighted = new Set<string>(slide.highlighted || []);\n\n for (const e of slate.elements) {\n if (e.draggable && e.name != null) visible.add(e.name);\n }\n highlighted.forEach(name => visible.add(name));\n\n return { visible, highlighted };\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["randomColor","c","HSVtoRGB","Math","random","r","g","b","brighter","col","rgb","parseRGB","FACTOR","threshold","ceil","min","floor","darker","m","match","parseInt","colors","hex","replace","test","n","parts","split","length","h","s","isNaN","v","i","f","p","q","t","round","val","dfault","bgcolor","str","String","canvas","_aliases","Map","_slides","_resolveJustification","_animationConfig","_animator","_ephemerals","_htmlCanvas","inTest","_itsNumSlate","Slate","numSlate","this","_elements","TypeError","_canvas","screen_origin","FixedPoint","x","y","z","name","screen_x","screen_y","screen","PlaneElement","A","B","C","nameColor","isScreen","_screen","_pick","e","vertexColor","vertexHighlightColor","faceColor","faceHighlightColor","push","slate","cnv","addEventListener","style","touchAction","activePointerId","ev","pointerId","setPointerCapture","_","_getCanvasPosition","clientX","clientY","_onMouseDown","_onMouseDrag","endPointer","_onMouseUp","releasePointerCapture","getBoundingClientRect","left","top","movePick","_bgcolor","value","lookupElement","elem","canonical","get","addAlias","from","to","set","addAliases","aliases","addEphemeral","removeEphemeral","indexOf","splice","clearEphemerals","_ensureAnimator","SlateAnimator","animateTo","targetVisible","targetHighlighted","slideAnimations","mode","run","setVisibleNames","names","visible","Set","has","clearVisibility","convertParams","params","P","E","N","param","PointElement","LineElement","findConstruction","cm","sp","constructions","validateSignature","createElement","cName","getConstructionName","construct","gs","preexists","reset","update","drawElements","w","width","height","ctx","getContext","clearRect","fillStyle","fillRect","drawFace","drawEdge","drawVertex","drawName","updateCoordinates","defined","translateCoordinates","dx","dy","translate","closestVisiblePoint","elements","tolerance","screenDist2","a","sortedDistanceElements","filter","map","sort","adcp","bdcp","bestDistPoint","sqrt","_getPick","d","currentPoint","setPivot","pointName","trim","piv","planeName","pivot","_AP","picki","abs","draggable","drag","AP","rotateCoordinates","pick","oldP","difference","newx","newy","S","T","olds","dot","oldt","den","news","newt","ac","as","rotate","HAS_RAF","requestAnimationFrame","NOW","performance","now","Date","groups","resolveCurrent","cascadeIndex","rafId","lastFrameMs","fadingOut","fadeStartMs","cancel","config","animationConfig","speedMul","speedMultiplier","reduced","reducedMotion","entry","target","animation","findAnimation","elementType","console","warn","constructor","drawProgress","resolvedSteps","build","args","step","durationMs","stepDefault","slideOverride","configOverride","durations","elapsedMs","started","finalised","steps","currentIndex","animatedTargets","willBeVisible","willBeHighlighted","shouldHighlight","setup","finalise","Promise","resolve","emphasized","_kickoff","_scheduleFrame","_clearAnimatedEmphasis","cancelAnimationFrame","_startGroupIndex","_startStep","idx","stepIdx","_frame","setTimeout","nowMs","cascadeGap","cascadeGapMs","rawDt","dt","_tickCascade","_tickParallel","_allFinalised","fadeElapsed","fp","ea","emphasisAmount","_tickStep","finishedAtMs","total","tick","parentElement","SlateControls","init","isCoarsePointer","window","matchMedia","matches","BTN_SIZE","BTN_GAP","BTN_MARGIN","trackWindowResize","callback","handler","removeEventListener","_maximized","_savedStyles","_stopTrackingResize","_presenting","_presentationIndex","_presentationOverlay","_presentationCaption","_presentationJusts","_presentationCounter","_presentationOnKey","_stickyRefSpan","_stickyRefElem","_slate","_config","_wrapper","createWrapper","createButtons","addKeyboardShortcuts","wrapper","document","position","display","insertBefore","appendChild","setAttribute","outline","buttons","draw","drawResetIcon","action","onReset","title","drawMaximizeIcon","onMaximize","drawNewWindowIcon","onNewWindow","slides","drawPresentIcon","onPresent","btn","right","padding","border","cursor","background","borderRadius","iconCanvas","stopPropagation","focus","_maxBtn","_maxIconCanvas","key","preventDefault","minimize","maximize","wrapperPosition","wrapperTop","wrapperLeft","wrapperWidth","wrapperHeight","wrapperZIndex","zIndex","wrapperBackground","canvasStyleWidth","canvasStyleHeight","canvasAttrWidth","canvasAttrHeight","resizeAndRedraw","updateMaximizeIcon","clientWidth","clientHeight","size","pad","strokeStyle","lineWidth","ax","ay","bx","by","beginPath","moveTo","lineTo","stroke","closePath","fill","drawMinimizeIcon","scripts","querySelectorAll","bundleSrc","src","newWinConfig","Object","assign","canvasid","configJSON","JSON","stringify","html","newWin","open","write","close","buildPresentationOverlay","bindPresentationKeys","showSlide","exitPresent","unbindPresentationKeys","clearStickyRef","removePresentationOverlay","overlay","className","bottom","margin","maxWidth","color","borderTop","boxShadow","fontFamily","boxSizing","textAlign","caption","fontSize","lineHeight","marginBottom","justs","opacity","minHeight","nav","gap","alignItems","justifyContent","prevBtn","makePresentationButton","counter","minWidth","nextBtn","exitBtn","marginLeft","documentElement","parentNode","removeChild","index","clamped","max","state","computeSlideState","slide","transition","animations","highlighted","renderCaptionText","text","textContent","innerHTML","resolveJustification","justifications","sep","ref","url","href","rel","span","host","re","lastIndex","exec","createTextNode","slice","buildCaptionRef","label","fontWeight","fontStyle","borderBottom","wasThis","setStickyRef","classList","remove","add","cx","cy","arc","PI","endAngle","cos","sin","a1","a2","ry","rw","rh","strokeRect","arrowStartX","arrowStartY","arrowEndX","arrowEndY","leftX","rightX","topY","bottomY","animationsByName","animationsByEnum","warnedUnknown","AllAnimations","Point","appear","POINT_APPEAR","intersect","POINT_INTERSECT","Line","straightEdgeConnect","LINE_STRAIGHT_EDGE_CONNECT","straightEdgeExtend","LINE_STRAIGHT_EDGE_EXTEND","compassTransfer","LINE_COMPASS_TRANSFER","Circle","compass","CIRCLE_COMPASS","compassExplicit","CIRCLE_COMPASS_EXPLICIT","Polygon","POLYGON_OUTLINE","outlineAndFill","POLYGON_OUTLINE_AND_FILL","superpose","POLYGON_SUPERPOSE","Sector","sweep","SECTOR_SWEEP","instant","INSTANT","Animation","animationMethod","GeomElement","InstantAnimation","registerAnimation","ConstructionTypes","PointConstructions","LineConstructions","CircleConstructions","PolygonConstructions","SectorConstructions","PlaneConstructions","SphereConstructions","PolyhedraConstructions","Plane","Sphere","Polyhedra","constructionMethod","sig","signature","points","integers","elementTypes","Construction","pointConstructions","lineConstructions","circleConstructions","sectorConstructions","polygonConstructions","planeConstructions","sphereConstructions","polyhedronConstructions","Align","_nameColor","_vertexColor","_edgeColor","_faceColor","_nameHighlightColor","_vertexHighlightColor","_edgeHighlightColor","_faceHighlightColor","_shouldHighlight","_visible","_emphasisAmount","_drawProgress","_pixelTolerance","setFont","fontName","_font","_getTextMetrics","txt","textMetrics","measureText","actualBoundingBoxAscent","actualBoundingBoxDescent","drawString","ix","iy","overrideAlign","font","_name","_align","LEFT","fillText","RIGHT","ABOVE","BELOW","cw","ch","tox","toy","_draggable","_dimension","CircleElement","defaultRate","defaultDurationMs","circle","explicitStart","startAngle","atan2","Center","sweepMs","fullRestore","faceAlpha","drawStartAngle","progress","CircleCompassAnimation","radius","plane","CircleRadiusCenterConstruction","CircleRadius3PointConstruction","invert","InvertCircleElement","InvertCircleConstruction","intersection","SphereElement","SphereIntersectionElement","SphereIntersectionConstruction","ice","_drawStartAngle","_faceAlpha","dimension","distance","distance2","_drawCircleArc","arcStart","arcEnd","r2","radius2","amp2","ellipse","rcos","rsin","majorx","majory","factor","minorx","minory","majorR","minorR","rotation","edgeHighlightColor","edgeColor","baseW","save","globalAlpha","restore","D","toCircumcenter","CircumcircleElement","_C","_D","d2","minus","times","plus","_S","_T","PerpendicularPlane","t2","ibe","_A","_B","costheta","sintheta","toCircle","Bichord","toLine","Chord","traceLine","rate","LineStraightEdgeConnectAnimation","LineStraightEdgeExtendAnimation","connect","LineConnectConstruction","angleBisector","ad","AngleDividerElement","AngleBisectorLineConstruction","angleDivider","AngleDividerLineConstruction","foot","fo","Foot","LineFootConstruction","PlaneFootElement","PlaneFootLineConstruction","chord","ChordConstruction","bichord","wrapPointAsLine","es","BichordConstruction","perpendicular","PointPerpendicular1Construction","LinePerpendicular1Construction","PointPerpendicular2Construction","LinePerpendicular2Construction","PointPerpendicular3Construction","LinePerpendicular3Construction","PointPerpendicular4Construction","LinePerpendicular4Construction","PointPerpendicular5Construction","LinePerpendicular5Construction","cutoff","lo","Layoff","LineCutoffConstruction","extend","LineExtendConstruction","parallel","LineParallelConstruction","similar","g2","sim","SimilarElement","SimilarLineConstruction","proportion","prop","ProportionElement","ProportionLineConstruction","meanProportional","mp","MeanProportionalElement","MeanProportionalLineConstruction","ile","endX","endY","ipe","_P","_E","_F","F","toPlane","Bs","Bt","Perpendicular","toCross","PlanePerpendicularLine","U","ParallelPlane","ippe","len","lxy","threePoints","Plane3PointsConstruction","PerpendicularPlaneConstruction","PlaneParallelConstruction","ambient","AmbientPlanePointConstruction","AmbientPlaneCircleConstruction","ip","st","_n","theta","angle","_x","_y","_z","toIntersection","_newP","_initx","_inity","_initz","uptoPlane","toSphere","CircleSlider","_M","Ex","Ey","Fx","Fy","BFx","BFy","DEx","DEy","numx","numy","rB2","length2","C2","HarmonicElement","Intersection","toInvertPoint","InvertPointElement","segment","_segment","LineSlider","S0","S1","T0","T1","U0","U1","_S0","_S1","_T0","_T1","_U0","_U1","Midpoint","toIntersectionPL","PlaneIntersection","Qval","xVal","yVal","zVal","PlaneSlider","PointAppearAnimation","free","FreePointConstruction","midpoint","MidPointConstruction","IntersectionConstruction","PlaneIntersectionConstruction","first","FirstPointConstruction","last","LastPointConstruction","center","CircleCenterConstruction","SphereCenterConstruction","lineSlider","createSlider","LineSliderConstruction","circleSlider","CircleSliderConstruction","circumcircle","CircumcircleConstruction","circumcenter","CircumcenterConstruction","FootPointConstruction","PlaneFootPointConstruction","_createLayoff","LayoffConstruction","ps","CutoffConstruction","ExtendConstruction","parallelogram","ParallelogramConstruction","SimilarPointConstruction","PointPerpendicularConstruction","ProportionPointConstruction","InvertPointConstruction","MeanProportionalPointConstruction","planeSlider","PlaneSliderConstruction","sphereSlider","SphereSliderElement","SphereSliderConstruction","AngleBisectorPointConstruction","AngleDividerPointConstruction","fixed","FixedPointConstruction","lineSegmentSlider","LineSliderSegmentConstruction","harmonic","HarmonicPointConstruction","vertex","PolygonElement","V","VertexConstruction","product","cross","triple","u","BmA","CmA","BC","B2","area","Bx","Cx","By","Cy","Bz","Cz","Cs","Ct","d0","d1","AmA","DmA","Ax","Ay","Dx","Dy","toSimilar","Q","co","si","ss","tt","z1","x1","y1","baseR","V0","V1","_V0","_V1","_parentA","_parentB","_Q","dist2","Array","ApplicationElement","perimeter","poly","edgeCount","PolygonOutlineAnimation","outlineMs","PolygonOutlineAndFillAnimation","ontoName","onto","ghostPts","ghost","setGhost","coords","translated","rotated","estDist","hypot","translateMs","estTheta","_sideAngleDelta","rotateMs","gp","PolygonSuperposeAnimation","PolyConstruction","square","RegularPolygonElement","SquarePolygonConstruction","triangle","TrianglePolygonConstruction","quadrilateral","QuadrilateralPolygonConstruction","pentagon","PentagonPolygonConstruction","hexagon","HexagonPolygonConstruction","equilateralTriangle","EquilateralTriangleConstruction","ParallelogramPolygonConstruction","regularPolygon","RegularPolygonConstruction","starPolygon","StarPolygonConstruction","SimilarPolygonConstruction","application","ApplicationPolygonConstruction","octagon","OctagonPolygonConstruction","face","PolyhedronElement","FacePolygonConstruction","sum","totalProgress","fullEdges","fractionalEdge","px","py","firstPoint","rest","_cos","_sin","tetrahedron","base","PyramidElement","TetrahedronConstruction","parallelepiped","fourth","PrismElement","ParallelepipedConstruction","prism","PrismConstruction","pyramid","PyramidConstruction","ct","j","savedColor","Base","baseN","topVerts","Apex","M","_Center","SectorElement","ArcElement","sector","arcAngle","SectorSweepAnimation","O","SectorConstruction","ArcConstruction","isec","_angle","_updateThroughPoint","SphereRadiusConstruction","SphereRadius3PointConstruction","CENTRAL","getElementById","defaultAlign","align","resizeCanvasToDisplaySize","slates","fontsize","parseColor","raw","parseParam","element","construction","defaultNameColor","defaultVertexColor","lighterColor","lighten","defaultFaceColor","createControls","initInner","err","error","revealNoscriptFallback","BUILD_MARKER","typeMap","fields","Error","type","data","typeKey","constructionEnum","result","Number","undefined","sibling","nextElementSibling","attempts","tagName","baseVisible","forEach","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call"],"sourceRoot":""}