Add implementation to detect adjacent cell positions to CellDir
This commit is contained in:
parent
cce6f3fc91
commit
f134ba102c
1 changed files with 36 additions and 0 deletions
|
@ -91,4 +91,40 @@ impl CellDir {
|
||||||
_ => (0, 0),
|
_ => (0, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If it returns 0 they are not adjacent,
|
||||||
|
/// if it returns 1 the data flow direction is pos_a => pos_b
|
||||||
|
/// if it returns -1 the data flow direction is pos_b => pos_a
|
||||||
|
pub fn are_adjacent(pos_a: (usize, usize), pos_b: (usize, usize)) -> Option<CellDir> {
|
||||||
|
let ipos_a = (pos_a.0 as i32, pos_a.1 as i32);
|
||||||
|
let ipos_b = (pos_b.0 as i32, pos_b.1 as i32);
|
||||||
|
|
||||||
|
let (ox, oy) = CellDir::T.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::T);
|
||||||
|
}
|
||||||
|
let (ox, oy) = CellDir::TL.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::TL);
|
||||||
|
}
|
||||||
|
let (ox, oy) = CellDir::BL.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::BL);
|
||||||
|
}
|
||||||
|
|
||||||
|
let (ox, oy) = CellDir::TR.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::TR);
|
||||||
|
}
|
||||||
|
let (ox, oy) = CellDir::BR.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::BR);
|
||||||
|
}
|
||||||
|
let (ox, oy) = CellDir::B.as_offs(pos_a.0);
|
||||||
|
if ipos_b == (ipos_a.0 + ox, ipos_a.1 + oy) {
|
||||||
|
return Some(CellDir::B);
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue