# Task 2: Geometry **Depends on:** Task 1 ## Context Files - `.dev/2026-05-28-procgen-map-core/spec/design.md` — §4.1 (geometry). - `reikhelm-core/src/lib.rs` — append the module declaration here. ## Files - Create: `reikhelm-core/src/geometry.rs` — `Point`, `Rect`, `Line`. - Modify: `reikhelm-core/src/lib.rs` — append `pub mod geometry;`. ## What to Build Integer grid-coordinate geometry types (spec §4.1). All types derive `Clone, Copy, Debug, PartialEq, Eq` and `serde::{Serialize, Deserialize}`. These are the foundation reused by the grid, regions, and every pass — keep them small and total (no panics on valid input). ## Interface Dependencies - **Produces:** - `Point { x: i32, y: i32 }` — `new`, `manhattan(&self, other: Point) -> i32`, and offset helpers for the four/eight neighbor directions. - `Rect { x: i32, y: i32, w: i32, h: i32 }` — `new`, `center() -> Point`, `contains(Point) -> bool`, `intersects(&Rect) -> bool`, `inflate(by: i32) -> Rect`, `iter() -> impl Iterator` (all contained cells). - `Line { from: Point, to: Point }` — `cells() -> impl Iterator` yielding the grid cells along the segment (a straight horizontal/vertical run is sufficient for v1 corridors; document the behavior). ## Tests - `Rect::contains` is true for corners/interior and false just outside. - `Rect::intersects` is symmetric; true for overlap, false for adjacent-but-disjoint rects. - `Rect::iter` yields exactly `w * h` distinct points, all contained. - `Rect::center` returns an interior point. - `Point::manhattan` is correct and symmetric. - `Line::cells` yields a contiguous run from `from` to `to` inclusive for a horizontal and a vertical line. ## Success Criteria - [ ] All listed types and methods exist with the signatures above and derive serde. - [ ] `pub mod geometry;` added to `lib.rs`. - [ ] All tests pass: `cargo test -p reikhelm-core geometry` ## Commit `"feat(core): geometry primitives (Point, Rect, Line)"`