From f8c622b6cd6ba1d02ac799e015532ef9eedc1a16 Mon Sep 17 00:00:00 2001 From: vangel76 Date: Sat, 24 Oct 2026 23:06:47 +0200 Subject: [PATCH] Avoid per-view allocations in camera triangulation Store the two four-element DLT rows in arrays while preserving arithmetic and accumulation order. This removes two heap allocations for every triangulated view. Fixes #2326 --- crates/track/src/camtrack/geometry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/track/src/camtrack/geometry.rs b/crates/track/src/camtrack/geometry.rs index 6956ac2b5..cb3926791 100644 --- a/crates/track/src/camtrack/geometry.rs +++ b/crates/track/src/camtrack/geometry.rs @@ -204,8 +204,8 @@ pub fn triangulate(views: &[(Pose, [f64; 2])]) -> Option { for (p, x) in views { let t = p.t(); let rows = [[p.r[0][0], p.r[0][1], p.r[0][2], t[0]], [p.r[1][0], p.r[1][1], p.r[1][2], t[1]], [p.r[2][0], p.r[2][1], p.r[2][2], t[2]]]; - let a0: Vec = (0..4).map(|j| x[0] * rows[2][j] - rows[0][j]).collect(); - let a1: Vec = (0..4).map(|j| x[1] * rows[2][j] - rows[1][j]).collect(); + let a0 = [0, 1, 2, 3].map(|j| x[0] * rows[2][j] - rows[0][j]); + let a1 = [0, 1, 2, 3].map(|j| x[1] * rows[2][j] - rows[1][j]); for a in [a0, a1] { let nrm = a.iter().map(|v| v * v).sum::().sqrt().max(1e-300); for i in 0..4 {