1use crate::{Bearing, CameraPoint, CameraToCamera, Pose, WorldPoint, WorldToCamera};
2
3pub trait TriangulatorObservances {
6 fn triangulate_observances<B: Bearing>(
7 &self,
8 pairs: impl IntoIterator<Item = (WorldToCamera, B)>,
9 ) -> Option<WorldPoint>;
10}
11
12pub trait TriangulatorRelative {
15 fn triangulate_relative<A: Bearing, B: Bearing>(
16 &self,
17 relative_pose: CameraToCamera,
18 a: A,
19 b: B,
20 ) -> Option<CameraPoint>;
21}
22
23impl<T> TriangulatorRelative for T
24where
25 T: TriangulatorObservances,
26{
27 fn triangulate_relative<A: Bearing, B: Bearing>(
28 &self,
29 CameraToCamera(pose): CameraToCamera,
30 a: A,
31 b: B,
32 ) -> Option<CameraPoint> {
33 use core::iter::once;
34
35 self.triangulate_observances(
40 once((WorldToCamera::identity(), a.bearing()))
41 .chain(once((WorldToCamera(pose), b.bearing()))),
42 )
43 .map(|p| CameraPoint(p.0))
44 }
45}