feat: Point coordinate regulators #118

Merged
Vectornaut merged 9 commits from glen/dyna3:pointCoordRegulators into main 2025-10-13 22:52:03 +00:00
Showing only changes of commit c081f1a809 - Show all commits

View file

@ -305,14 +305,13 @@ impl Element for Point {
point(0.0, 0.0, 0.0), point(0.0, 0.0, 0.0),
) )
} }
fn default_regulators(self: Rc<Self>) -> Vec<Rc<dyn Regulator>> { fn default_regulators(self: Rc<Self>) -> Vec<Rc<dyn Regulator>> {
all::<Axis>() all::<Axis>()
.map( .map(|axis| {
|axis| Rc::new( Rc::new(PointCoordinateRegulator::new(self.clone(), axis))
PointCoordinateRegulator::new(self.clone(), axis) as Rc::<dyn Regulator>
) as Rc::<dyn Regulator> })
)
.collect() .collect()
} }
@ -539,32 +538,19 @@ impl PointCoordinateRegulator {
let measurement = subject.representation().map( let measurement = subject.representation().map(
move |rep| rep[axis as usize] move |rep| rep[axis as usize]
); );
let set_point = create_signal(SpecifiedValue::from_empty_spec()); let set_point = create_signal(SpecifiedValue::from_empty_spec());
let serial = Self::next_serial(); Self { subject, axis, measurement, set_point, serial: Self::next_serial() }
Self { subject, axis, measurement, set_point, serial }
} }
} }
impl Serial for PointCoordinateRegulator { impl Serial for PointCoordinateRegulator {
fn serial(&self) -> u64 { fn serial(&self) -> u64 { self.serial }
self.serial
}
} }
impl Regulator for PointCoordinateRegulator { impl Regulator for PointCoordinateRegulator {
fn subjects(&self) -> Vec<Rc<dyn Element>> { fn subjects(&self) -> Vec<Rc<dyn Element>> { vec![self.subject.clone()] }
vec![self.subject.clone()] fn measurement(&self) -> ReadSignal<f64> { self.measurement }
} fn set_point(&self) -> Signal<SpecifiedValue> { self.set_point }
fn measurement(&self) -> ReadSignal<f64> {
self.measurement
}
fn set_point(&self) -> Signal<SpecifiedValue> {
self.set_point
}
} }
impl ProblemPoser for PointCoordinateRegulator { impl ProblemPoser for PointCoordinateRegulator {
@ -572,25 +558,22 @@ impl ProblemPoser for PointCoordinateRegulator {
self.set_point.with_untracked(|set_pt| { self.set_point.with_untracked(|set_pt| {
if let Some(val) = set_pt.value { if let Some(val) = set_pt.value {
let col = self.subject.column_index().expect( let col = self.subject.column_index().expect(
"Subject should be indexed before point coordinate regulator writes problem data" "Subject must be indexed before point-coordinate regulator poses.");
);
problem.frozen.push(self.axis as usize, col, val); problem.frozen.push(self.axis as usize, col, val);
// Check if all three spatial coordinates have been frozen, and if so,
// if all three of the subject's spatial coordinates have been // freeze the norm component as well
// frozen, then freeze its norm component too let mut coords = [0.0; Axis::CARDINALITY];
let mut coords_frozen = [0.0; Axis::CARDINALITY]; let mut nset: usize = 0;
let mut n_set: usize = 0; for &MatrixEntry {index, value} in &(problem.frozen) {
for &MatrixEntry { index, value } in &(problem.frozen) { if index.1 == col && index.0 < Axis::CARDINALITY {
let (row_frozen, col_frozen) = index; nset += 1;
if col_frozen == col && row_frozen < Axis::CARDINALITY { coords[index.0] = value
n_set += 1;
coords_frozen[row_frozen] = value
} }
} }
if n_set == Axis::CARDINALITY { if nset == Axis::CARDINALITY {
let [x, y, z] = coords_frozen; let [x, y, z] = coords;
Vectornaut marked this conversation as resolved

Flagging the inconsistent bracket formatting for later. Right now, this would be formatted as { index, value } elsewhere, but during review we discussed potentially changing this convention in the future.

Flagging the inconsistent bracket formatting for later. Right now, this would be formatted as `{ index, value }` elsewhere, but during review we discussed potentially changing this convention in the future.

It might shock you to know that I don't actually particularly care whether the braces-on-one-line spacing is uniform. If we both agree not to change them unless we touch a line, we could each just write this one the way we're comfortable writing. It's not like either way is particularly hard to read... Or we could decide to be uniform. It's all cool.

It might shock you to know that I don't actually particularly care whether the braces-on-one-line spacing is uniform. If we both agree not to change them unless we touch a line, we could each just write this one the way we're comfortable writing. It's not like either way is particularly hard to read... Or we could decide to be uniform. It's all cool.
let norm = point(x, y, z)[Point::NORM_COMPONENT]; problem.frozen.push(
problem.frozen.push(Point::NORM_COMPONENT, col, norm); Point::NORM_COMPONENT, col, point(x,y,z)[Point::NORM_COMPONENT]);
} }
} }
}); });