From f9f4aab57ded16f8895940249f3c5110f0cffa58 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Thu, 29 Jun 2023 14:19:58 -0700 Subject: [PATCH 01/11] WIP: implementing marching cubes --- .../marching-cubes/marching_cubes.cljs | 63 +++++ .../marching-cubes/triangle_table.cljs | 264 ++++++++++++++++++ src/emmy/mathbox/plot.cljs | 21 ++ 3 files changed, 348 insertions(+) create mode 100644 src/emmy/mathbox/marching-cubes/marching_cubes.cljs create mode 100644 src/emmy/mathbox/marching-cubes/triangle_table.cljs diff --git a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs new file mode 100644 index 00000000..9965df2f --- /dev/null +++ b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs @@ -0,0 +1,63 @@ +(ns emmy.mathbox.marching-cubes.marching-cubes) + +(defn CubeIndex + "Returns index into 256 value Triangle Lookup Table" + [vertex_vector] + + ;; compares vertex position to rhs of surface function and + ;; returns the 8 bit number associated with that edge + [(reduce + (map-index + (fn [item index] + (* (if (> item rhs) 1 0) + (pow 2 index)))))] + ) + + +(defn IsosurfaceEdgePoints + [index x y z xStep yStep zStep v1 v2...] +;;TODO - start from here...https://github.com/ChristopherChudzicki/math3d-react/blob/e352d15d275fc2e060441ecf11574e2fdec3211b/client/src/utils/marchingCubes/index.js#L54 + (case index + 0 [(interp x (+ x xStep) v1 v2 rhs) y z] + 1 + 2 + 3 + 4 + 5 + 6 + 7 + ) + + ) + + + +(defn MarchingCubes [lhs righ xMin xMax yMin yMax zMin zMax resolution] + ;; loop over x,y, z in the steps + ;; pos {:x .. :y .. :z .. :xMin .. :xMax...} + MarchingCubes pos + CubeCase (CubeIndex ) + ;; + + ) + +(defn CubeIndex) + +(defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep ] + (let [ + v1 (lhs x y z) + v2 (lhs (+ x xStep) y z) + v4 (lhs (+ x xStep) y (+ z zStep)) + v8 (lhs x y (+ z zStep)) + v16 (lhs x (+ y yStep) z) + v32 (lhs (+ x xStep) (+ y yStep) z ) + v64 (lhs (+ x xStep) (+ y yStep) (+ z zStep)) + v128 (lhs x (+ y yStep) (+ z zStep)) + ] + + (CubeIndex [v1 v2 v4 v6 v16 v32 v64 v128]) + + + + + + ) diff --git a/src/emmy/mathbox/marching-cubes/triangle_table.cljs b/src/emmy/mathbox/marching-cubes/triangle_table.cljs new file mode 100644 index 00000000..d7a44d51 --- /dev/null +++ b/src/emmy/mathbox/marching-cubes/triangle_table.cljs @@ -0,0 +1,264 @@ +(ns emmy.mathbox.marching-cubes.triangle-table) + +(def TriangleTable + "Lookup table that defines the isosurface facets for determining where the isosurface point sits relative to the isosurface facet" + + [ + [] + [[0 8 3]] + [[0 1 9]] + [[1 8 3] [9 8 1]] + [[1 2 10]] + [[0 8 3] [1 2 10]] + [[9 2 10] [0 2 9]] + [[2 8 3] [2 10 8] [10 9 8]] + [[3 11 2]] + [[0 11 2] [8 11 0]] + [[1 9 0] [2 3 11]] + [[1 11 2] [1 9 11] [9 8 11]] + [[3 10 1] [11 10 3]] + [[0 10 1] [0 8 10] [8 11 10]] + [[3 9 0] [3 11 9] [11 10 9]] + [[9 8 10] [10 8 11]] + [[4 7 8]] + [[4 3 0] [7 3 4]] + [[0 1 9] [8 4 7]] + [[4 1 9] [4 7 1] [7 3 1]] + [[1 2 10] [8 4 7]] + [[3 4 7] [3 0 4] [1 2 10]] + [[9 2 10] [9 0 2] [8 4 7]] + [[2 10 9] [2 9 7] [2 7 3] [7 9 4]] + [[8 4 7] [3 11 2]] + [[11 4 7] [11 2 4] [2 0 4]] + [[9 0 1] [8 4 7] [2 3 11]] + [[4 7 11] [9 4 11] [9 11 2] [9 2 1]] + [[3 10 1] [3 11 10] [7 8 4]] + [[1 11 10] [1 4 11] [1 0 4] [7 11 4]] + [[4 7 8] [9 0 11] [9 11 10] [11 0 3]] + [[4 7 11] [4 11 9] [9 11 10]] + [[9 5 4]] + [[9 5 4] [0 8 3]] + [[0 5 4] [1 5 0]] + [[8 5 4] [8 3 5] [3 1 5]] + [[1 2 10] [9 5 4]] + [[3 0 8] [1 2 10] [4 9 5]] + [[5 2 10] [5 4 2] [4 0 2]] + [[2 10 5] [3 2 5] [3 5 4] [3 4 8]] + [[9 5 4] [2 3 11]] + [[0 11 2] [0 8 11] [4 9 5]] + [[0 5 4] [0 1 5] [2 3 11]] + [[2 1 5] [2 5 8] [2 8 11] [4 8 5]] + [[10 3 11] [10 1 3] [9 5 4]] + [[4 9 5] [0 8 1] [8 10 1] [8 11 10]] + [[5 4 0] [5 0 11] [5 11 10] [11 0 3]] + [[5 4 8] [5 8 10] [10 8 11]] + [[9 7 8] [5 7 9]] + [[9 3 0] [9 5 3] [5 7 3]] + [[0 7 8] [0 1 7] [1 5 7]] + [[1 5 3] [3 5 7]] + [[9 7 8] [9 5 7] [10 1 2]] + [[10 1 2] [9 5 0] [5 3 0] [5 7 3]] + [[8 0 2] [8 2 5] [8 5 7] [10 5 2]] + [[2 10 5] [2 5 3] [3 5 7]] + [[7 9 5] [7 8 9] [3 11 2]] + [[9 5 7] [9 7 2] [9 2 0] [2 7 11]] + [[2 3 11] [0 1 8] [1 7 8] [1 5 7]] + [[11 2 1] [11 1 7] [7 1 5]] + [[9 5 8] [8 5 7] [10 1 3] [10 3 11]] + [[5 7 0] [5 0 9] [7 11 0] [1 0 10] [11 10 0]] + [[11 10 0] [11 0 3] [10 5 0] [8 0 7] [5 7 0]] + [[11 10 5] [7 11 5]] + [[10 6 5]] + [[0 8 3] [5 10 6]] + [[9 0 1] [5 10 6]] + [[1 8 3] [1 9 8] [5 10 6]] + [[1 6 5] [2 6 1]] + [[1 6 5] [1 2 6] [3 0 8]] + [[9 6 5] [9 0 6] [0 2 6]] + [[5 9 8] [5 8 2] [5 2 6] [3 2 8]] + [[2 3 11] [10 6 5]] + [[11 0 8] [11 2 0] [10 6 5]] + [[0 1 9] [2 3 11] [5 10 6]] + [[5 10 6] [1 9 2] [9 11 2] [9 8 11]] + [[6 3 11] [6 5 3] [5 1 3]] + [[0 8 11] [0 11 5] [0 5 1] [5 11 6]] + [[3 11 6] [0 3 6] [0 6 5] [0 5 9]] + [[6 5 9] [6 9 11] [11 9 8]] + [[5 10 6] [4 7 8]] + [[4 3 0] [4 7 3] [6 5 10]] + [[1 9 0] [5 10 6] [8 4 7]] + [[10 6 5] [1 9 7] [1 7 3] [7 9 4]] + [[6 1 2] [6 5 1] [4 7 8]] + [[1 2 5] [5 2 6] [3 0 4] [3 4 7]] + [[8 4 7] [9 0 5] [0 6 5] [0 2 6]] + [[7 3 9] [7 9 4] [3 2 9] [5 9 6] [2 6 9]] + [[3 11 2] [7 8 4] [10 6 5]] + [[5 10 6] [4 7 2] [4 2 0] [2 7 11]] + [[0 1 9] [4 7 8] [2 3 11] [5 10 6]] + [[9 2 1] [9 11 2] [9 4 11] [7 11 4] [5 10 6]] + [[8 4 7] [3 11 5] [3 5 1] [5 11 6]] + [[5 1 11] [5 11 6] [1 0 11] [7 11 4] [0 4 11]] + [[0 5 9] [0 6 5] [0 3 6] [11 6 3] [8 4 7]] + [[6 5 9] [6 9 11] [4 7 9] [7 11 9]] + [[10 4 9] [6 4 10]] + [[4 10 6] [4 9 10] [0 8 3]] + [[10 0 1] [10 6 0] [6 4 0]] + [[8 3 1] [8 1 6] [8 6 4] [6 1 10]] + [[1 4 9] [1 2 4] [2 6 4]] + [[3 0 8] [1 2 9] [2 4 9] [2 6 4]] + [[0 2 4] [4 2 6]] + [[8 3 2] [8 2 4] [4 2 6]] + [[10 4 9] [10 6 4] [11 2 3]] + [[0 8 2] [2 8 11] [4 9 10] [4 10 6]] + [[3 11 2] [0 1 6] [0 6 4] [6 1 10]] + [[6 4 1] [6 1 10] [4 8 1] [2 1 11] [8 11 1]] + [[9 6 4] [9 3 6] [9 1 3] [11 6 3]] + [[8 11 1] [8 1 0] [11 6 1] [9 1 4] [6 4 1]] + [[3 11 6] [3 6 0] [0 6 4]] + [[6 4 8] [11 6 8]] + [[7 10 6] [7 8 10] [8 9 10]] + [[0 7 3] [0 10 7] [0 9 10] [6 7 10]] + [[10 6 7] [1 10 7] [1 7 8] [1 8 0]] + [[10 6 7] [10 7 1] [1 7 3]] + [[1 2 6] [1 6 8] [1 8 9] [8 6 7]] + [[2 6 9] [2 9 1] [6 7 9] [0 9 3] [7 3 9]] + [[7 8 0] [7 0 6] [6 0 2]] + [[7 3 2] [6 7 2]] + [[2 3 11] [10 6 8] [10 8 9] [8 6 7]] + [[2 0 7] [2 7 11] [0 9 7] [6 7 10] [9 10 7]] + [[1 8 0] [1 7 8] [1 10 7] [6 7 10] [2 3 11]] + [[11 2 1] [11 1 7] [10 6 1] [6 7 1]] + [[8 9 6] [8 6 7] [9 1 6] [11 6 3] [1 3 6]] + [[0 9 1] [11 6 7]] + [[7 8 0] [7 0 6] [3 11 0] [11 6 0]] + [[7 11 6]] + [[7 6 11]] + [[3 0 8] [11 7 6]] + [[0 1 9] [11 7 6]] + [[8 1 9] [8 3 1] [11 7 6]] + [[10 1 2] [6 11 7]] + [[1 2 10] [3 0 8] [6 11 7]] + [[2 9 0] [2 10 9] [6 11 7]] + [[6 11 7] [2 10 3] [10 8 3] [10 9 8]] + [[7 2 3] [6 2 7]] + [[7 0 8] [7 6 0] [6 2 0]] + [[2 7 6] [2 3 7] [0 1 9]] + [[1 6 2] [1 8 6] [1 9 8] [8 7 6]] + [[10 7 6] [10 1 7] [1 3 7]] + [[10 7 6] [1 7 10] [1 8 7] [1 0 8]] + [[0 3 7] [0 7 10] [0 10 9] [6 10 7]] + [[7 6 10] [7 10 8] [8 10 9]] + [[6 8 4] [11 8 6]] + [[3 6 11] [3 0 6] [0 4 6]] + [[8 6 11] [8 4 6] [9 0 1]] + [[9 4 6] [9 6 3] [9 3 1] [11 3 6]] + [[6 8 4] [6 11 8] [2 10 1]] + [[1 2 10] [3 0 11] [0 6 11] [0 4 6]] + [[4 11 8] [4 6 11] [0 2 9] [2 10 9]] + [[10 9 3] [10 3 2] [9 4 3] [11 3 6] [4 6 3]] + [[8 2 3] [8 4 2] [4 6 2]] + [[0 4 2] [4 6 2]] + [[1 9 0] [2 3 4] [2 4 6] [4 3 8]] + [[1 9 4] [1 4 2] [2 4 6]] + [[8 1 3] [8 6 1] [8 4 6] [6 10 1]] + [[10 1 0] [10 0 6] [6 0 4]] + [[4 6 3] [4 3 8] [6 10 3] [0 3 9] [10 9 3]] + [[10 9 4] [6 10 4]] + [[4 9 5] [7 6 11]] + [[0 8 3] [4 9 5] [11 7 6]] + [[5 0 1] [5 4 0] [7 6 11]] + [[11 7 6] [8 3 4] [3 5 4] [3 1 5]] + [[9 5 4] [10 1 2] [7 6 11]] + [[6 11 7] [1 2 10] [0 8 3] [4 9 5]] + [[7 6 11] [5 4 10] [4 2 10] [4 0 2]] + [[3 4 8] [3 5 4] [3 2 5] [10 5 2] [11 7 6]] + [[7 2 3] [7 6 2] [5 4 9]] + [[9 5 4] [0 8 6] [0 6 2] [6 8 7]] + [[3 6 2] [3 7 6] [1 5 0] [5 4 0]] + [[6 2 8] [6 8 7] [2 1 8] [4 8 5] [1 5 8]] + [[9 5 4] [10 1 6] [1 7 6] [1 3 7]] + [[1 6 10] [1 7 6] [1 0 7] [8 7 0] [9 5 4]] + [[4 0 10] [4 10 5] [0 3 10] [6 10 7] [3 7 10]] + [[7 6 10] [7 10 8] [5 4 10] [4 8 10]] + [[6 9 5] [6 11 9] [11 8 9]] + [[3 6 11] [0 6 3] [0 5 6] [0 9 5]] + [[0 11 8] [0 5 11] [0 1 5] [5 6 11]] + [[6 11 3] [6 3 5] [5 3 1]] + [[1 2 10] [9 5 11] [9 11 8] [11 5 6]] + [[0 11 3] [0 6 11] [0 9 6] [5 6 9] [1 2 10]] + [[11 8 5] [11 5 6] [8 0 5] [10 5 2] [0 2 5]] + [[6 11 3] [6 3 5] [2 10 3] [10 5 3]] + [[5 8 9] [5 2 8] [5 6 2] [3 8 2]] + [[9 5 6] [9 6 0] [0 6 2]] + [[1 5 8] [1 8 0] [5 6 8] [3 8 2] [6 2 8]] + [[1 5 6] [2 1 6]] + [[1 3 6] [1 6 10] [3 8 6] [5 6 9] [8 9 6]] + [[10 1 0] [10 0 6] [9 5 0] [5 6 0]] + [[0 3 8] [5 6 10]] + [[10 5 6]] + [[11 5 10] [7 5 11]] + [[11 5 10] [11 7 5] [8 3 0]] + [[5 11 7] [5 10 11] [1 9 0]] + [[10 7 5] [10 11 7] [9 8 1] [8 3 1]] + [[11 1 2] [11 7 1] [7 5 1]] + [[0 8 3] [1 2 7] [1 7 5] [7 2 11]] + [[9 7 5] [9 2 7] [9 0 2] [2 11 7]] + [[7 5 2] [7 2 11] [5 9 2] [3 2 8] [9 8 2]] + [[2 5 10] [2 3 5] [3 7 5]] + [[8 2 0] [8 5 2] [8 7 5] [10 2 5]] + [[9 0 1] [5 10 3] [5 3 7] [3 10 2]] + [[9 8 2] [9 2 1] [8 7 2] [10 2 5] [7 5 2]] + [[1 3 5] [3 7 5]] + [[0 8 7] [0 7 1] [1 7 5]] + [[9 0 3] [9 3 5] [5 3 7]] + [[9 8 7] [5 9 7]] + [[5 8 4] [5 10 8] [10 11 8]] + [[5 0 4] [5 11 0] [5 10 11] [11 3 0]] + [[0 1 9] [8 4 10] [8 10 11] [10 4 5]] + [[10 11 4] [10 4 5] [11 3 4] [9 4 1] [3 1 4]] + [[2 5 1] [2 8 5] [2 11 8] [4 5 8]] + [[0 4 11] [0 11 3] [4 5 11] [2 11 1] [5 1 11]] + [[0 2 5] [0 5 9] [2 11 5] [4 5 8] [11 8 5]] + [[9 4 5] [2 11 3]] + [[2 5 10] [3 5 2] [3 4 5] [3 8 4]] + [[5 10 2] [5 2 4] [4 2 0]] + [[3 10 2] [3 5 10] [3 8 5] [4 5 8] [0 1 9]] + [[5 10 2] [5 2 4] [1 9 2] [9 4 2]] + [[8 4 5] [8 5 3] [3 5 1]] + [[0 4 5] [1 0 5]] + [[8 4 5] [8 5 3] [9 0 5] [0 3 5]] + [[9 4 5]] + [[4 11 7] [4 9 11] [9 10 11]] + [[0 8 3] [4 9 7] [9 11 7] [9 10 11]] + [[1 10 11] [1 11 4] [1 4 0] [7 4 11]] + [[3 1 4] [3 4 8] [1 10 4] [7 4 11] [10 11 4]] + [[4 11 7] [9 11 4] [9 2 11] [9 1 2]] + [[9 7 4] [9 11 7] [9 1 11] [2 11 1] [0 8 3]] + [[11 7 4] [11 4 2] [2 4 0]] + [[11 7 4] [11 4 2] [8 3 4] [3 2 4]] + [[2 9 10] [2 7 9] [2 3 7] [7 4 9]] + [[9 10 7] [9 7 4] [10 2 7] [8 7 0] [2 0 7]] + [[3 7 10] [3 10 2] [7 4 10] [1 10 0] [4 0 10]] + [[1 10 2] [8 7 4]] + [[4 9 1] [4 1 7] [7 1 3]] + [[4 9 1] [4 1 7] [0 8 1] [8 7 1]] + [[4 0 3] [7 4 3]] + [[4 8 7]] + [[9 10 8] [10 11 8]] + [[3 0 9] [3 9 11] [11 9 10]] + [[0 1 10] [0 10 8] [8 10 11]] + [[3 1 10] [11 3 10]] + [[1 2 11] [1 11 9] [9 11 8]] + [[3 0 9] [3 9 11] [1 2 9] [2 11 9]] + [[0 2 11] [8 0 11]] + [[3 2 11]] + [[2 3 8] [2 8 10] [10 8 9]] + [[9 10 2] [0 9 2]] + [[2 3 8] [2 8 10] [0 1 8] [1 10 8]] + [[1 10 2]] + [[1 3 8] [9 1 8]] + [[0 9 1]] + [[0 3 8]] + [] +] +) diff --git a/src/emmy/mathbox/plot.cljs b/src/emmy/mathbox/plot.cljs index 33abf20f..841db636 100644 --- a/src/emmy/mathbox/plot.cljs +++ b/src/emmy/mathbox/plot.cljs @@ -923,6 +923,27 @@ (assoc opts :z-order z-order :color color)]]) +(defn ImplicitSurface + "Component that plots an implicit surface `f(x,y,z)=0` + Required arguments: + - `:lhs`: the lhs of a function, in the form `f(x,y,z)` + - `:rhs`: the rhs of the function + + Optional Arguments: + + - points + + " +[{:keys [f] :as opts}] + + (MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) +;; Surface2d Takes and :expr...I think I want to send in points. + ) + +(defn MarchingCubes [f x y z xStep yStep zStep c] + + + ) (defn ParametricSurface "Component that plots a parametric surface defined by `f` into the scene along From 16289baf0a4c59204b7a8a990c9273b8c50c93bf Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Fri, 30 Jun 2023 16:19:55 -0700 Subject: [PATCH 02/11] WIP: marching cubes mostly implemented. untested. --- .../marching-cubes/marching_cubes.cljs | 98 ++++++++++--------- 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs index 9965df2f..9475ddf7 100644 --- a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs @@ -8,56 +8,66 @@ ;; returns the 8 bit number associated with that edge [(reduce + (map-index (fn [item index] - (* (if (> item rhs) 1 0) - (pow 2 index)))))] - ) + (* (if (> item rhs) 1 0) + (pow 2 index)))))]) +(defn interp + [x y a b c] + (let [t (/ (- c a) (- b a))] + (+ (* x (- 1 t)) (* y t)))) (defn IsosurfaceEdgePoints - [index x y z xStep yStep zStep v1 v2...] -;;TODO - start from here...https://github.com/ChristopherChudzicki/math3d-react/blob/e352d15d275fc2e060441ecf11574e2fdec3211b/client/src/utils/marchingCubes/index.js#L54 - (case index - 0 [(interp x (+ x xStep) v1 v2 rhs) y z] - 1 - 2 - 3 - 4 - 5 - 6 - 7 - ) - - ) - - - -(defn MarchingCubes [lhs righ xMin xMax yMin yMax zMin zMax resolution] - ;; loop over x,y, z in the steps - ;; pos {:x .. :y .. :z .. :xMin .. :xMax...} - MarchingCubes pos - CubeCase (CubeIndex ) - ;; - - ) - -(defn CubeIndex) - -(defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep ] - (let [ - v1 (lhs x y z) + [x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs index] + ;;https://github.com/ChristopherChudzicki/math3d-react/blob/e352d15d275fc2e060441ecf11574e2fdec3211b/client/src/utils/marchingCubes/index.js#L54 + (let [xInc (+ x xStep) + yInc (+ y yStep) + zInc (+ z zStep)] + (case index + 0 [(interp x xInc v1 v2 rhs) y z] + 1 [xInc y (interp z, zInc v2 v4 rhs)] + 2 [(interp x xInc v4 v8 rhs) y zInc] + 3 [x y (interp z zInc v1 v8 rhs)] + 4 [(interp x xInc v16 v32 rhs) yInc z] + 5 [xInc yInc (interp z zInc v32 v64 rhs)] + 6 [(interp x xInc v128 v64 rhs) yInc zInc] + 7 [x yInc (interp z zInc v16 v128 rhs)] + 8 [x (interp y yInc v2 v16 rhs) z] + 9 [xInc (interp y (+ y ystep) v2 v32 rhs) z] + 10 [xInc (interp y yInc v4 v64 rhs)] + 11 [(x (interp y yInc v8 v128 rhs) zInc)] + "Index must be between 0 and 11" ;TODO how do I throw errors in clojure? + ))) + +(defn GenRange [minVal maxVal resolution] + (map (fn [x] (+ (* x resolution) minVal)) + (take (int (/ (- maxVal minVal) resolution)) (range)))) + +(defn GenerateGrid [xMin xMax yMin yMax zMin zMax resolution] + (let [xVals (GenRange xMin xMax resolution) + yVals (GenRange yMin yMax resolution) + zVals (GenRange zMin zMax resoultion)] + + (for x xVals (for y yVals (for z zVals '(x y z)))) ; multidimensional list of permutation. + ;; (for [x xVals y yVals z zVals] '(x y z)) ; Flat list of permutation + )) + +(defn MarchingCubes [lhs rhs xMin xMax yMin yMax zMin zMax resolution] + (def points ()) + + (for x y z (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) + (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points)) + + (points)) + +(defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep] + (let [v1 (lhs x y z) v2 (lhs (+ x xStep) y z) v4 (lhs (+ x xStep) y (+ z zStep)) v8 (lhs x y (+ z zStep)) v16 (lhs x (+ y yStep) z) - v32 (lhs (+ x xStep) (+ y yStep) z ) + v32 (lhs (+ x xStep) (+ y yStep) z) v64 (lhs (+ x xStep) (+ y yStep) (+ z zStep)) - v128 (lhs x (+ y yStep) (+ z zStep)) - ] - - (CubeIndex [v1 v2 v4 v6 v16 v32 v64 v128]) - - - - + v128 (lhs x (+ y yStep) (+ z zStep))] - ) + (let [IsosurfaceEdgePointsPartial (partial IsosurfaceEdgePoints x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs)]) + (map IsosurfaceEdgePoints (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128])))) From aaf2704eb8e2f1a40859ce947f22141b5450f641 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Wed, 5 Jul 2023 13:02:57 -0700 Subject: [PATCH 03/11] add in triangle tables --- .../marching-cubes/marching_cubes.cljs | 23 +++++++++++-------- .../marching-cubes/triangle_table.cljs | 1 + 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs index 9475ddf7..81fd1eba 100644 --- a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching-cubes/marching_cubes.cljs @@ -1,4 +1,5 @@ -(ns emmy.mathbox.marching-cubes.marching-cubes) +(ns emmy.mathbox.marching-cubes.marching-cubes + (:require [emmy.mathbox.marching-cubes.triangle_table :as tt])) (defn CubeIndex "Returns index into 256 value Triangle Lookup Table" @@ -51,14 +52,6 @@ ;; (for [x xVals y yVals z zVals] '(x y z)) ; Flat list of permutation )) -(defn MarchingCubes [lhs rhs xMin xMax yMin yMax zMin zMax resolution] - (def points ()) - - (for x y z (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) - (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points)) - - (points)) - (defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep] (let [v1 (lhs x y z) v2 (lhs (+ x xStep) y z) @@ -70,4 +63,14 @@ v128 (lhs x (+ y yStep) (+ z zStep))] (let [IsosurfaceEdgePointsPartial (partial IsosurfaceEdgePoints x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs)]) - (map IsosurfaceEdgePoints (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128])))) + (map IsosurfaceEdgePoints (tt/TriangleTable (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128]))))) + + +(defn MarchingCubes [lhs rhs xMin xMax yMin yMax zMin zMax resolution] + (def points ()) + + (for x y z (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) + (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points)) + + (points)) + diff --git a/src/emmy/mathbox/marching-cubes/triangle_table.cljs b/src/emmy/mathbox/marching-cubes/triangle_table.cljs index d7a44d51..7799486c 100644 --- a/src/emmy/mathbox/marching-cubes/triangle_table.cljs +++ b/src/emmy/mathbox/marching-cubes/triangle_table.cljs @@ -1,5 +1,6 @@ (ns emmy.mathbox.marching-cubes.triangle-table) + (def TriangleTable "Lookup table that defines the isosurface facets for determining where the isosurface point sits relative to the isosurface facet" From dbcecc0bc2077044661a55cdeb10152a0eab5c91 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Wed, 5 Jul 2023 13:03:24 -0700 Subject: [PATCH 04/11] start on plotting stuff --- src/emmy/mathbox/plot.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/emmy/mathbox/plot.cljs b/src/emmy/mathbox/plot.cljs index 841db636..92baf474 100644 --- a/src/emmy/mathbox/plot.cljs +++ b/src/emmy/mathbox/plot.cljs @@ -4,6 +4,7 @@ (:refer-clojure :exclude [max]) (:require [clojure.set :as cs] [emmy.mathbox.color :as color] + [emmy.mathbox.marching_cubes :as mcubes] [emmy.viewer.plot :as p] [mathbox.primitives :as mb] ["katex" :as katex] @@ -923,8 +924,9 @@ (assoc opts :z-order z-order :color color)]]) + (defn ImplicitSurface - "Component that plots an implicit surface `f(x,y,z)=0` + "Component that plots an implicit surface `f(x,y,z)=0` Required arguments: - `:lhs`: the lhs of a function, in the form `f(x,y,z)` - `:rhs`: the rhs of the function @@ -936,14 +938,14 @@ " [{:keys [f] :as opts}] - (MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) + (mcubes/MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) ;; Surface2d Takes and :expr...I think I want to send in points. ) -(defn MarchingCubes [f x y z xStep yStep zStep c] +;; for Marching cubes we determin a bunch of isosurface facets, we then iterate of the xyz range +;; and evaluate where that point sits on the function and where - ) (defn ParametricSurface "Component that plots a parametric surface defined by `f` into the scene along From 83d47cf91fc10dc8262626375f5c12bc8037a868 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Wed, 5 Jul 2023 13:58:30 -0700 Subject: [PATCH 05/11] rename directory, debug namespace loading (loads!) next up testing the marching cubes implementation for correctness --- .../marching_cubes.cljs | 44 ++++++++++++------- .../triangle_table.cljs | 0 2 files changed, 29 insertions(+), 15 deletions(-) rename src/emmy/mathbox/{marching-cubes => marching_cubes}/marching_cubes.cljs (69%) rename src/emmy/mathbox/{marching-cubes => marching_cubes}/triangle_table.cljs (100%) diff --git a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs similarity index 69% rename from src/emmy/mathbox/marching-cubes/marching_cubes.cljs rename to src/emmy/mathbox/marching_cubes/marching_cubes.cljs index 81fd1eba..2ee7273a 100644 --- a/src/emmy/mathbox/marching-cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs @@ -1,16 +1,18 @@ (ns emmy.mathbox.marching-cubes.marching-cubes - (:require [emmy.mathbox.marching-cubes.triangle_table :as tt])) + (:require [emmy.mathbox.marching-cubes.triangle-table :as tt + ])) (defn CubeIndex "Returns index into 256 value Triangle Lookup Table" - [vertex_vector] + [vertex_vector rhs] + ;; TODO double check the index implementation. ;; compares vertex position to rhs of surface function and ;; returns the 8 bit number associated with that edge - [(reduce + (map-index + [(reduce + (map-indexed (fn [item index] (* (if (> item rhs) 1 0) - (pow 2 index)))))]) + (Math/pow 2 index))) vertex_vector))]) (defn interp [x y a b c] @@ -33,7 +35,7 @@ 6 [(interp x xInc v128 v64 rhs) yInc zInc] 7 [x yInc (interp z zInc v16 v128 rhs)] 8 [x (interp y yInc v2 v16 rhs) z] - 9 [xInc (interp y (+ y ystep) v2 v32 rhs) z] + 9 [xInc (interp y (+ y yInc) v2 v32 rhs) z] 10 [xInc (interp y yInc v4 v64 rhs)] 11 [(x (interp y yInc v8 v128 rhs) zInc)] "Index must be between 0 and 11" ;TODO how do I throw errors in clojure? @@ -46,11 +48,14 @@ (defn GenerateGrid [xMin xMax yMin yMax zMin zMax resolution] (let [xVals (GenRange xMin xMax resolution) yVals (GenRange yMin yMax resolution) - zVals (GenRange zMin zMax resoultion)] + zVals (GenRange zMin zMax resolution)] - (for x xVals (for y yVals (for z zVals '(x y z)))) ; multidimensional list of permutation. + ;; TODO fix for loops + ;; (for x xVals (for y yVals (for z zVals '(x y z)))) ; multidimensional list of permutation. ;; (for [x xVals y yVals z zVals] '(x y z)) ; Flat list of permutation - )) + (for [x xVals y yVals z zVals] + '(x y z)) + )) ; multidimensional list of permutation. (defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep] (let [v1 (lhs x y z) @@ -63,14 +68,23 @@ v128 (lhs x (+ y yStep) (+ z zStep))] (let [IsosurfaceEdgePointsPartial (partial IsosurfaceEdgePoints x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs)]) - (map IsosurfaceEdgePoints (tt/TriangleTable (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128]))))) + (map IsosurfaceEdgePoints (tt/TriangleTable (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128] rhs))))) +;; TODO add defaults (defn MarchingCubes [lhs rhs xMin xMax yMin yMax zMin zMax resolution] (def points ()) - - (for x y z (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) - (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points)) - - (points)) - + (def xStep (GenRange xMin xMax resolution)) + (def yStep (GenRange yMin yMax resolution)) + (def zStep (GenRange zMin zMax resolution)) + ;; (for (x y z) (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) + ;; XXX: does this kind of destructuring work? + (for [point (GenerateGrid xMin xMax yMin yMax zMin zMax resolution)] + (let [x (point 1) + y (point 2) + z (point 3)] + (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points) + ) + ) + (points) +) diff --git a/src/emmy/mathbox/marching-cubes/triangle_table.cljs b/src/emmy/mathbox/marching_cubes/triangle_table.cljs similarity index 100% rename from src/emmy/mathbox/marching-cubes/triangle_table.cljs rename to src/emmy/mathbox/marching_cubes/triangle_table.cljs From 5cf991756c5f189453658ca5dab3b11b78eb2cab Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Thu, 6 Jul 2023 14:38:01 -0700 Subject: [PATCH 06/11] Seems to work! gives values close to the rhs. ...for (TestLhs 1). But there are some points with only 2 entries. huh. Need to set up tests. --- .../marching_cubes/marching_cubes.cljs | 87 ++++++++++--------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs index 2ee7273a..3a6b3fc3 100644 --- a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs @@ -1,18 +1,19 @@ (ns emmy.mathbox.marching-cubes.marching-cubes - (:require [emmy.mathbox.marching-cubes.triangle-table :as tt - ])) + (:require [emmy.mathbox.marching-cubes.triangle-table :as tt])) (defn CubeIndex "Returns index into 256 value Triangle Lookup Table" [vertex_vector rhs] - ;; TODO double check the index implementation. ;; compares vertex position to rhs of surface function and ;; returns the 8 bit number associated with that edge - [(reduce + (map-indexed - (fn [item index] - (* (if (> item rhs) 1 0) - (Math/pow 2 index))) vertex_vector))]) + (let [bit_exp (map-indexed + + (fn [index item] + (* (if (> item rhs) 1 0) + (Math/pow 2 index))) + vertex_vector)] + (reduce + bit_exp))) (defn interp [x y a b c] @@ -37,25 +38,23 @@ 8 [x (interp y yInc v2 v16 rhs) z] 9 [xInc (interp y (+ y yInc) v2 v32 rhs) z] 10 [xInc (interp y yInc v4 v64 rhs)] - 11 [(x (interp y yInc v8 v128 rhs) zInc)] - "Index must be between 0 and 11" ;TODO how do I throw errors in clojure? + 11 [x (interp y yInc v8 v128 rhs) zInc] + (println (str "Index must be between 0 and 11. Given: " index)) ;TODO how do I throw errors in clojure? ))) -(defn GenRange [minVal maxVal resolution] - (map (fn [x] (+ (* x resolution) minVal)) - (take (int (/ (- maxVal minVal) resolution)) (range)))) +(defn GenRange [minVal maxVal numPoints] + (map (fn [x] (+ (* x (/ (- maxVal minVal) numPoints)) minVal)) + ;; (take (int (/ (- maxVal minVal) resolution)) (range)) ;;XXX this was wrong + (take numPoints (range)))) (defn GenerateGrid [xMin xMax yMin yMax zMin zMax resolution] - (let [xVals (GenRange xMin xMax resolution) + (println "generating grid") + (let [points () + xVals (GenRange xMin xMax resolution) yVals (GenRange yMin yMax resolution) zVals (GenRange zMin zMax resolution)] - - ;; TODO fix for loops - ;; (for x xVals (for y yVals (for z zVals '(x y z)))) ; multidimensional list of permutation. - ;; (for [x xVals y yVals z zVals] '(x y z)) ; Flat list of permutation - (for [x xVals y yVals z zVals] - '(x y z)) - )) ; multidimensional list of permutation. + (for [x xVals y yVals z zVals] + [x y z]))) (defn MarchingCubesCore [lhs rhs x y z xStep yStep zStep] (let [v1 (lhs x y z) @@ -67,24 +66,34 @@ v64 (lhs (+ x xStep) (+ y yStep) (+ z zStep)) v128 (lhs x (+ y yStep) (+ z zStep))] - (let [IsosurfaceEdgePointsPartial (partial IsosurfaceEdgePoints x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs)]) - (map IsosurfaceEdgePoints (tt/TriangleTable (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128] rhs))))) + (let [IsosurfaceEdgePointsPartial (partial IsosurfaceEdgePoints x y z xStep yStep zStep v1 v2 v4 v8 v16 v32 v64 v128 lhs rhs) + indexVal (CubeIndex [v1 v2 v4 v8 v16 v32 v64 v128] rhs)] + + (for [triangle (tt/TriangleTable indexVal)] + (map IsosurfaceEdgePointsPartial triangle))))) + +(defn MarchingCubes [lhs rhs + & {:keys [xMin xMax yMin yMax zMin zMax resolution] + :or {xMin -1 xMax 1 yMin -1 yMax 1 zMin -1 zMax 1 resolution 100}}] + (println "starting marching cubes") + + (def xStep (/ 1 resolution)) + (def yStep (/ 1 resolution)) + (def zStep (/ 1 resolution)) + + (def grid (GenerateGrid xMin xMax yMin yMax zMin zMax resolution)) + + (println "stepsizes defined: " zStep) + (println (type grid)) + (println "10th grid point" (nth grid 10)) + (filter not-empty ;; XXX somehow some of these only return 'points' with 2 entries....they seem to mostly evaluate to the RHS though! + (for [point grid] + (let [x (point 0) + y (point 1) + z (point 2)] + (MarchingCubesCore lhs rhs x y z xStep yStep zStep))))) -;; TODO add defaults -(defn MarchingCubes [lhs rhs xMin xMax yMin yMax zMin zMax resolution] - (def points ()) - (def xStep (GenRange xMin xMax resolution)) - (def yStep (GenRange yMin yMax resolution)) - (def zStep (GenRange zMin zMax resolution)) - ;; (for (x y z) (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) - ;; XXX: does this kind of destructuring work? - (for [point (GenerateGrid xMin xMax yMin yMax zMin zMax resolution)] - (let [x (point 1) - y (point 2) - z (point 3)] - (conj (MarchingCubesCore lhs rhs x y z xStep yStep zStep) points) - ) - ) - (points) -) +(defn TestLhs [x y z] + (reduce + + (map (fn [a] (Math/pow a 2)) [x y z]))) From 0a2842bb952cec91bf84f5f4bb8840896b911dbf Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Thu, 6 Jul 2023 14:45:41 -0700 Subject: [PATCH 07/11] defs -> let --- .../marching_cubes/marching_cubes.cljs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs index 3a6b3fc3..63859bf5 100644 --- a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs @@ -75,24 +75,20 @@ (defn MarchingCubes [lhs rhs & {:keys [xMin xMax yMin yMax zMin zMax resolution] :or {xMin -1 xMax 1 yMin -1 yMax 1 zMin -1 zMax 1 resolution 100}}] - (println "starting marching cubes") + (let [ + xStep (/ 1 resolution) + yStep (/ 1 resolution) + zStep (/ 1 resolution) + grid (GenerateGrid xMin xMax yMin yMax zMin zMax resolution) + ] - (def xStep (/ 1 resolution)) - (def yStep (/ 1 resolution)) - (def zStep (/ 1 resolution)) - - (def grid (GenerateGrid xMin xMax yMin yMax zMin zMax resolution)) - - (println "stepsizes defined: " zStep) - (println (type grid)) - (println "10th grid point" (nth grid 10)) - - (filter not-empty ;; XXX somehow some of these only return 'points' with 2 entries....they seem to mostly evaluate to the RHS though! + (filter not-empty ;; XXX somehow some of these only return 'points' with 2 entries....they seem to mostly evaluate to the RHS though! (for [point grid] (let [x (point 0) y (point 1) z (point 2)] (MarchingCubesCore lhs rhs x y z xStep yStep zStep))))) + ) (defn TestLhs [x y z] (reduce + From 67f46f75f4edae60eaecb2ecf97a2201d6b48aa6 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Sat, 8 Jul 2023 16:21:16 -0700 Subject: [PATCH 08/11] Marching cubes repl test. --- src/emmy/mathbox/marching_cubes/marching_cubes.cljs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs index 63859bf5..61638075 100644 --- a/src/emmy/mathbox/marching_cubes/marching_cubes.cljs +++ b/src/emmy/mathbox/marching_cubes/marching_cubes.cljs @@ -90,6 +90,14 @@ (MarchingCubesCore lhs rhs x y z xStep yStep zStep))))) ) +(comment +;; Some repl functions and data + (defn TestLhs [x y z] (reduce + (map (fn [a] (Math/pow a 2)) [x y z]))) + +(do + (def MarchingCubes TestLhs 1 ) + nil) +) From ebca94189d06fc8f2c7c0193e54d67a1278ac433 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Sat, 8 Jul 2023 16:21:40 -0700 Subject: [PATCH 09/11] WIP: Stab at plotting utilities. --- src/emmy/mathbox/plot.clj | 7 +++++++ src/emmy/mathbox/plot.cljs | 42 ++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/emmy/mathbox/plot.clj b/src/emmy/mathbox/plot.clj index e0a2bc1c..6f445e38 100644 --- a/src/emmy/mathbox/plot.clj +++ b/src/emmy/mathbox/plot.clj @@ -727,3 +727,10 @@ (let [[f-bind opts] (mc/compile-3d opts :f 3)] (-> (c/wrap [f-bind] ['emmy.mathbox.plot/VectorField opts]) (ev/fragment scene)))) +(defn implicit-surface + [opts] + (let [[f-bind opts] (mc/compile-3d opts :f 3)] + (-> (c/wrap [f-bind] ['emmy.mathbox.plot/ImplicitSurface opts]) + (ev/fragment scene) + ) + )) diff --git a/src/emmy/mathbox/plot.cljs b/src/emmy/mathbox/plot.cljs index 92baf474..f2c5b80d 100644 --- a/src/emmy/mathbox/plot.cljs +++ b/src/emmy/mathbox/plot.cljs @@ -4,7 +4,7 @@ (:refer-clojure :exclude [max]) (:require [clojure.set :as cs] [emmy.mathbox.color :as color] - [emmy.mathbox.marching_cubes :as mcubes] + [emmy.mathbox.marching-cubes.marching-cubes :as mcubes] [emmy.viewer.plot :as p] [mathbox.primitives :as mb] ["katex" :as katex] @@ -925,27 +925,6 @@ :z-order z-order :color color)]]) -(defn ImplicitSurface - "Component that plots an implicit surface `f(x,y,z)=0` - Required arguments: - - `:lhs`: the lhs of a function, in the form `f(x,y,z)` - - `:rhs`: the rhs of the function - - Optional Arguments: - - - points - - " -[{:keys [f] :as opts}] - - (mcubes/MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) -;; Surface2d Takes and :expr...I think I want to send in points. - ) - -;; for Marching cubes we determin a bunch of isosurface facets, we then iterate of the xyz range -;; and evaluate where that point sits on the function and where - - (defn ParametricSurface "Component that plots a parametric surface defined by `f` into the scene along @@ -1312,3 +1291,22 @@ :color "blue" :size 4 :end true}]]) + + + +(defn ImplicitSurface + "Component that plots an implicit surface `f(x,y,z)=0` + Required arguments: + - `:lhs`: the lhs of a function, in the form `f(x,y,z)` + - `:rhs`: the rhs of the function + + Optional Arguments: + + - points + + " +[{:keys [f] :as opts}] + + [(mb/Point {:coords (mcubes/MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) + :label "marching-cube"} )] + ) From 59dd1a74f0c8d9cb86a26ba0fdb40169d084aee5 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Thu, 13 Jul 2023 06:13:00 -0700 Subject: [PATCH 10/11] Use quoted function in plot.clj --- src/emmy/mathbox/plot.clj | 9 ++++----- src/emmy/mathbox/plot.cljs | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/emmy/mathbox/plot.clj b/src/emmy/mathbox/plot.clj index 6f445e38..d85c791c 100644 --- a/src/emmy/mathbox/plot.clj +++ b/src/emmy/mathbox/plot.clj @@ -727,10 +727,9 @@ (let [[f-bind opts] (mc/compile-3d opts :f 3)] (-> (c/wrap [f-bind] ['emmy.mathbox.plot/VectorField opts]) (ev/fragment scene)))) + (defn implicit-surface [opts] - (let [[f-bind opts] (mc/compile-3d opts :f 3)] - (-> (c/wrap [f-bind] ['emmy.mathbox.plot/ImplicitSurface opts]) - (ev/fragment scene) - ) - )) + ;; wrap returns a with-let in reagent.core which is imported in cljs somehow. + (-> (c/wrap [['in opts]] '(fn [in] ('emmy.mathbox.plot/ImplicitSurface in))) + (ev/fragment scene))) diff --git a/src/emmy/mathbox/plot.cljs b/src/emmy/mathbox/plot.cljs index f2c5b80d..b8d24997 100644 --- a/src/emmy/mathbox/plot.cljs +++ b/src/emmy/mathbox/plot.cljs @@ -1306,7 +1306,7 @@ " [{:keys [f] :as opts}] - - [(mb/Point {:coords (mcubes/MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs)) +(let [vals (mcubes/MarchingCubes (dissoc opts :lhs) (dissoc opts :rhs))]) + [(mb/Point {:coords vals :label "marching-cube"} )] ) From be4eb31a53dec951144779999ce507ade7220704 Mon Sep 17 00:00:00 2001 From: Nobie Redmon Date: Thu, 13 Jul 2023 06:15:50 -0700 Subject: [PATCH 11/11] Add implicit emmy notebook. --- dev/examples/mathbox/implicit.clj | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dev/examples/mathbox/implicit.clj diff --git a/dev/examples/mathbox/implicit.clj b/dev/examples/mathbox/implicit.clj new file mode 100644 index 00000000..0fa6498b --- /dev/null +++ b/dev/examples/mathbox/implicit.clj @@ -0,0 +1,29 @@ + +^{:nextjournal.clerk/visibility {:code :hide}} +(ns examples.mathbox.implicit + {:nextjournal.clerk/toc true} + (:refer-clojure + :exclude [+ - * / zero? compare divide numerator denominator + infinite? abs ref partial =]) + (:require [emmy.clerk :as ec] + [emmy.leva :as leva] + [emmy.env :as e :refer :all] + [emmy.viewer :as ev] + [emmy.mathbox.plot :as p])) + +{:nextjournal.clerk/width :full} + +^{:nextjournal.clerk/visibility {:code :hide :result :hide}} +(ec/install!) + +(defn Sphere [x y z] + (reduce + + (map (fn [a] (Math/pow a 2)) [x y z]))) + +(defn WrappedSphere [] + '(fn [x y z] (Sphere x y z))) + + +;; TODO need to eval this quoted funciton somewhere. +(p/implicit-surface {:lhs '(fn [x y z] + (reduce + (map (fn [a] (Math/pow a 2)) [x y z]))) :rhs 1})