"""python -m geometry observations.json [-o result.json]""" import argparse import json from dataclasses import replace from math import isfinite from pathlib import Path from .localization import Measurement, solve def main(): parser = argparse.ArgumentParser(description="B题问题一:角域交、直径与包围圆") parser.add_argument("input", type=Path, help="包含measurements数组的JSON文件") parser.add_argument("-o", "--output", type=Path) parser.add_argument("--rounding-margin-deg", type=float, default=0, help="额外误差半角,默认0;可显式设0.005进行舍入敏感性分析") args = parser.parse_args() try: source = json.loads(args.input.read_text(encoding="utf-8-sig")) measurements = [Measurement(**row) for row in source["measurements"]] if not isfinite(args.rounding_margin_deg) or args.rounding_margin_deg < 0: raise ValueError("额外误差半角必须为有限非负数") measurements = [replace(m, half_angle_deg=m.half_angle_deg+args.rounding_margin_deg) for m in measurements] result = solve(measurements) result["error_policy"] = {"additional_half_angle_deg": args.rounding_margin_deg, "effective_half_angles_deg": [m.half_angle_deg for m in measurements]} except (ValueError, TypeError, KeyError, OSError) as exc: parser.error(str(exc)) text = json.dumps(result, ensure_ascii=False, indent=2, allow_nan=False) if args.output: args.output.parent.mkdir(parents=True, exist_ok=True) args.output.write_text(text + "\n", encoding="utf-8") print(text) if __name__ == "__main__": main()