@brownnrl/geomlib 0.1.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.
@@ -0,0 +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/SlateControls.ts","webpack://geomlib/./src/elements/Constructions.ts","webpack://geomlib/./src/elements/GeomElement.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/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/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/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/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\";\n\nexport type SlateCanvas = HTMLCanvasElement | Canvas;\n\nexport class Slate {\n\n protected _elements : GeomElement[];\n protected _elementsForUpdate : 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 this._elementsForUpdate = [];\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 this._elementsForUpdate = [...this._elements];\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 this._htmlCanvas.addEventListener(\"mousedown\", (ev) => {\n let [x, y] : number[] = this._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDown(x, y);\n });\n\n this._htmlCanvas.addEventListener(\"mouseup\", (ev) => {\n let [x, y] : number[] = this._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseUp(x, y);\n });\n\n this._htmlCanvas.addEventListener(\"mousemove\", (ev) => {\n let [x, y] : number[] = this._getCanvasPosition(ev.clientX, ev.clientY);\n slate._onMouseDrag(x, y);\n });\n\n for(let [tEvent, mEvent] of [\n [\"touchend\", \"mouseup\"],\n [\"touchstart\", \"mousedown\"],\n [\"touchmove\", \"mousemove\"]\n ]) {\n this._htmlCanvas.addEventListener(tEvent, (tv : TouchEvent) => {\n let pos = slate._getTouchPos(tv);\n let me = new MouseEvent(mEvent,\n {clientX: pos[0], clientY: pos[1]});\n slate._htmlCanvas.dispatchEvent(me);\n });\n }\n for(let eventType of [\"touchstart\", \"touchmove\", \"touchend\"]) {\n document.body.addEventListener(eventType, (tv) => {\n if (tv.target == slate._htmlCanvas) {\n tv.preventDefault();\n }\n }, false);\n }\n\n }\n\n _getTouchPos(te : TouchEvent) : [number, number] {\n if (this._htmlCanvas == null) return;\n let r = this._htmlCanvas.getBoundingClientRect();\n return [te.touches[0].clientX - r.left,\n te.touches[0].clientY - r.top];\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 get elementsForUpdate() : GeomElement[] {\n return this._elementsForUpdate;\n }\n\n set bgcolor(value: string ) {\n this._bgcolor = value;\n }\n\n get bgcolor() : string {\n return this._bgcolor;\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 return null;\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._elementsForUpdate.indexOf(elem) == -1)\n this._elementsForUpdate.push(elem);\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._elementsForUpdate) 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 }\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","/*----------------------------------------------------------------------+\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\";\n\ninterface IInitConfig {\n background: string;\n title: string;\n align?: number;\n canvasid?: string;\n pivot?: string;\n elements: any[];\n}\n\nconst BTN_SIZE = 20;\nconst BTN_GAP = 4;\nconst BTN_MARGIN = 8;\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\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 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 }\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\n private minimize(): void {\n if (!this._savedStyles) return;\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\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","/*----------------------------------------------------------------------+\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 private _nameHighlightColor : string = '#FF0000';\n private _vertexHighlightColor : string = '#FFFFFF';\n private _edgeHighlightColor : string = '#FFFFFF';\n private _faceHighlightColor : string = '#00FFFF';\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 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 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","/*----------------------------------------------------------------------+\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 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 private _drawCircle(ctx : CanvasRenderingContext2D) : 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 0,\n 2*Math.PI);\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 0,\n 2*Math.PI);\n }\n\n public drawEdge(c: SlateCanvas): void {\n if (this.edgeColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.strokeStyle = this.edgeColor;\n this._drawCircle(ctx);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n if (this.faceColor == null || !this.defined()) return;\n let ctx = c.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.fillStyle = this.faceColor;\n this._drawCircle(ctx);\n ctx.fill();\n }\n\n public drawName(c: SlateCanvas): void {\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","/*----------------------------------------------------------------------+\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 (color == null) {\n if (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.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(this._A.x, this._A.y);\n ctx.lineTo(this._B.x, this._B.y);\n ctx.stroke();\n }\n\n public drawFace(c: SlateCanvas): void {\n }\n\n public drawName(c: SlateCanvas): void {\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.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.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.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.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","/*----------------------------------------------------------------------+\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.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 let ctx : CanvasRenderingContext2D = c.getContext(\"2d\") as CanvasRenderingContext2D;\n if (color == null) {\n if (this.shouldHighlight) {\n color = this.vertexHighlightColor;\n } else {\n color = this.vertexColor;\n }\n }\n if (color == null) return;\n ctx.beginPath();\n ctx.fillStyle = color;\n ctx.arc(this._x, this._y, 2, 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","/*----------------------------------------------------------------------+\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 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 (color == null) {\n if (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 let firstPoint = this.V[0];\n let rest = this.V.slice(1);\n\n ctx.moveTo(firstPoint.x, firstPoint.y);\n \n for(let vertex of rest) {\n ctx.lineTo(vertex.x, vertex.y);\n ctx.stroke();\n }\n\n if (this.V.length > 2) {\n ctx.lineTo(firstPoint.x, firstPoint.y);\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.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 ctx.fill();\n }\n }\n\n public drawName(c: SlateCanvas): void {\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.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.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.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.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.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.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.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.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.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.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 {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};\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\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}\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\nexport function init(i : IInitialization) {\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 let canvasid : string = i.canvasid;\n if(canvasid == null) canvasid = \"canvasid\";\n\n let canvas = document.getElementById(canvasid) as HTMLCanvasElement;\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.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","// 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","_htmlCanvas","inTest","_itsNumSlate","Slate","numSlate","this","_elements","_elementsForUpdate","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","ev","_getCanvasPosition","clientX","clientY","_onMouseDown","_onMouseUp","_onMouseDrag","tEvent","mEvent","tv","pos","_getTouchPos","me","MouseEvent","dispatchEvent","eventType","document","body","target","preventDefault","te","getBoundingClientRect","touches","left","top","movePick","_bgcolor","value","lookupElement","elem","convertParams","params","P","E","N","param","PointElement","LineElement","findConstruction","cm","sp","constructions","validateSignature","createElement","cName","getConstructionName","construct","gs","indexOf","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","config","parentElement","SlateControls","init","BTN_SIZE","_maximized","_savedStyles","_slate","_config","_wrapper","createWrapper","createButtons","addKeyboardShortcuts","wrapper","style","position","display","insertBefore","appendChild","setAttribute","outline","buttons","draw","drawResetIcon","action","onReset","title","drawMaximizeIcon","onMaximize","drawNewWindowIcon","onNewWindow","btn","BTN_MARGIN","right","padding","border","cursor","background","borderRadius","iconCanvas","stopPropagation","focus","_maxBtn","_maxIconCanvas","key","minimize","maximize","wrapperPosition","wrapperTop","wrapperLeft","wrapperWidth","wrapperHeight","wrapperZIndex","zIndex","wrapperBackground","canvasStyleWidth","canvasStyleHeight","canvasAttrWidth","canvasAttrHeight","resizeAndRedraw","updateMaximizeIcon","clientWidth","clientHeight","size","strokeStyle","lineWidth","ax","pad","ay","bx","by","beginPath","moveTo","lineTo","stroke","closePath","fill","drawMinimizeIcon","scripts","querySelectorAll","bundleSrc","src","newWinConfig","Object","assign","canvasid","configJSON","JSON","stringify","html","newWin","window","open","write","close","cx","cy","arc","PI","endAngle","cos","sin","a1","a2","ry","rw","rh","strokeRect","arrowStartX","arrowStartY","arrowEndX","arrowEndY","ConstructionTypes","PointConstructions","LineConstructions","CircleConstructions","PolygonConstructions","SectorConstructions","PlaneConstructions","SphereConstructions","PolyhedraConstructions","Point","Line","Circle","Polygon","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","_pixelTolerance","setFont","fontName","fontSize","GeomElement","_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","radius","plane","CircleElement","CircleRadiusCenterConstruction","CircleRadius3PointConstruction","invert","InvertCircleElement","InvertCircleConstruction","intersection","SphereElement","SphereIntersectionElement","SphereIntersectionConstruction","ice","dimension","Center","distance","distance2","_drawCircle","r2","radius2","amp2","ellipse","rcos","rsin","majorx","majory","factor","minorx","minory","majorR","minorR","rotation","atan2","edgeColor","D","toCircumcenter","CircumcircleElement","_C","_D","d2","to","minus","times","plus","_S","_T","PerpendicularPlane","t2","ibe","_A","_B","costheta","sintheta","toCircle","Bichord","toLine","Chord","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","color","shouldHighlight","edgeHighlightColor","ipe","_P","_E","_F","F","toPlane","Bs","Bt","Perpendicular","toCross","PlanePerpendicularLine","U","ParallelPlane","ippe","len","lxy","threePoints","Plane3PointsConstruction","PerpendicularPlaneConstruction","PlaneParallelConstruction","ambient","AmbientPlanePointConstruction","AmbientPlaneCircleConstruction","ip","save","restore","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","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","V0","V1","_V0","_V1","_parentA","_parentB","_Q","dist2","Array","ApplicationElement","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","firstPoint","rest","slice","_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","startAngle","arcAngle","SphereRadiusConstruction","SphereRadius3PointConstruction","CENTRAL","defaultAlign","align","getElementById","resizeCanvasToDisplaySize","slates","fontsize","parseColor","raw","parseParam","element","construction","defaultNameColor","defaultVertexColor","lighterColor","lighten","defaultFaceColor","createControls","typeMap","fields","Error","type","data","typeKey","constructionEnum","result","Number","undefined","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call"],"sourceRoot":""}