forked from StudioInfinity/dyna3
Move half-curvature change routine into engine
This routine is implemented in a very representation-specific way, so the engine seems like the best place for it.
This commit is contained in:
parent
e1952d7d52
commit
4654bf06bf
2 changed files with 38 additions and 31 deletions
|
@ -8,6 +8,7 @@ use web_sys::{console, wasm_bindgen::JsValue}; /* DEBUG */
|
||||||
use crate::{
|
use crate::{
|
||||||
engine::{
|
engine::{
|
||||||
Q,
|
Q,
|
||||||
|
change_half_curvature,
|
||||||
local_unif_to_std,
|
local_unif_to_std,
|
||||||
realize_gram,
|
realize_gram,
|
||||||
sphere,
|
sphere,
|
||||||
|
@ -401,37 +402,9 @@ impl Assembly {
|
||||||
let representation = self_for_effect.elements.with_untracked(
|
let representation = self_for_effect.elements.with_untracked(
|
||||||
|elts| elts[subject].representation
|
|elts| elts[subject].representation
|
||||||
);
|
);
|
||||||
representation.update(|rep| {
|
representation.update(
|
||||||
// set the sphere's half-curvature to the desired value
|
|rep| change_half_curvature(rep, half_curv)
|
||||||
rep[3] = half_curv;
|
);
|
||||||
|
|
||||||
// restore normalization by contracting toward the curvature
|
|
||||||
// axis
|
|
||||||
const SIZE_THRESHOLD: f64 = 1e-9;
|
|
||||||
let half_q_lt = -2.0 * half_curv * rep[4];
|
|
||||||
let half_q_lt_sq = half_q_lt * half_q_lt;
|
|
||||||
let mut spatial = rep.fixed_rows_mut::<3>(0);
|
|
||||||
let q_sp = spatial.norm_squared();
|
|
||||||
if q_sp < SIZE_THRESHOLD && half_q_lt_sq < SIZE_THRESHOLD {
|
|
||||||
spatial.copy_from_slice(
|
|
||||||
&[0.0, 0.0, (1.0 - 2.0 * half_q_lt).sqrt()]
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
let scaling = half_q_lt + (q_sp + half_q_lt_sq).sqrt();
|
|
||||||
spatial.scale_mut(1.0 / scaling);
|
|
||||||
rep[4] /= scaling;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DEBUG */
|
|
||||||
// verify normalization
|
|
||||||
let rep_for_debug = rep.clone();
|
|
||||||
console::log_1(&JsValue::from(
|
|
||||||
format!(
|
|
||||||
"Sphere self-product after curvature change: {}",
|
|
||||||
rep_for_debug.dot(&(&*Q * &rep_for_debug))
|
|
||||||
)
|
|
||||||
));
|
|
||||||
});
|
|
||||||
self_for_effect.realize();
|
self_for_effect.realize();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -35,6 +35,40 @@ pub fn sphere_with_offset(dir_x: f64, dir_y: f64, dir_z: f64, off: f64, curv: f6
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// given a sphere's representation vector, change the sphere's half-curvature to
|
||||||
|
// `half-curv` and then restore normalization by contracting the representation
|
||||||
|
// vector toward the curvature axis
|
||||||
|
pub fn change_half_curvature(rep: &mut DVector<f64>, half_curv: f64) {
|
||||||
|
// set the sphere's half-curvature to the desired value
|
||||||
|
rep[3] = half_curv;
|
||||||
|
|
||||||
|
// restore normalization by contracting toward the curvature axis
|
||||||
|
const SIZE_THRESHOLD: f64 = 1e-9;
|
||||||
|
let half_q_lt = -2.0 * half_curv * rep[4];
|
||||||
|
let half_q_lt_sq = half_q_lt * half_q_lt;
|
||||||
|
let mut spatial = rep.fixed_rows_mut::<3>(0);
|
||||||
|
let q_sp = spatial.norm_squared();
|
||||||
|
if q_sp < SIZE_THRESHOLD && half_q_lt_sq < SIZE_THRESHOLD {
|
||||||
|
spatial.copy_from_slice(
|
||||||
|
&[0.0, 0.0, (1.0 - 2.0 * half_q_lt).sqrt()]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
let scaling = half_q_lt + (q_sp + half_q_lt_sq).sqrt();
|
||||||
|
spatial.scale_mut(1.0 / scaling);
|
||||||
|
rep[4] /= scaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* DEBUG */
|
||||||
|
// verify normalization
|
||||||
|
let rep_for_debug = rep.clone();
|
||||||
|
console::log_1(&JsValue::from(
|
||||||
|
format!(
|
||||||
|
"Sphere self-product after curvature change: {}",
|
||||||
|
rep_for_debug.dot(&(&*Q * &rep_for_debug))
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// --- partial matrices ---
|
// --- partial matrices ---
|
||||||
|
|
||||||
pub struct MatrixEntry {
|
pub struct MatrixEntry {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue