39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
"""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()
|