diff --git a/engine-proto/ConstructionViewer.jl b/engine-proto/ConstructionViewer.jl index 7cb0450..bdd35fd 100644 --- a/engine-proto/ConstructionViewer.jl +++ b/engine-proto/ConstructionViewer.jl @@ -123,12 +123,24 @@ mutable struct ConstructionViewer end end +mprod(v, w) = + v[1]*w[1] + v[2]*w[2] + v[3]*w[3] + v[4]*w[4] - v[5]*w[5] + function display!(viewer::ConstructionViewer, elements::Matrix) # load elements - elements_full = [ - [0; elt; fill(0, 26)] - for elt in eachcol(elements) - ] + elements_full = [] + for elt in eachcol(elements) + if mprod(elt, elt) < 0.5 + elt_full = [0; elt; fill(0, 26)] + else + # `elt` is a spacelike vector, representing a generalized sphere, so we + # take its Hodge dual before passing it to Ganja.js. the dual represents + # the same generalized sphere, but Ganja.js only displays planes when + # they're represented by vectors in grade 4 rather than grade 1 + elt_full = [fill(0, 26); -elt[5]; -elt[4]; elt[3]; -elt[2]; elt[1]; 0] + end + push!(elements_full, elt_full) + end @js viewer.win elements = $elements_full.map((elt) -> @new CGA3(elt)) # generate palette. this is Gadfly's `default_discrete_colors` palette, diff --git a/engine-proto/ganja-test/ganja-test.html b/engine-proto/ganja-test/ganja-test.html index d6efc90..0207dcc 100644 --- a/engine-proto/ganja-test/ganja-test.html +++ b/engine-proto/ganja-test/ganja-test.html @@ -28,6 +28,25 @@ CGA3.inline(() => Math.sqrt(0.5)*(-1e1 - 1e2 + 1e3 + 1e5))(), CGA3.inline(() => -Math.sqrt(3)*1e4 + Math.sqrt(2)*1e5)() ]; + /* + these blocks of commented-out code can be used to confirm that a spacelike + vector and its Hodge dual represent the same generalized sphere + */ + /*let elements = [ + CGA3.inline(() => Math.sqrt(0.5)*!( 1e1 + 1e2 + 1e3 + 1e5))(), + CGA3.inline(() => Math.sqrt(0.5)*!( 1e1 - 1e2 - 1e3 + 1e5))(), + CGA3.inline(() => Math.sqrt(0.5)*!(-1e1 + 1e2 - 1e3 + 1e5))(), + CGA3.inline(() => Math.sqrt(0.5)*!(-1e1 - 1e2 + 1e3 + 1e5))(), + CGA3.inline(() => !(-Math.sqrt(3)*1e4 + Math.sqrt(2)*1e5))() + ];*/ + /*let elements = [ + CGA3.inline(() => 1e1 + 1e5)(), + CGA3.inline(() => 1e2 + 1e5)(), + CGA3.inline(() => 1e3 + 1e5)(), + CGA3.inline(() => -1e4 + 1e5)(), + CGA3.inline(() => Math.sqrt(0.5)*(1e1 + 1e2 + 1e3 + 1e5))(), + CGA3.inline(() => Math.sqrt(0.5)*!(1e1 + 1e2 + 1e3 - 0.01e4 + 1e5))() + ];*/ // set up palette var colorIndex; @@ -66,6 +85,7 @@ // de-noise for (let k = 6; k < elements[n].length; ++k) { + /*for (let k = 0; k < 26; ++k) {*/ elements[n][k] = 0; } }