use crate::{Point, point};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FinderPattern {
estimatedModuleSize: f32,
count: usize,
pub(crate) point: Point,
}
impl From<&FinderPattern> for Point {
fn from(value: &FinderPattern) -> Self {
value.point
}
}
impl From<FinderPattern> for Point {
fn from(value: FinderPattern) -> Self {
value.point
}
}
impl FinderPattern {
pub fn new(posX: f32, posY: f32, estimatedModuleSize: f32) -> Self {
Self::private_new(posX, posY, estimatedModuleSize, 1)
}
fn private_new(posX: f32, posY: f32, estimatedModuleSize: f32, count: usize) -> Self {
Self {
estimatedModuleSize,
count,
point: point(posX, posY),
}
}
pub fn getEstimatedModuleSize(&self) -> f32 {
self.estimatedModuleSize
}
pub fn getCount(&self) -> usize {
self.count
}
pub fn aboutEquals(&self, moduleSize: f32, i: f32, j: f32) -> bool {
if (i - self.point.y).abs() <= moduleSize && (j - self.point.x).abs() <= moduleSize {
let moduleSizeDiff = (moduleSize - self.estimatedModuleSize).abs();
moduleSizeDiff <= 1.0 || moduleSizeDiff <= self.estimatedModuleSize
} else {
false
}
}
pub fn combineEstimate(&self, i: f32, j: f32, newModuleSize: f32) -> FinderPattern {
let combinedCount = self.count as f32 + 1.0;
let combinedX = (self.count as f32 * self.point.x + j) / combinedCount;
let combinedY = (self.count as f32 * self.point.y + i) / combinedCount;
let combinedModuleSize =
(self.count as f32 * self.estimatedModuleSize + newModuleSize) / combinedCount;
FinderPattern::private_new(
combinedX,
combinedY,
combinedModuleSize,
combinedCount.round() as usize,
)
}
}