diff --git a/src/common/bit_array.rs b/src/common/bit_array.rs index bb9e95b..26c1851 100644 --- a/src/common/bit_array.rs +++ b/src/common/bit_array.rs @@ -18,6 +18,7 @@ // import java.util.Arrays; +use std::ops::Index; use std::{cmp, fmt}; use crate::common::Result; diff --git a/src/common/cpp_essentials/bitmatrix_cursor_trait.rs b/src/common/cpp_essentials/bitmatrix_cursor_trait.rs index 7ac1d17..4f4205e 100644 --- a/src/common/cpp_essentials/bitmatrix_cursor_trait.rs +++ b/src/common/cpp_essentials/bitmatrix_cursor_trait.rs @@ -1,4 +1,4 @@ -use crate::Point; +use crate::{common::BitMatrix, Point}; use super::{util::opposite, Direction, Value}; @@ -165,6 +165,8 @@ pub trait BitMatrixCursorTrait { fn d(&self) -> Point; + fn img(&self) -> &BitMatrix; + fn readPattern + Default + Copy + Clone>( &mut self, range: Option, diff --git a/src/common/cpp_essentials/edge_tracer.rs b/src/common/cpp_essentials/edge_tracer.rs index e22145d..88a8a3c 100644 --- a/src/common/cpp_essentials/edge_tracer.rs +++ b/src/common/cpp_essentials/edge_tracer.rs @@ -170,6 +170,10 @@ impl BitMatrixCursorTrait for EdgeTracer<'_> { fn d(&self) -> Point { self.d } + + fn img(&self) -> &BitMatrix { + self.img + } } impl<'a> EdgeTracer<'_> { diff --git a/src/common/cpp_essentials/fast_edge_to_edge_counter.rs b/src/common/cpp_essentials/fast_edge_to_edge_counter.rs index 1016c8a..3913f19 100644 --- a/src/common/cpp_essentials/fast_edge_to_edge_counter.rs +++ b/src/common/cpp_essentials/fast_edge_to_edge_counter.rs @@ -1,23 +1,48 @@ +use crate::common::BitArray; + use super::BitMatrixCursorTrait; pub struct FastEdgeToEdgeCounter { // const uint8_t* p = nullptr; // int stride = 0; // int stepsToBorder = 0; - p: usize, - stride: usize, // = 0; - stepsToBorder: usize, // = 0; + p: u32, // = nullptr; + stride: u32, // = 0; + stepsToBorder: u32, // = 0; + arr: BitArray, } impl FastEdgeToEdgeCounter { - pub fn new(_cur: &T) -> Self { - todo!() - // stride = cur.d.y * cur.img->width() + cur.d.x; - // p = cur.img->row(cur.p.y).begin() + cur.p.x; + pub fn new(cur: &T) -> Self { + let stride = cur.d().y as u32 * cur.img().width() as u32 + cur.d().x as u32; + let p = /*cur.img().getRow(cur.p().y).begin()*/ 0 + cur.p().x as u32; - // int maxStepsX = cur.d.x ? (cur.d.x > 0 ? cur.img->width() - 1 - cur.p.x : cur.p.x) : INT_MAX; - // int maxStepsY = cur.d.y ? (cur.d.y > 0 ? cur.img->height() - 1 - cur.p.y : cur.p.y) : INT_MAX; - // stepsToBorder = std::min(maxStepsX, maxStepsY); + let maxStepsX = if cur.d().x != 0.0 { + (if cur.d().x > 0.0 { + cur.img().width() - 1 - cur.p().x as u32 + } else { + cur.p().x as u32 + }) + } else { + u32::MAX + }; + let maxStepsY = if cur.d().y != 0.0 { + (if cur.d().y > 0.0 { + cur.img().height() - 1 - cur.p().y as u32 + } else { + cur.p().y as u32 + }) + } else { + u32::MAX + }; + let stepsToBorder = std::cmp::min(maxStepsX, maxStepsY); + + Self { + p, + stride, + stepsToBorder, + arr: cur.img().getRow(cur.p().y as u32), + } } pub fn stepToNextEdge(&self, _range: i32) -> i32 {