From be13a384b1527f471dcbfbb789b5b89de29ae81e Mon Sep 17 00:00:00 2001 From: Glen Whitney Date: Sun, 11 Feb 2024 05:30:36 +0000 Subject: [PATCH] feat: Complete operation through Book Twelve (#58) The only actual new command is the construction of a polygon as a face of a previously defined polyhedron. Aside from that, just adds some hacky "bugfixes" to Joyce's underlying Geometry Applet code to convert drawings that Joyce left in 2D when they should be in 3D. Reviewed-on: https://code.studioinfinity.org/glen/archematics/pulls/58 Co-authored-by: Glen Whitney Co-committed-by: Glen Whitney --- src/adapptlet.civet | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/adapptlet.civet b/src/adapptlet.civet index edec023..bfa902d 100644 --- a/src/adapptlet.civet +++ b/src/adapptlet.civet @@ -30,6 +30,7 @@ type Description usesCaptions: JoyceName[] klass: JoyceClass ends?: [GeoName, GeoName] + parts?: string[][] // We put both JoyceNames and GeoNames in here, pointing to each other // with the otherName property: @@ -188,7 +189,8 @@ type ClassHandler = ( args: JoyceArguments, index: number, cdata: ConstructionData, - colors: string[]) => Commander + colors: string[], + jname: string) => Commander type RGB = [number, number, number] type XYZ = RGB @@ -274,7 +276,7 @@ function jToG( (args.subpoints ?= []).push depGeo else if depKlass is 'line' (args.subpoints ?= []).push ...ends ?? [] - cmdr = classHandler[klass] name, method, args, index, cdata, colors + cmdr = classHandler[klass] name, method, args, index, cdata, colors, jname unless name is jname then cmdr.callbacks.push (api: AppletObject) => api.setCaption name, jname api.setLabelStyle name, 3 // style CAPTION = 3 @@ -428,8 +430,10 @@ function jToG( console.log 'Setting label vis of', name, 'to', show if traceC api.setLabelVisible name, show - cdata.elements[jname] = {otherName: name, usesCaptions, klass, cmdr.ends} - cdata.elements[name] = {otherName: jname, usesCaptions, klass, cmdr.ends} + cdata.elements[jname] = + {otherName: name, usesCaptions, klass, cmdr.ends, cmdr.parts} + cdata.elements[name] = + {otherName: jname, usesCaptions, klass, cmdr.ends, cmdr.parts} cmdr function pivotListener(slider: string) @@ -574,7 +578,7 @@ function proportionSimilar( // All of the detailed semantics of each available command lies in this // function. classHandler: Record := - point: (name, method, args, index, cdata, colors): Commander => + point: (name, method, args, index, cdata, colors, jname): Commander => return := freshCommander() {commands, callbacks, parts, auxiliaries} := return.value zeroVector := cdata.is3d ? 'Vector((0,0,0))' : 'Vector((0,0))' @@ -582,7 +586,7 @@ classHandler: Record := aux := name + 'aUx' pivotable := cdata.pivot and name !== pivotData[cdata.pivot].pivot parts[0].push name - // HACK: Special-case corrections for Joyce Elements Bk XI + // HACK: Special-case corrections for Joyce Elements Bk XI & XII if cdata.title is 'XI.4' if name is 'Z' and method is 'fixed' and args.scalar?.length is 3 method = 'perpendicular' @@ -598,6 +602,18 @@ classHandler: Record := args.subpoints = ['B','P1','P3'] args.plane = ['xOyPlane'] commands.push 'B=(80,140)' + if cdata.title is 'XII.7' + if (name is 'E' and method is 'lineSlider' + and args.subpoints?[1] is cdata.elements['1Y'].otherName) + args.subpoints[1] = cdata.elements['1Z'].otherName + if cdata.title is 'XII.8' + if (name is 'M' and method is 'lineSlider' + and args.subpoints?[1] is cdata.elements['1Y'].otherName) + args.subpoints[1] = cdata.elements['1Z'].otherName + if cdata.title is 'XII.9' + if (jname is 'a' and method is 'lineSlider' + and args.subpoints?[1] is cdata.elements['1Y'].otherName) + args.subpoints[1] = cdata.elements['1Z'].otherName switch method /angle(?:Bisector|Divider)/ {center, foot} := @@ -976,6 +992,11 @@ classHandler: Record := 'point' moreParts[0].push newObj api.setVisible newObj, false + 'face' + unless args.polyhedron?.length is 1 then return + unless args.scalar?.length is 1 then return + element := cdata.elements[args.polyhedron[0]] + commands.push `${name} = ${element.parts?[2][args.scalar[0]-1]}` ///triangle|similar|parallelogram|application|quadrilateral |octagon|pentagon|hexagon/// unless args.subpoints then return @@ -1058,7 +1079,7 @@ classHandler: Record := auxiliaries.push aux + 1 makeLinesInvisible callbacks, name - plane: (name, method, args) => + plane: (name, method, args, index, cdata) => return := freshCommander() {commands, callbacks, parts, auxiliaries} := return.value parts[2].push name @@ -1166,7 +1187,7 @@ classHandler: Record := 'segment' moreParts[1].push newObj else - moreParts[2].push newObj + moreParts[2].splice 1,0,newObj /pyramid|tetrahedron/ base .= args.polygon?[0] ends[0] = base or aux + 1