ajusted line drawing from an array of u8 to array of bool.

This commit is contained in:
Gabe Venberg 2025-07-11 12:00:34 +02:00
parent 45578958a6
commit 3471b71dbc
2 changed files with 81 additions and 81 deletions

View file

@ -17,7 +17,7 @@ fn heading_to_line(heading: Heading, square_size: usize) -> Line {
// draws a line always pointing towards heading 0 // draws a line always pointing towards heading 0
pub fn draw_constant_heading<const X: usize, const Y: usize>( pub fn draw_constant_heading<const X: usize, const Y: usize>(
heading: Heading, heading: Heading,
matrix: &mut FourQuadrantMatrix<{ X }, { Y }, u8>, matrix: &mut FourQuadrantMatrix<{ X }, { Y }, bool>,
) { ) {
draw_line::<X, Y>(&heading_to_line(heading, X.min(Y)), matrix); draw_line::<X, Y>(&heading_to_line(heading, X.min(Y)), matrix);
} }

View file

@ -148,7 +148,7 @@ pub struct Line(pub Point, pub Point);
/// extend past its edges. /// extend past its edges.
pub fn draw_line<const X: usize, const Y: usize>( pub fn draw_line<const X: usize, const Y: usize>(
line: &Line, line: &Line,
matrix: &mut FourQuadrantMatrix<{ X }, { Y }, u8>, matrix: &mut FourQuadrantMatrix<{ X }, { Y }, bool>,
) { ) {
let mut line = *line; let mut line = *line;
#[cfg(test)] #[cfg(test)]
@ -201,7 +201,7 @@ pub fn draw_line<const X: usize, const Y: usize>(
dbg!(draw_point); dbg!(draw_point);
if matrix.is_in_bounds(&draw_point) { if matrix.is_in_bounds(&draw_point) {
matrix[draw_point] = 1; matrix[draw_point] = true;
prev_out_of_bounds = false; prev_out_of_bounds = false;
} else { } else {
if !prev_out_of_bounds { if !prev_out_of_bounds {
@ -249,195 +249,195 @@ mod tests {
#[test] #[test]
fn four_quadrant_matrix() { fn four_quadrant_matrix() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
canvas[Point { x: 0, y: 0 }] = 1; canvas[Point { x: 0, y: 0 }] = true;
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
] ]
); );
canvas[Point { x: -2, y: 1 }] = 1; canvas[Point { x: -2, y: 1 }] = true;
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 0], [false, false, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 0, 0, 0] [false, false, false, false, false]
] ]
); );
} }
#[test] #[test]
fn diagonal_unsigned_line() { fn diagonal_unsigned_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 0, y: 4 }); FourQuadrantMatrix::new(UPoint { x: 0, y: 4 });
draw_line( draw_line(
&Line(Point { x: 0, y: 0 }, Point { x: 4, y: 4 }), &Line(Point { x: 0, y: 0 }, Point { x: 4, y: 4 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 1], [false, false, false, false, true],
[0, 0, 0, 1, 0], [false, false, false, true, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 1, 0, 0, 0], [false, true, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
] ]
) )
} }
#[test] #[test]
fn diagonal_signed_line() { fn diagonal_signed_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: -2, y: -2 }, Point { x: 2, y: 2 }), &Line(Point { x: -2, y: -2 }, Point { x: 2, y: 2 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 1], [false, false, false, false, true],
[0, 0, 0, 1, 0], [false, false, false, true, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 1, 0, 0, 0], [false, true, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
] ]
) )
} }
#[test] #[test]
fn diagonal_signed_both_oob_line() { fn diagonal_signed_both_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: -10, y: -10 }, Point { x: 10, y: 10 }), &Line(Point { x: -10, y: -10 }, Point { x: 10, y: 10 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 1], [false, false, false, false, true],
[0, 0, 0, 1, 0], [false, false, false, true, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 1, 0, 0, 0], [false, true, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
] ]
); );
} }
#[test] #[test]
fn diagonal_signed_first_oob_line() { fn diagonal_signed_first_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: -10, y: -10 }, Point { x: 2, y: 2 }), &Line(Point { x: -10, y: -10 }, Point { x: 2, y: 2 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 1], [false, false, false, false, true],
[0, 0, 0, 1, 0], [false, false, false, true, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 1, 0, 0, 0], [false, true, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
] ]
); );
} }
#[test] #[test]
fn diagonal_signed_second_oob_line() { fn diagonal_signed_second_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: -2, y: -2 }, Point { x: 10, y: 10 }), &Line(Point { x: -2, y: -2 }, Point { x: 10, y: 10 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 1], [false, false, false, false, true],
[0, 0, 0, 1, 0], [false, false, false, true, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 1, 0, 0, 0], [false, true, false, false, false],
[1, 0, 0, 0, 0], [true, false, false, false, false],
] ]
); );
} }
#[test] #[test]
fn vertical_signed_both_oob_line() { fn vertical_signed_both_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: 0, y: -10 }, Point { x: 0, y: 10 }), &Line(Point { x: 0, y: -10 }, Point { x: 0, y: 10 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
] ]
); );
} }
#[test] #[test]
fn vertical_signed_first_oob_line() { fn vertical_signed_first_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: 0, y: -10 }, Point { x: 0, y: 0 }), &Line(Point { x: 0, y: -10 }, Point { x: 0, y: 0 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
] ]
); );
} }
#[test] #[test]
fn vertical_signed_second_oob_line() { fn vertical_signed_second_oob_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: 0, y: 0 }, Point { x: 0, y: 10 }), &Line(Point { x: 0, y: 0 }, Point { x: 0, y: 10 }),
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
[0, 0, 0, 0, 0], [false, false, false, false, false],
] ]
); );
} }
#[test] #[test]
fn cross_signed_line() { fn cross_signed_line() {
let mut canvas: FourQuadrantMatrix<5, 5, u8> = let mut canvas: FourQuadrantMatrix<5, 5, bool> =
FourQuadrantMatrix::new(UPoint { x: 2, y: 2 }); FourQuadrantMatrix::new(UPoint { x: 2, y: 2 });
draw_line( draw_line(
&Line(Point { x: 0, y: -2 }, Point { x: 0, y: 2 }), &Line(Point { x: 0, y: -2 }, Point { x: 0, y: 2 }),
@ -448,13 +448,13 @@ mod tests {
&mut canvas, &mut canvas,
); );
assert_eq!( assert_eq!(
<FourQuadrantMatrix<5, 5, u8> as Into<[[u8; 5]; 5]>>::into(canvas), <FourQuadrantMatrix<5, 5, bool> as Into<[[bool; 5]; 5]>>::into(canvas),
[ [
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[1, 1, 1, 1, 1], [true, true, true, true, true],
[0, 0, 1, 0, 0], [false, false, true, false, false],
[0, 0, 1, 0, 0], [false, false, true, false, false],
] ]
) )
} }