Commit Graph

21 Commits

Author SHA1 Message Date
86fa682b31 feat: Application prototype (#14)
Creates a prototype user interface for dyna3 in the `app-proto` folder. The interface is dynamically constructed using [Sycamore](https://sycamore.dev).

The prototype includes:

  * An application state model (the `AppState` type)
    * A constraint problem model (the `Assembly` type), used in the application state
  * Two views
    * A 3D rendering of the assembly (the `Display` component)
    * A list of elements and constraints (the `Outline` component)

The following features confirm that the views can reflect and send input to the model:

  * You can select elements by clicking and shift-clicking them in the outline. The selected elements are highlighted in the display.
  * You can add elements using a button above the outline. The new elements appear in the display.

Co-authored-by: Aaron Fenyes <aaron.fenyes@fareycircles.ooo>
Reviewed-on: #14
Co-authored-by: Vectornaut <vectornaut@nobody@nowhere.net>
Co-committed-by: Vectornaut <vectornaut@nobody@nowhere.net>
2024-10-21 23:38:27 +00:00
b92be312e8 Engine prototype (#13)
This PR adds code for a Julia-language prototype of a configuration solver, in the `engine-proto` folder. It uses Julia version 1.10.0.

### Approaches
Development of this PR tried two broad approaches to the constraint geometry problem. Each one suggested various solution techniques. The Gram matrix approach, with the low-rank factorization technique, seems the most promising.

- **Algebraic** *(In the `alg-test` subfolder).* Write the constraints as polynomials in the inversive coordinates of the elements, and use computational algebraic geometry techniques to solve the resulting system. We tried the following techniques.
  - **Gröbner bases** *(`Engine.Algebraic.jl`).* Symbolic. Find a Gröbner basis for the ideal generated by the constraint equations. Information about the solution variety, like its codimension, is then relatively easy to extract.
  - **Homotopy continuation** *(`Engine.Numerical.jl`).* Numerical. Cut the solution set along a random hyperplane to get a generic zero-dimensional slice, and then use a fancy homotopy technique to approximate the points in that slice.

  A few notes about our experiences can be found on the [engine prototype](wiki/Engine-prototype) wiki page.
- **Gram matrix** *(in the `gram-test` subfolder).* A construction is described completely, up to conformal transformations, by the Gram matrix of the vectors representing its elements. Express the constraints as fixed entries of the Gram matrix, and use numerical linear algebra techniques to find a list of vectors whose Gram matrix fits the bill. We tried the following techniques.
  - **LDL decomposition** *(`gram-test.sage`, `gram-test.jl`, `overlap-test.jl`).* Find a cluster of up to five elements whose Gram matrix is completely filled in by the constraints. Use LDL decomposition to find a list of vectors with that Gram matrix. This technique can be made algebraic, as seen in `overlap-test.jl`.
  - **Low-rank factorization** *(source files listed in findings section).* Write down a quadratic loss function that says how far a set of vectors is from meeting the Gram matrix constraints. Use a smooth optimization technique like Newton's method or gradient descent to find a zero of the loss function. In addition to the polished prototype described in the results section, we have an early prototype using an off-the-shelf factorization package (`low-rank-test.jl`) and an visualization of the loss function landscape near global minima (`basin-shapes.jl`).

  The [Gram matrix parameterization](wiki/Gram-matrix-parameterization) wiki page contains detailed notes on this approach.

### Findings

With the algebraic approach, we hit a performance wall pretty quickly as our constructions grew. It was often hard to find real solutions of the polynomial system, since the techniques we use work most naturally in the complex world.

With the Gram matrix approach, on the other hand, we could solve interesting problems in acceptably short times using the low-rank factorization technique. We put the optimization routine in its own module (`Engine.jl`) and used it to solve five example problems:
- `overlapping-pyramids.jl`
- `circles-in-triangle.jl`
- `sphere-in-tetrahedron.jl`
- `tetrahedron-radius-ratio.jl`
- `irisawa-hexlet.jl`

We plan to use low-rank factorization of the Gram matrix in our first app prototype.

### Visualizations

We used the visualizer in the `ganja-test` folder to visually check our low-rank factorization results. The visualizer runs [Ganja.js](https://enkimute.github.io/ganja.js/) in an Electron app, made with [Blink](https://github.com/JuliaGizmos/Blink.jl). Although Ganja.js makes beautiful pictures under most circumstances, we found two obstacles to using it in production.

- It seems to have precision problems with low-curvature spheres.
- We couldn't figure out how to customize its clipping and transparency settings, and the default settings often obscure construction details.

Co-authored-by: Aaron Fenyes <aaron.fenyes@fareycircles.ooo>
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Reviewed-on: #13
Co-authored-by: Vectornaut <vectornaut@nobody@nowhere.net>
Co-committed-by: Vectornaut <vectornaut@nobody@nowhere.net>
2024-10-21 03:18:47 +00:00
c48d685ad6 doc: Extend comments on coordinatization; add a theory.md notes file 2023-11-07 17:06:19 -08:00
15159302c3 doc: Add Aaron's observations on inversive coords 2023-11-06 11:47:53 -08:00
daed435826 doc: Add a few implementation goals to README 2023-11-01 13:08:20 -07:00
2cfcfacb5a doc: Add new notes directory with design notes 2023-11-01 12:58:08 -07:00
Glen Whitney
fce8be5b56 Adjust lighting and camera for decent initial rendering of polyhedra
Note that the version of three.js also incidentally bumped, since it's set
  to take the latest
2019-12-31 07:20:33 -08:00
9c2038e3c9 Enable mouse rotate, pan, and zoom with TrackballControls 2019-12-12 14:04:11 -05:00
c7f2feab1f First pass at coordinate axes 2019-12-12 02:44:33 -05:00
413a8b5b81 Switch to good old make to reduce redundancies in build 2019-12-12 00:33:59 -05:00
2c17758987 0.1.1 2019-12-11 13:21:01 -05:00
6717a76f21 Copy only the production dependencies to the site directory 2019-12-11 13:20:31 -05:00
5fef463aba 0.1.0 2019-12-11 12:43:50 -05:00
c3995d6fcb Set up testing with Ava 2019-12-11 12:07:43 -05:00
eb81cee609 Generate documentation by assembling markdown and litcoffee files 2019-12-09 20:52:42 -05:00
83318c7884 Set up npm run build to build dyna3 2019-12-09 12:08:05 -05:00
660f42b31f Automatically generate externals.js from package-lock.json
This commit adds a utility to parse package-lock.json and write the proper
  contents of externals.js to standard output. In addition, if the utility
  (src/helpers/pkglock_to_externals.litcoffee) is invoked with a --doc option,
  it instead emits a Markdown bulleted list of all of the external dependencies.
2019-12-08 23:22:52 -05:00
fa63ce50ed Establish working stub code (still no build system) 2019-11-24 13:15:44 -05:00
c83019656e Establish package structure and initial technology plan 2019-11-23 15:54:44 -05:00
3192855776 Add a brief initial description 2019-09-14 16:08:37 -04:00
ec10233738 Initial commit 2019-09-14 19:00:59 +00:00