From 48a640605ad496db78723543f953c01586f7dc2d Mon Sep 17 00:00:00 2001 From: Aaron Fenyes Date: Sat, 23 Aug 2025 15:23:20 -0400 Subject: [PATCH] Regulate all the diagonals of the 5-5-4 near miss This should help us find the total distortion of an almost-realization. --- .../src/components/test_assembly_chooser.rs | 87 ++++++++++--------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/app-proto/src/components/test_assembly_chooser.rs b/app-proto/src/components/test_assembly_chooser.rs index f659215..18c122c 100644 --- a/app-proto/src/components/test_assembly_chooser.rs +++ b/app-proto/src/components/test_assembly_chooser.rs @@ -1,5 +1,5 @@ use itertools::izip; -use std::{f64::consts::{FRAC_1_SQRT_2, PI, SQRT_2}, rc::Rc}; +use std::{f64::consts::{FRAC_1_SQRT_2, PI}, rc::Rc}; use nalgebra::Vector3; use sycamore::prelude::*; use web_sys::{console, wasm_bindgen::JsValue}; @@ -882,6 +882,15 @@ fn load_irisawa_hexlet(assembly: &Assembly) { assembly.insert_regulator(Rc::new(outer_moon_tangency)); } +fn regular_diagonals<'a, const N: usize>(vertex_ids: [&'a str; N]) -> Vec<(f64, Vec<[&'a str; 2]>)> { + let ang = PI / (N as f64); + let ang_sin = ang.sin(); + (2..N-1).map(|sep| ( + (sep as f64 * ang).sin() / ang_sin, + (0..N-sep).map(|k| [vertex_ids[k], vertex_ids[k + sep]]).collect() + )).collect() +} + fn load_554a(assembly: &Assembly) { // create the vertices const COLOR_A: ElementColor = [0.75_f32, 0.00_f32, 0.75_f32]; @@ -1090,8 +1099,20 @@ fn load_554a(assembly: &Assembly) { } // fix the distances between adjacent vertices - let square_in_octagon = (2.0 + SQRT_2).sqrt(); - let struts = [ + let f_a = ["a_SE", "a_SW", "a_NW", "a_NE"]; + let f_abc_n = ["a_NW", "b_NW", "c_N", "b_NE", "a_NE"]; + let f_abc_w = ["a_SW", "b_SW", "c_W", "b_NW", "a_NW"]; + let f_abc_s = ["a_SE", "b_SE", "c_S", "b_SW", "a_SW"]; + let f_abc_e = ["a_NE", "b_NE", "c_E", "b_SE", "a_SE"]; + let f_bcd_ne = ["b_NE", "c_N", "d_NE", "c_E"]; + let f_bcd_nw = ["b_NW", "c_W", "d_NW", "c_N"]; + let f_bcd_sw = ["b_SW", "c_S", "d_SW", "c_W"]; + let f_bcd_se = ["b_SE", "c_E", "d_SE", "c_S"]; + let f_g = [ + "g_NNE", "g_NNW", "g_WNW", "g_WSW", + "g_SSW", "g_SSE", "g_ESE", "g_ENE", + ]; + let struts: Vec<_> = [ (1.0, vec![ ["a_NE", "a_NW"], ["a_NW", "a_SW"], @@ -1166,34 +1187,18 @@ fn load_554a(assembly: &Assembly) { ["g_ESE", "g_ENE"], ["g_ENE", "g_NNE"], ]), - (SQRT_2, vec![ - ["a_NE", "a_SW"], - ["a_NW", "a_SE"], - ["b_NE", "d_NE"], - ["b_NW", "d_NW"], - ["b_SW", "d_SW"], - ["b_SE", "d_SE"], - ]), - (0.5*(1.0 + 5.0_f64.sqrt()), vec![ - ["a_NE", "c_N"], - ["a_NW", "c_N"], - ["a_NW", "c_W"], - ["a_SW", "c_W"], - ["a_SW", "c_S"], - ["a_SE", "c_S"], - ["a_SE", "c_E"], - ["a_NE", "c_E"], - ]), - (square_in_octagon, vec![ - ["g_NNE", "g_WNW"], - ["g_WNW", "g_SSW"], - ["g_SSW", "g_ESE"], - ["g_ESE", "g_NNE"], - ]), - (SQRT_2 * square_in_octagon, vec![ - ["g_NNE", "g_SSW"], - ]), - ]; + ].into_iter() + .chain(regular_diagonals(f_a)) + .chain(regular_diagonals(f_bcd_ne)) + .chain(regular_diagonals(f_bcd_nw)) + .chain(regular_diagonals(f_bcd_sw)) + .chain(regular_diagonals(f_bcd_se)) + .chain(regular_diagonals(f_abc_n)) + .chain(regular_diagonals(f_abc_w)) + .chain(regular_diagonals(f_abc_s)) + .chain(regular_diagonals(f_abc_e)) + .chain(regular_diagonals(f_g)) + .collect(); for (length, vertex_pairs) in struts { let inv_dist = Some(-0.5 * length * length); for pair in vertex_pairs { @@ -1279,16 +1284,16 @@ fn load_554a(assembly: &Assembly) { // make the faces planar and make them pass through their vertices let face_incidences = [ - ("f_a", vec!["a_NE", "a_NW", "a_SW", "a_SE"]), - ("f_abc_N", vec!["a_NE", "a_NW", "b_NE", "b_NW", "c_N"]), - ("f_abc_W", vec!["a_NW", "a_SW", "b_NW", "b_SW", "c_W"]), - ("f_abc_S", vec!["a_SW", "a_SE", "b_SW", "b_SE", "c_S"]), - ("f_abc_E", vec!["a_SE", "a_NE", "b_SE", "b_NE", "c_E"]), - ("f_bcd_NE", vec!["b_NE", "c_N", "c_E", "d_NE"]), - ("f_bcd_NW", vec!["b_NW", "c_N", "c_W", "d_NW"]), - ("f_bcd_SW", vec!["b_SW", "c_S", "c_W", "d_SW"]), - ("f_bcd_SE", vec!["b_SE", "c_S", "c_E", "d_SE"]), - ("f_g", vec!["g_NNE", "g_NNW", "g_WNW", "g_WSW", "g_SSW", "g_SSE", "g_ESE", "g_ENE"]), + ("f_a", Vec::from(f_a)), + ("f_abc_N", Vec::from(f_abc_n)), + ("f_abc_W", Vec::from(f_abc_w)), + ("f_abc_S", Vec::from(f_abc_s)), + ("f_abc_E", Vec::from(f_abc_e)), + ("f_bcd_NE", Vec::from(f_bcd_ne)), + ("f_bcd_NW", Vec::from(f_bcd_nw)), + ("f_bcd_SW", Vec::from(f_bcd_sw)), + ("f_bcd_SE", Vec::from(f_bcd_se)), + ("f_g", Vec::from(f_g)), ]; for (face_id, vertex_ids) in face_incidences { // make the face planar