"""[확인]을 여러 번 눌러도 선이 깎이지 않는지 — 노드 왕복이 제자리인가. 왜 (2026-09-07 보조 창 실측) — 같은 노선으로 [확인]을 되풀이했더니 계획노선 정점이 136 → 134 → 119, 노드가 22 → 21 로 계속 줄었다. 원인은 **이미 폴리라인인 것을 다시 단순화**한 것. 원호 위 점이 섞인 선을 단순화하면 꺾임점이 조금씩 지워지고, 그 결과로 만든 선을 또 단순화하기 때문이다. 단순화는 **원본 점군에서 한 번만** 돌아야 한다. """ import math from common_util.common_util_route_polyline import build_planned_polyline RADIUS = 15.0 def _zigzag() -> list[tuple[float, float]]: """꺾임이 뚜렷한 원본 점군 — 3m 간격으로 조밀하게 찍은 지그재그.""" corners = [(0.0, 0.0), (120.0, 0.0), (120.0, 120.0), (260.0, 120.0), (260.0, 240.0)] points: list[tuple[float, float]] = [] for start, end in zip(corners, corners[1:]): length = math.dist(start, end) steps = max(2, int(length // 3)) for step in range(steps): ratio = step / steps points.append( (start[0] + (end[0] - start[0]) * ratio, start[1] + (end[1] - start[1]) * ratio) ) points.append(corners[-1]) return points def test_노드를_다시_넣으면_같은_선이_나온다(): """사용자가 아무것도 안 옮기고 [확인]만 눌렀을 때 = 노드 그대로 왕복.""" first = build_planned_polyline(_zigzag(), min_radius_m=RADIUS) nodes = [(node.x, node.y) for node in first.nodes] second = build_planned_polyline(nodes, min_radius_m=RADIUS, simplify=False) assert [(n.x, n.y) for n in second.nodes] == nodes assert second.vertices == first.vertices assert second.curve_count == first.curve_count third = build_planned_polyline( [(node.x, node.y) for node in second.nodes], min_radius_m=RADIUS, simplify=False ) assert third.vertices == first.vertices, "세 번째 왕복에서 선이 달라짐" def test_옛_방식은_실제로_깎인다(): """왜 갈래가 필요한지 못박는다 — 폴리라인을 다시 단순화하면 노드가 준다.""" first = build_planned_polyline(_zigzag(), min_radius_m=RADIUS) # 옛 방식: 폴리라인 정점(원호 포함)을 통째로 다시 단순화 again = build_planned_polyline(first.vertices, min_radius_m=RADIUS) assert len(again.nodes) != len(first.nodes) or again.vertices != first.vertices