pub fn signed_area(polygon: &[Point2]) -> f64
Signed area via the shoelace formula. Positive for CCW, negative for CW.