chore: corner case fix WIP

This commit is contained in:
2025-12-11 23:17:20 +01:00
parent e10ed8df26
commit 3f5b7b4dc6

View File

@@ -96,39 +96,92 @@ function is_area_red_green(
// - Every surround must form a line // - Every surround must form a line
// old: Every corner needs to be surrounded // old: Every corner needs to be surrounded
// Error 1: 4560365591 // Error 1: 4560365591
// Error 2: 248032161
// Error 3: 4638219675
// NOTE: I do not need to verify every wall, just the opposite corners
// Verify left wall // Verify left wall
// floor.red_tiles.some((tile) => { const ls_cover = floor.red_tiles.some((tile) => {
// // point and side or point and point and the inverse return (tile.x === tl_corner.x && tile.y <= tl_corner.y &&
// }); ((floor.red_tiles.some((tile_2) =>
const l_cover = tile_2.x === tile.x && tile_2.y >= bl_corner.y
floor.red_tiles.some((tile) => )) || (floor.red_tiles.some((tile_3) =>
tile.x <= tl_corner.x && tile.y <= tl_corner.y tile_3.x <= tile.x && tile_3.y >= bl_corner.y &&
) && floor.red_tiles.some((tile) => floor.red_tiles.some((tile_4) =>
tile.x <= bl_corner.x && tile.y >= bl_corner.y tile_3.x <= tile_4.x && tile_3.y === tile_4.y
); )
// r )))) ||
const r_cover = (tile.x === bl_corner.x && tile.y <= bl_corner.y &&
floor.red_tiles.some((tile) => ((floor.red_tiles.some((tile_2) =>
tile.x >= tr_corner.x && tile.y <= tr_corner.y tile_2.x === tile.x && tile_2.y <= tl_corner.y
) && floor.red_tiles.some((tile) => )) || (floor.red_tiles.some((tile_3) =>
tile.x >= br_corner.x && tile.y >= br_corner.y tile_3.x <= tile.x && tile_3.y <= tl_corner.y &&
); floor.red_tiles.some((tile_4) =>
// b tile_3.x <= tile_4.x && tile_3.y === tile_4.y
const b_cover = )
floor.red_tiles.some((tile) => )))); // NOTE: should also compare with opposite situation (first side and then point or 2 sides)
tile.x <= bl_corner.x && tile.y >= bl_corner.y });
) && floor.red_tiles.some((tile) => const rs_cover = floor.red_tiles.some((tile) => {
tile.x >= br_corner.x && tile.y >= br_corner.y return (tile.x === tr_corner.x && tile.y <= tr_corner.y &&
); ((floor.red_tiles.some((tile_2) =>
// t tile_2.x === tile.x && tile_2.y >= br_corner.y
const t_cover = )) || (floor.red_tiles.some((tile_3) =>
floor.red_tiles.some((tile) => tile_3.x <= tile.x && tile_3.y >= br_corner.y &&
tile.x >= tr_corner.x && tile.y <= tr_corner.y floor.red_tiles.some((tile_4) =>
) && floor.red_tiles.some((tile) => tile_3.x <= tile_4.x && tile_3.y === tile_4.y
tile.x <= tl_corner.x && tile.y <= tl_corner.y )
); )))) ||
(tile.x === br_corner.x && tile.y >= br_corner.y &&
((floor.red_tiles.some((tile_2) =>
tile_2.x === tile.x && tile_2.y <= tr_corner.y
)) || (floor.red_tiles.some((tile_3) =>
tile_3.x <= tile.x && tile_3.y <= tr_corner.y &&
floor.red_tiles.some((tile_4) =>
tile_3.x <= tile_4.x && tile_3.y === tile_4.y
)
)))); // NOTE: should also compare with opposite situation (first side and then point)
});
const ts_cover = floor.red_tiles.some((tile) => {
return (tile.x <= tl_corner.x && tile.y === tr_corner.y &&
((floor.red_tiles.some((tile_2) =>
tile_2.x >= tr_corner.x && tile_2.y === tile.y
)) || (floor.red_tiles.some((tile_3) =>
tile_3.x >= tile.x && tile_3.y <= tr_corner.y &&
floor.red_tiles.some((tile_4) =>
tile_3.x === tile_4.x && tile_3.y >= tile_4.y
)
)))) ||
(tile.x >= bl_corner.x && tile.y === br_corner.y &&
((floor.red_tiles.some((tile_2) =>
tile_2.x <= br_corner.x && tile_2.y === tile.y
)) || (floor.red_tiles.some((tile_3) =>
tile_3.x >= tile.x && tile_3.y >= br_corner.y &&
floor.red_tiles.some((tile_4) =>
tile_3.x === tile_4.x && tile_3.y >= tile_4.y
)
)))); // NOTE: should also compare with opposite situation (first side and then point)
});
const bs_cover = floor.red_tiles.some((tile) => {
return (tile.x <= bl_corner.x && tile.y === bl_corner.y &&
((floor.red_tiles.some((tile_2) =>
tile_2.x >= tr_corner.x && tile_2.y === tile.y
)) || (floor.red_tiles.some((tile_3) =>
tile_3.x >= tile.x && tile_3.y >= br_corner.y &&
floor.red_tiles.some((tile_4) =>
tile_3.x === tile_4.x && tile_3.y <= tile_4.y
)
)))) ||
(tile.x >= tr_corner.x && tile.y === tr_corner.y &&
((floor.red_tiles.some((tile_2) =>
tile_2.x <= tl_corner.x && tile_2.y === tile.y
)) || (floor.red_tiles.some((tile_3) =>
tile_3.x >= tile.x && tile_3.y <= tr_corner.y &&
floor.red_tiles.some((tile_4) =>
tile_3.x === tile_4.x && tile_3.y <= tile_4.y
)
)))); // NOTE: should also compare with opposite situation (first side and then point)
});
return l_cover && r_cover && b_cover && t_cover; return ls_cover && rs_cover && ts_cover && bs_cover;
} }
function calc_distance(a: Coordinate, b: Coordinate): number { function calc_distance(a: Coordinate, b: Coordinate): number {