This makes it simpler, from the programmer's perspective, to get the
name of an axis as a string slice and to format an axis name into a
string. To me, the matching method `Axis::name` seems more direct than
the explicit lookup table that it replaces, and I'm hoping that it will
be about as easy for the compiler to inline, or even easier.
Implementing `Display` enables us to hand an `Axis` to a string
formatter without any explicit conversion. It adds extra code in the
short run, but I'd expect it to simplify our code in the long run by
fitting into the conventions set by the Rust standard library.
Implements regulators for the Euclidean coordinates of Point entities,
automatically creating all three of them for each added point entity. When
such a regulator is set, it freezes the corresponding representation
coordinate to the set point. In addition, if all three coordinates of a
given Point are set, the coradius coordinate (which holds the norm of the
point) is frozen as well.
Note that a PointCoordinateRegulator must be created with a Point as the
subject. This commit modifies HalfCurvatureRegulator analogously, so that
it can only be created with a Sphere.
A couple of prospective issues that should be filed in association with
this commit:
* The new coordinate regulators create redundant display information with
the raw representation coordinates of a point that are already shown in
the outline view.
* The optimization status of these regulators together with HalfCurvature
regulators (i.e., the ones implemented by freezing coordinates) is different
from InversiveDistance regulators when an Assembly is unrealizable: the
frozen-coordinate constraints will be "hard" in that they will be forced
to precisely equal their set point, whereas the distance regulators are
"soft" in that they can be relaxed from their set points in an effort to
minimize the loss function of the configuration as compared to the values
of the constraints. Perhaps at some point we should/will have a mechanism
to specify the softness/hardness of constraints, but in the meantime,
there should not be two different categories of constraints. Suppose we
decide that by default that all constraints are soft. Then the optimizer
should be able to search changing, for example, the radius of a
curvature-constrained sphere, so as to minimize the loss function (for a
loss that would therefore presumably have a term akin to the square of the
difference between the specified and actual half-curvature of the sphere).
For example, suppose you specify that the half-curvature of a sphere is 1
(so it has radius 1/2) but that its distance to a point is -1. These
constraints cannot be satisfied, so the optimization fails, presumably
with the point at the sphere center, and the sphere with radius 1/2.
So all of the loss is concentrated in the difference between the actual
point-sphere distance being -1/2, not -1. It would be more appropriate
(in the all-soft constraint regime) to end up at something like a sphere of
half-curvature 1/√2 with the point at the center, so that the loss is split
between both the half-curvature and the distance to the sphere being off by
1 - 1/√2. (At a guess, that would minimize the sum of the squares of the
two differences.)
Primarily, switch to using trailing commas. Also uniformizes commas with respect to switch branches, makes function call layout more consistent, line breaking more consistent, alphabetizes imports, uses the field init shorthand when possible, etc.
Resolves#99.
Co-authored-by: Aaron Fenyes <aaron.fenyes@fareycircles.ooo>
Reviewed-on: #108
Co-authored-by: Vectornaut <vectornaut@nobody@nowhere.net>
Co-committed-by: Vectornaut <vectornaut@nobody@nowhere.net>
This PR helps probe the capabilities of the engine.
Also adjusts the realization triggering system to reduce redundant realizations as we set an assembly's regulators during loading. Specificially, consolidates all calls to `realize()` into a single effect, which is triggered by the `needs_realization` signal.
Also introduces a `keep_realized` signal and use it to pause realization while loading assemblies, but this signal is planned for removal as ultimately we do not want a separate "mode" of interpreting commands during loading, for maximal reproducibility of results (and simplicity of system).
Co-authored-by: Aaron Fenyes <aaron.fenyes@fareycircles.ooo>
Reviewed-on: #103
Co-authored-by: Vectornaut <vectornaut@nobody@nowhere.net>
Co-committed-by: Vectornaut <vectornaut@nobody@nowhere.net>