feat: Point coordinate regulators #118
1 changed files with 23 additions and 40 deletions
|
@ -308,11 +308,10 @@ impl Element for Point {
|
|||
|
||||
fn default_regulators(self: Rc<Self>) -> Vec<Rc<dyn Regulator>> {
|
||||
all::<Axis>()
|
||||
.map(
|
||||
|axis| Rc::new(
|
||||
PointCoordinateRegulator::new(self.clone(), axis)
|
||||
) as Rc::<dyn Regulator>
|
||||
)
|
||||
.map(|axis| {
|
||||
Rc::new(PointCoordinateRegulator::new(self.clone(), axis))
|
||||
as Rc::<dyn Regulator>
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
|
@ -539,32 +538,19 @@ impl PointCoordinateRegulator {
|
|||
let measurement = subject.representation().map(
|
||||
move |rep| rep[axis as usize]
|
||||
);
|
||||
|
||||
let set_point = create_signal(SpecifiedValue::from_empty_spec());
|
||||
let serial = Self::next_serial();
|
||||
|
||||
Self { subject, axis, measurement, set_point, serial }
|
||||
Self { subject, axis, measurement, set_point, serial: Self::next_serial() }
|
||||
}
|
||||
}
|
||||
|
||||
impl Serial for PointCoordinateRegulator {
|
||||
fn serial(&self) -> u64 {
|
||||
self.serial
|
||||
}
|
||||
fn serial(&self) -> u64 { self.serial }
|
||||
}
|
||||
|
||||
impl Regulator for PointCoordinateRegulator {
|
||||
fn subjects(&self) -> Vec<Rc<dyn Element>> {
|
||||
vec![self.subject.clone()]
|
||||
}
|
||||
|
||||
fn measurement(&self) -> ReadSignal<f64> {
|
||||
self.measurement
|
||||
}
|
||||
|
||||
fn set_point(&self) -> Signal<SpecifiedValue> {
|
||||
self.set_point
|
||||
}
|
||||
fn subjects(&self) -> Vec<Rc<dyn Element>> { vec![self.subject.clone()] }
|
||||
fn measurement(&self) -> ReadSignal<f64> { self.measurement }
|
||||
fn set_point(&self) -> Signal<SpecifiedValue> { self.set_point }
|
||||
}
|
||||
|
||||
impl ProblemPoser for PointCoordinateRegulator {
|
||||
|
@ -572,25 +558,22 @@ impl ProblemPoser for PointCoordinateRegulator {
|
|||
self.set_point.with_untracked(|set_pt| {
|
||||
if let Some(val) = set_pt.value {
|
||||
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);
|
||||
|
||||
// if all three of the subject's spatial coordinates have been
|
||||
// frozen, then freeze its norm component too
|
||||
let mut coords_frozen = [0.0; Axis::CARDINALITY];
|
||||
let mut n_set: usize = 0;
|
||||
// Check if all three spatial coordinates have been frozen, and if so,
|
||||
// freeze the norm component as well
|
||||
let mut coords = [0.0; Axis::CARDINALITY];
|
||||
let mut nset: usize = 0;
|
||||
for &MatrixEntry {index, value} in &(problem.frozen) {
|
||||
let (row_frozen, col_frozen) = index;
|
||||
if col_frozen == col && row_frozen < Axis::CARDINALITY {
|
||||
n_set += 1;
|
||||
coords_frozen[row_frozen] = value
|
||||
if index.1 == col && index.0 < Axis::CARDINALITY {
|
||||
nset += 1;
|
||||
coords[index.0] = value
|
||||
}
|
||||
}
|
||||
if n_set == Axis::CARDINALITY {
|
||||
let [x, y, z] = coords_frozen;
|
||||
let norm = point(x, y, z)[Point::NORM_COMPONENT];
|
||||
problem.frozen.push(Point::NORM_COMPONENT, col, norm);
|
||||
if nset == Axis::CARDINALITY {
|
||||
let [x, y, z] = coords;
|
||||
Vectornaut marked this conversation as resolved
|
||||
problem.frozen.push(
|
||||
Point::NORM_COMPONENT, col, point(x,y,z)[Point::NORM_COMPONENT]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue
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.